【问题标题】:No return after executing passwd command using ssh in script在脚本中使用 ssh 执行 passwd 命令后没有返回
【发布时间】:2017-12-08 01:52:21
【问题描述】:

我有一个脚本,它从 /etc/hosts 文件中读取主机 IP,执行 ssh 并更新给定用户的密码。但是,脚本在为第一台主机设置密码后关闭,无法为其余主机设置密码。请找到以下文件-

/etc/hosts文件-

172.x.x.x 主机1
172.x.x.x 主机2
172.x.x.x 主机3

我使用的脚本是 as-

key=$1  
user=$2  
password=$3  
filename='/etc/hosts'  
while IFS= read -r line; do 
   IFS=' ' read -r -a array <<< $line
   ssh -i $key centos@${array[0]} "echo "$password" | sudo passwd $user --stdin"  
done <$filename

脚本很简单。但是在从文件中为host1 设置密码后它正在关闭。有谁知道我错过了什么?

【问题讨论】:

    标签: linux bash ssh while-loop


    【解决方案1】:

    正在发生的是ssh is swallowing all of the standard input。通常避免这种情况的方法是为您的输入使用不同的文件描述符,例如:

    while IFS= read -u 9 -r line
    do
        […]
    done 9< "$filename"
    

    但是,这种更改身份验证的方法确实非常不安全,我强烈建议改用公钥。

    【讨论】:

      【解决方案2】:

      默认情况下,ssh 从您的输入文件 stdin 读取。ssh 使用文件的其余部分并且您的 while 循环终止。所以尝试使用

             ssh -n 
      

      【讨论】:

        【解决方案3】:

        使用 awk 将有助于克服任何问题:

        awk -v key=$1 -v usa=$2 -v pass=$3 '{system("ssh -i "key" centos@"$1" \"echo "pass" | sudo passwd "usa" --stdin\"")}' $filename
        

        使用 -v 将您传递的参数指定为 awk 变量,然后使用这些来构造要使用 awk 的系统函数执行的 ssh 命令

        【讨论】:

        • 你在最后保留了文件名。它有什么意义?
        • 道歉,应该是 $filename
        • 抱歉,我在设置 pass 变量时出错了。现在就试试。确保这是在脚本中设置的,文件名变量设置为 /etc/hosts 并为密钥、用户名和密码传递了 3 个参数
        猜你喜欢
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2012-08-24
        • 2013-11-27
        • 1970-01-01
        • 2017-05-11
        相关资源
        最近更新 更多