【问题标题】:Bash while loop iterates only once whenever body contains ssh [duplicate]每当正文包含 ssh 时,Bash while 循环仅迭代一次 [重复]
【发布时间】:2011-11-16 16:26:13
【问题描述】:

我正在从文本文件中读取主机信息并将其传递给 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 循环的执行次数与主机信息文本文件中的行数一样多。

不知道为什么会这样。 有这方面的信息吗?

罗兰

【问题讨论】:

  • 顺便说一句,您可以通过暂时将内部字段分隔符更改为逗号来避免所有可怕的cutting,并将reading 直接放入您的变量中:IFS=','; while read R_USER R_HOST dhummi PY_SCRIPT rest; do...

标签: bash ssh


【解决方案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。如果你有ssh-copy-id 命令,你可以这样做:

ssh-copy-id user@hostname 

这会将 YOUR ssh-key 复制到 他们的 authorized_keys 文件中,这样您就可以像他们一样 ssh。这是假设您有权限,但您又拥有他们的密码,那么您需要什么权限?

【讨论】:

  • 不错的简单读取循环我在 while 循环中分离服务器和用户时遇到了麻烦
【解决方案2】:

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'

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 2016-09-09
    • 1970-01-01
    • 2014-10-02
    • 2018-11-27
    • 2016-09-26
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多