我使用 bash 脚本重新启动远程服务器,然后通过 SSH 登录来运行一些命令。我的脚本大部分时间都有效,但偶尔会失败并出现以下错误:
“系统正在启动。尚未允许非特权用户登录。请稍后再回来。有关技术详细信息,请参阅 pam_nologin(8)。”
如果我等待几秒钟然后重试,效果很好。我目前正在检查连接情况,如下所示:
while ! nc -z $HOST 22; do
sleep 1
done
ssh $HOST '/opt/my script..sh'
有没有更好的方法来测试连接以确保 sshd 真正准备好连接?
答案1
如果您想测试 ssh 是否已准备好接受连接并运行命令,请使用ssh
,而不是其他类似 的内容nc
。例如:
while ! ssh $HOST true; do
sleep 1
done
仅当 (a) 您能够成功连接到远程主机并且 (b) 运行该true
命令时,才会成功返回。
答案2
如果您不需要提前root
登录,那么您可以简单地延迟 的开始sshd
。
将其添加到 SSH 服务单元:
After=systemd-user-sessions.service
sshd
仅当允许非特权用户登录时才会启动。
这不允许较早的 SSH 登录。它只是将 SSH 状态从三种减少到两种:如果您可以与它交谈,那么您也可以登录。