如何自动登录服务器列表以防止账户被锁定?

如何自动登录服务器列表以防止账户被锁定?

我已经开始了一份新合同,需要在近 200 台服务器上拥有一个活跃帐户。安全性会在 30 天不活动后以及您在帐户解锁后 1 小时内未登录的情况下锁定帐户。

为了防止一切锁定,我想创建一个脚本来运行服务器列表,使用我的用户名和密码登录,然后注销。

我们在大多数机器上运行 RHEL 5,也有一些 OEL 6(不过主要是 RHEL5)。

谷歌搜索该主题不断将我带到 SSH keygen 主题(我们拥有/使用),但我希望我的通用帐户不会在其他服务器上一直被锁定,以防出现网络问题,我必须亲自去并登录。

答案1

我建议使用pssh.它具有将密码传递给 ssh、并行处理、错误处理等内置功能。这是一个好轮子,不需要再发明一个。

答案2

user1我假设您的用户名与所有 200 台机器中的用户名相同。

首先,在您的机器上创建一个公共 ssh 密钥(例如机器 1)

ssh-keygen -t rsa

每次登录后首次运行任何 ssh 命令时,系统都会要求您输入密码。这意味着对于多个sshscp命令,您只需输入一次。不过,您可以将其留空以获得完全无密码的访问。

如果您在网络中,您的所有 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

相关内容