while read line 代码中调用 ssh 文件重定向问题.

需要队部分主机做批量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    </dev/null 都行了. 


那么代码修改为  : 

while  read line 
do
  xxxxxx 数据清洗. 

ssh   $line    $COMMAND   </dev/null  

或者 ssh  -n  $line  $COMMAND  

done


那么这个问题的本质原因是什么呢? 


相信大家 可能都已经忘记了.  


< linux  环境 高级编程 >  里面讲的很清楚了. 

子进程 继承了父进程的 环境变量,  文件描述符等等.     所以这个问题的本质就是  子进程 继承了父进程的文件描述符, 然后把父进程的文件给读完了. 导致父进程没有东西读. 


其实 while  do read line  中如果调用  其他的 从stdin 读取命令 都会有这个问题. 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-2136798/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-2136798/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值