检查是否已设置无密码访问

时间:2010-09-30 12:36:44

标签: python ssh ssh-keys

我将通过python脚本测试是否已设置无密码ssh登录。 如果我运行正常的ssh命令,它将等待接受密码一段时间。 有一种方法,只要ssh要求输入密码,ssh命令就会返回错误。

有可能实现这个目标吗?

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:1)

如果您没有将密码传递给AuthenticationException的{​​{1}}方法并且无法找到工作密钥,那么

paramiko会引发SSHClient

答案 2 :(得分: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

我希望这对您有用。

答案 3 :(得分: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