在脚本

时间:2017-07-04 14:28:15

标签: linux bash ssh while-loop

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

/etc/hosts file-

  

172.x.x.x host1
    172.x.x.x host2
    172.x.x.x host3

我使用的脚本是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的密码后它将被关闭。有没有人有任何想法,我缺少什么?

3 个答案:

答案 0 :(得分:2)

默认情况下,ssh从stdin读取,这是你的输入文件.ss​​h消耗文件的其余部分,你的while循环终止。所以尝试使用

       ssh -n 

答案 1 :(得分:0)

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

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

然而,这种改变身份验证的方法确实非常不安全,我强烈建议转而使用公钥。

答案 2 :(得分:0)

使用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命令