shell脚本执行冲突事件-ssh&while

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本执行冲突事件-ssh&while相关的知识,希望对你有一定的参考价值。

今天发现一个问题:

先看下脚本内容:
[email protected]/0 # cat !$
cat /tmp/test_nginx
ls *.txt | tr ‘ ‘ ‘\n‘ | while read line
do 
echo $line
if [ ‘yes‘ == ‘yes‘ ]
then
ssh  192.168.109.10 "echo ‘yes‘"
else
ssh 192.168.109.10 "echo ‘no‘"
fi
done

上面脚本很简单,读取当前目录的所有以txt结尾的文件(实际上我只是取得循环次数),但我们
运行脚本会发现脚本只循环一次就退出了。效果如下:

[email protected]/0 # bash -x /tmp/test_nginx       
+ tr ‘ ‘ ‘\n‘
+ ls 1.txt 2.txt ip.txt png.txt       
+ read line
+ echo 1.txt
1.txt
+ ‘[‘ yes == yes ‘]‘
+ ssh 192.168.9.10 ‘echo ‘\‘‘yes‘\‘‘‘
yes
+ read line


此时恭喜你,你如愿接触到ssh 和while 冲突事件了!

办法始终比较问题多。
解决办法很简单:

方法一:

  ssh  192.168.109.10 "echo ‘yes‘"  
  改为  ssh  192.168.109.10 "echo ‘yes‘"  < /dev/null
  
方法二:
  ssh  192.168.109.10 "echo ‘yes‘"  
  改为  ssh  -n 192.168.109.10 "echo ‘yes‘" 
  
  
产生的原因:
ssh 命令将while未执行的循环给读取了,下面内容可以帮助你理解。

[email protected]/0 # bash -x /tmp/test_nginx 
+ ls 1.txt 2.txt ip.txt png.txt
+ tr ‘ ‘ ‘\n‘
+ read line
+ echo 1.txt
1.txt
+ ‘[‘ yes == yes ‘]‘
+ ssh 192.168.9.10 cat     //我们将命令改成cat,就会发现了。
2.txt
ip.txt
png.txt
+ read line


本文出自 “linux系统维护” 博客,请务必保留此出处http://linuxadmin.blog.51cto.com/2683824/1885184

以上是关于shell脚本执行冲突事件-ssh&while的主要内容,如果未能解决你的问题,请参考以下文章

本地shell脚本中ssh到远程服务器并执行命令

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

java连接ssh执行shell脚本

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

怎么在一个shell脚本中执行远程主机的另一个shell脚本?? ssh已经可以无密码登录了。

编写一个shell脚本ssh到远程机器并执行命令