我已经开始了一份新合同,需要在近 200 台服务器上拥有一个活跃帐户。安全性会在 30 天不活动后以及您在帐户解锁后 1 小时内未登录的情况下锁定帐户。
为了防止一切锁定,我想创建一个脚本来运行服务器列表,使用我的用户名和密码登录,然后注销。
我们在大多数机器上运行 RHEL 5,也有一些 OEL 6(不过主要是 RHEL5)。
谷歌搜索该主题不断将我带到 SSH keygen 主题(我们拥有/使用),但我希望我的通用帐户不会在其他服务器上一直被锁定,以防出现网络问题,我必须亲自去并登录。
答案1
我建议使用pssh
.它具有将密码传递给 ssh、并行处理、错误处理等内置功能。这是一个好轮子,不需要再发明一个。
答案2
user1
我假设您的用户名与所有 200 台机器中的用户名相同。
首先,在您的机器上创建一个公共 ssh 密钥(例如机器 1)
ssh-keygen -t rsa
每次登录后首次运行任何 ssh 命令时,系统都会要求您输入密码。这意味着对于多个ssh
或scp
命令,您只需输入一次。不过,您可以将其留空以获得完全无密码的访问。
如果您在网络中,您的所有 IP 地址都将在 中可用/etc/hosts
。
您可以获取 IP 地址或主机名列表,并将其保存在仅包含主机名的文件中。
我的IP列表文件.txt如下。
192.168.1.11
192.168.1.12
生成公钥后,将其复制(如user1
)到网络中的每台计算机。
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
您必须手动输入每个 IP 的密码(除非您在此步骤中也使用以下解决方案之一),但完成此操作后,您将能够在所有这些计算机中运行脚本而无需使用密码。
现在,您可以使用一个脚本来 ssh 到所有计算机并定期注销。
while read ip; do
ssh user1@$ip
exit
done < IPlistfile.txt
上面的脚本可以放置在 a 中cronjob
,并且可以定期运行以根据需要登录和注销服务器,而无需锁定用户帐户。
请参考我的问题的答案在网络中自动化 scp 的脚本它会给你更多的想法。
答案3
RSA 密钥将是最好的解决方案,但是如果你不能使用它们,你需要expect
像这样进行一些丑陋的黑客攻击:
#!/usr/bin/expect
set timeout 60
#set maxSpawn 20
if { $argc >= 2 } {
set user [lindex $argv 0]
set pass [lindex $argv 1]
set cmd ""
for {set i 2} {$i < $argc} {incr i 1} {
append cmd "[lindex $argv $i] "
}
#puts $cmd
} else {
exit
}
log_user 0
spawn sh -c "$cmd"
log_user 1
expect {
"$user:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"assword:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"(yes/no)?" {
send "yes\n";
exp_continue
}
"\[Y/n\]\?" {
send "y\n";
exp_continue
}
eof { exit }
timeout { exit }
default { exp_continue; }
}
将其保存为 ssh.exp 并运行:
ssh.exp your_username your_password ssh server exit