shell中使用while循环ssh的注意事项

需要读取一个文本,次文本每一行包含一个IP在while循环中使用ssh,但ssh完第一行后就退出了,如何避免自动读取一行就跳出while循环,此文将详细解释其原因。 
 
    最近在写一个自动更新的shell,可是发现如果在使用while循环从一个文件中读取ip地址,然后访问就只能读取第一行纪录。代码如下:

while read LINE do echo *******************************************$LINE ssh 192.168.10.233 ls done < data 

但是如果使用for就没有这个问题,非常的奇怪,for的代码如下:

for LINE in `cat data` do echo *******************************************$LINE ssh 192.168.10.233 ls done 

难道for和while竟然有这么大的差别,不可能吧。经过一番试验以后发现,原来并不是while的for的差别,而是while中使用重定向机制,data文件中的信息都已经读入并重定向给了整个while语句。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西,下面这个shell能很好的说明这个问题:

while read LINE do echo *******************************************$LINE ssh 192.168.10.233 cat done < data 

执行这个shell就会发现,ssh中的cat语句会打印出data文件中的其他纪录,这就导致调用玩ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候当然也就读不到纪录,循环也就退出了。改进方法是,将ssh的输入重定向输入:

while read LINE do echo *******************************************$LINE ssh 192.168.10.233 ls < /dev/null done < data 

这样,在while语句中也能顺利的执行ssh语句了。linux的重定向还真复杂。

参考博文:http://leeon.me/a/shell-while-ssh

时间: 2024-10-06 05:37:39

shell中使用while循环ssh的注意事项的相关文章

shell中使用while循环ssh时只循环第一行的问题解决

最近在写一个shell脚本,本想使用for循环来读取文件里面的内容,可是发现文件里每一行都有空格的,明显用for循环行不通过,我的目的是想一行一行读取文件内容,于是果断使用while循环来实现,可问题来了,当ssh完第一行后就退出了,后面都没有执行成功,如何避免自动读取一行就跳出while循环,此文将详细解释其原因. 文件内容如下:[[email protected]_hai~]#cat 2.txt scjz 2144 10.16.100.113  89scjz 2144 10.16.100.1

shell中使用while循环ssh读取一行纪录

cat 33.txt |while read LINE do   result=`ssh -n [email protected] date`   echo $result done -n

三、Shell中分支与循环结构

if结构的语法格式 单分支结构 if <条件表达式>   then     指令 fi if <条件表达式>; then     指令 fi 双分支结构 if <条件表达式>; then     指令1 else     指令2 fi 多分支结构 if <条件表达式>; then     指令1 elif     指令2 elif     指令3 fi shell中的函数   shell函数是shell脚本中由命令集和语句组成的代码块,这个代码块可以被其他脚

shell中while只循环一次的原因

一,事件描述: 1,#!/bin/bash cat  ../ip.txt | while read LINE do echo $LINE ssh $LINE "ls" done 结果循环一次后退出.原因是while中使用重定向机制,文件中的信息全部读入并重定向给了整个while语句,ssh语句正好读取输入中的所有东西,导致调用玩ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候读不到一纪录,循环退出. 2,#!/bin/bash cat  ../ip.txt | whil

shell中的for循环出现语法错误(syntax error: bad for loop variable)

出现这种错误是因为有些linux系统默认会使用ash进行编译shell脚本,我的机器就是这样,但是我写的脚本是应该用bash执行的.虽然我在开头注明了#!/bin/bash,好像它还是默认去找了ash,真是让人无奈.上网搜索了一下,找到两种解决方案:1.修改脚本 2.修改系统默认执行shell的工具 第一种的具体做法就是,原来的for循环类似这种 for(( i=1; i<3; i++)),改成类似这种的:for  i in `seq 1000`,这是从一个网友的博客上抄来的,我不知道是否等价.

shell中的while循环实例

1.利用while循环计算1到100的和: 示例代码1: #!/bin/bashi=1sum=0while [ $i -le 100 ]do  let sum=sum+$i  let i++done echo $sum 示例代码2:利用while循环计算1到100之间所有奇数之和 #!/bin/bashi=1sum=0while [ $i -le 100 ]do  let sum=sum+$i  let i+=2done echo $sum 示例代码3:利用while循环计算1到100之间所有偶

Shell中的while循环【转】

转自:http://blog.chinaunix.net/uid-25880122-id-2901409.html while循环的格式 while expression do command command ``` done 1.计数器控制的while循环 主要用于已经准确知道要输入的数据和字符串的数目. 举例 1 #!/bin/sh 2 int=1 3 while(( $int<=5 )) 4 do 5 echo $int 6 let "int++" 7 done 2.结束标

shell 中可以for 循环的时间加减日期格式

for num in {88..3};do # LAST_HOUR=`date -d '-${num} hour' +%H` 不可for循环,报格式错误 LAST_HOUR=`date "+%H" -d -${num}hour` 原文地址:https://www.cnblogs.com/tnsay/p/9996826.html

shell中的select循环使用

select单独使用 cat select01.sh  #!/bin/bash echo "Which car do you prefer?" select CAR in Benz Audi VolksWagen do         break done echo "You chose $CAR" 运行结果 sh select01.sh  Which car do you prefer? 1) Benz 2) Audi 3) VolksWagen #? 1 You