我有一个脚本,它使用公钥身份验证对多个服务器进行 SSH 连接。由于配置问题,其中一个服务器已停止让脚本登录,这意味着脚本卡在“密码:”提示符下,它显然无法回答,因此它甚至不会尝试列表中的其余服务器。
有没有办法告诉 ssh 客户端,如果密钥认证失败,不要提示输入密码,而是仅报告连接错误并让我的脚本继续运行?
答案1
对于 OpenSSH,有 BatchMode,除了禁用密码提示之外,还应禁用查询密钥的密码。
批处理模式
如果设置为“yes”,则将禁用密码/密码查询。此选项在脚本和其他没有用户提供密码的批处理作业中很有用。参数必须是“yes”或“no”。默认值为“no”。
使用示例:
ssh -oBatchMode=yes -l <user> <host> <dostuff>
答案2
要禁用当前 ssh 连接尝试的密码验证,请在命令行上传递此选项:
-o PasswordAuthentication=no
要禁用将来与任何主机的所有连接的密码验证,请将以下内容添加到
~/.ssh/config
:PasswordAuthentication no
要为某些主机禁用它,请将以下内容添加到 ~/.ssh/config:
Host host1 host2 host3... PasswordAuthentication no
上述选项适用于外向ssh 连接,即您尝试连接到远程 ssh 服务器。
禁用 ssh 服务器上的密码验证(即适用于所有传入ssh 连接),添加PasswordAuthentication no
到/etc/ssh/sshd_config
并重新启动sshd
。
答案3
如果您使用dropbear,只需添加“ -s
”选项即可禁用密码验证。
答案4
以下是 sftp bash 脚本片段示例。我使用“-o BatchMode=Yes”来禁用失败时的密码提示。并检查 frp 返回代码以检查 ftp 连接是否失败。
sftp -o "IdentityFile=<YOUR_IDENTTIY_FILE>" -o "BatchMode=Yes" [email protected] <<EOF
cd /$remotepath
mget *.csv $localpath/download
quit
EOF
exit_code=$?
if [[ $exit_code != 0 ]]; then
echo "sftp error, failed to connect to ftp server" >&2
exit 1
fi