如果公钥认证失败,如何让 ssh 失败而不是提示输入密码?

如果公钥认证失败,如何让 ssh 失败而不是提示输入密码?

我有一个脚本,它使用公钥身份验证对多个服务器进行 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

相关内容