我想更改多个服务器的root密码。我将shell与for循环和chpasswd实用程序一起使用。由于sudo帐户已启用密码,因此我每次退出脚本时都会提示输入sudo密码。
下面是bash脚本是用bash编写的。但是总是提示输入密码。
#!/bin/bash
pass="PASSWORD"
for i in $(cat serverlist)
do
ssh -t sudouser@$i "sudo chpasswd <<EOF
root:"$pass"
EOF" ;
done
完全自动化的bash更改根密码。
答案 0 :(得分:0)
我还认为您应该使用expect
。我编写的脚本尚未经过全面测试,因为我没有可用来更改密码的服务器:-)
#!/bin/bash
read -p "Server username? " USERNAME
read -sp "Server password for ${USERNAME}? " PASSWORD
echo
read -p "Name of file containing server list? " S_FILE
read -p "User to change on servers? " S_USERNAME
read -sp "New password for user ${S_USERNAME}?" S_PASSWORD
echo
while IFS= read -r SERVER; do
[ ! -z "${SERVER}" ] || continue
expect <<-EOF
spawn ssh ${USERNAME}@${SERVER}
expect "*: " { send "${PASSWORD}\r" }
expect "*$ " { send "echo '${S_USERNAME}:${S_PASSWORD}' | sudo chpasswd\r" }
expect "*: " { send "${PASSWORD}\r" }
expect "*$ " { send "exit\r" }
EOF
echo
done < ${S_FILE}
exit $?
答案 1 :(得分:0)
编写脚本来执行无人看管的root行为很危险。您所需要的只是一台机器,其行为与您期望的有所不同,并且您的自动化方法将行不通。更糟糕的是,您可能会陷入某种糟糕的状态,甚至可能没有意识到任何错误。
这听起来很适合csshx
(或类似的东西)。使用它可以在多个主机上并行并行应用所需的任何更改。例如,您可以像这样一次连接到16台主机:
csshx host[1-16]
然后键入命令并监视每个主机的输出。
如果由于您拥有的计算机数量而使这似乎不可行,我会反驳说,这比脚本编写要安全得多,而且-即使“慢”-花费的总时间也可能比尝试创建一个总的时间要少。自动化解决方案。 ;)