Bash while循环只在body包含ssh时迭代一次

时间:2011-09-14 03:50:27

标签: bash ssh

我正在从文本文件中读取主机信息并将其传递给ssh命令: 文本文件包含ssh命令的主机,用户和密码

while read LINE
do
    R_USER=$(echo $LINE | cut -d ',' -f 1)                  
    R_HOST=$(echo $LINE | cut -d ',' -f 2)                                  
    PY_SCRIPT=$(echo $LINE | cut -d ',' -f 4)               

    ssh $R_USER@$R_HOST 'touch /home/user/file_name.txt'

done </path_name/file_name

事实证明,即使主机文本文件包含多个主机信息,while循环也只执行一次。 当我删除ssh命令时,while循环的执行次数与主机信息文本文件中的行一样多。

不确定为什么会这样。 关于这个的任何信息?

罗兰

2 个答案:

答案 0 :(得分:14)

ssh的默认标准输入处理从while循环中排出剩余的行。

要避免此问题,请更改有问题的命令从中读取标准输入的位置。如果不需要将标准输入传递给命令,请从特殊/dev/null设备读取标准输入:

while read LINE
  do
    R_USER=$(echo $LINE | cut -d ',' -f 1)                  
    R_HOST=$(echo $LINE | cut -d ',' -f 2)                                  
    PY_SCRIPT=$(echo $LINE | cut -d ',' -f 4)               

    ssh $R_USER@$R_HOST 'touch /home/user/file_name.txt' < /dev/null

done </path_name/file_name

或者,尝试使用ssh -n来阻止ssh从标准输入读取。例如:

ssh -n $R_USER@$R_HOST 'touch /home/user/file_name.txt'

答案 1 :(得分:1)

如果文件是空格分隔

host1 user password
host2 user password

然后是一个简单的读取循环:

while read -r Server User Password
do
   /usr/bin/ssh -n $User@$Server touch /home/user/file_name.txt
done </path/to/file.list

但系统会提示您输入密码。您无法将“密码”传递给ssh,因此我建议存储无密码的ssh密钥,并将它们放在每个主机上,供您连接的用户使用。如果从脚本运行此命令,则可以将公钥放在用户的 ~/.ssh/authorized_keys(或authorized_keys2)文件中,以便在每台主机上作为这些用户使用。如果您有ssh-copy-id命令,则可以通过以下方式执行此操作:

ssh-copy-id user@hostname 

会将您的 ssh-key复制到他们的 authorized_keys文件中,以便您可以将其作为ssh。这是假设您有权限,但是您再次拥有密码,那么您需要什么权限?