我有一个脚本从/ 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
的密码后它将被关闭。有没有人有任何想法,我缺少什么?
答案 0 :(得分:2)
默认情况下,ssh从stdin读取,这是你的输入文件.ssh消耗文件的其余部分,你的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命令