我正在从文本文件中读取主机信息并将其传递给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循环的执行次数与主机信息文本文件中的行一样多。
不确定为什么会这样。 关于这个的任何信息?
罗兰
答案 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。这是假设您有权限,但是您再次拥有密码,那么您需要什么权限?