5

我将通过 python 脚本测试是否设置了无密码 ssh 登录。如果我运行正常的 ssh 命令,那么它将等待一段时间以接受密码。有没有办法让 ssh 命令在 ssh 要求输入密码时立即返回错误。

有可能实现这一目标吗?

4

4 回答 4

8

ssh 命令接受相当多的选项,因此假设您的 Python 代码正在调用 shell 命令,请执行以下操作:

ssh -oNumberOfPasswordPrompts=0 <host> "echo hello"

如果没有设置密钥,这将立即失败,如果有,则立即完成,这就是将命令传递给主机的原因。这给了你一个简单的测试。

于 2010-09-30T12:58:55.813 回答
1

AuthenticationException如果您没有将密码传递给SSHClient'.connect()方法并且找不到工作密钥,paramiko 将引发 an 。

于 2010-09-30T12:48:44.850 回答
0

您可以为 ssh 命令设置一个参数,以仅在身份验证过程中尝试公钥,并使用命令设置批处理模式,该命令在远程主机中执行该命令时始终返回 true。使用这种方法,您可以捕获 var $? 中的退出代码?并做一些决定。

ssh -o PreferredAuthentications=publickey -o BatchMode=yes <host> /bin/true &> /dev/null
if [ $? -eq 0 ]; then
    #DO SOMETHING, THE CONNECTION WAS SUCCESSFUL
else
    #CONECTION DENIED
fi

您可以通过在 ssh 命令的详细输出中找到“权限被拒绝”来将自定义输出捕获到变量,如下面的代码所示。

PERMISION=$([ ! -z "$(ssh -v -o PreferredAuthentications=publickey -o BatchMode=yes <host> /bin/true 2>&1 | grep " Permission denied")" ] && echo "GRANTED" || echo "DENIED")
if [ $PERMISION == "GRANTED" ]; then
    #DO SOMETHING, THE CONNECTION WAS SUCCESSFUL
else
    #CONECTION DENIED
fi

我希望这对你有用。

于 2019-03-26T21:05:49.253 回答
0

您可以使用该PasswordAuthentication选项

PasswordAuthentication 指定是否允许密码验证。默认值为“是”。https://linux.die.net/man/5/sshd_config

Python代码

import subprocess
completed_process = subprocess.run(
    """ ssh -o PasswordAuthentication=no user@localhost 'hostname' """,
    shell=True
)
assert completed_process.returncode == 0
于 2020-05-05T19:18:22.440 回答