十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关while read line 代码中调用ssh文件重定向的问题分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
我们提供的服务有:成都做网站、网站设计、微信公众号开发、网站优化、网站认证、吉州ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的吉州网站制作公司需要队部分主机做批量ssh 上去做远程检测.
代码就很简单.
while read line
do
xxxxxx 数据清洗.
ssh $line $COMMAND
done
代码本身没有什么问题. 很简单.
但是在执行的时候, 出问题了.
ssh 只能执行第一个 ip 地址,然后就退出了. 退出状态也是正常的. 说明没有报错.
问题出在哪里呢?
经过一番搜索 google .
原来是 原来 while read line 会吧内容全部读到缓存里面.
然后内 ssh 是从stdin 里取数据.
最后就导致了 ssh 第一个ip 以后, 顺便把 read line 剩下的内容都给读取完了.
read line 第二次读取的时候, 已经没东西可以读了, 到了文件末尾 EOF 里, 自然就 退出了. 这也验证了,我们的代码是正常退出没有报错.
怎么办呢, 对ssh 进行重定向, 阻止从stdin 读取.
ssh 的参数 -n 或者 -f 或者 -n-f 都可以重定向. 或者 ssh
那么代码修改为 :
while read line
do
xxxxxx 数据清洗.
ssh $line $COMMAND
或者 ssh -n $line $COMMAND
done
那么这个问题的本质原因是什么呢?
相信大家 可能都已经忘记了.
< linux 环境 高级编程 > 里面讲的很清楚了.
子进程 继承了父进程的 环境变量, 文件描述符等等. 所以这个问题的本质就是 子进程 继承了父进程的文件描述符, 然后把父进程的文件给读完了. 导致父进程没有东西读.
其实 while do read line 中如果调用 其他的 从stdin 读取命令 都会有这个问题.
关于while read line 代码中调用ssh文件重定向的问题分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。