我将通过python脚本测试是否已设置无密码ssh登录。 如果我运行正常的ssh命令,它将等待接受密码一段时间。 有一种方法,只要ssh要求输入密码,ssh命令就会返回错误。
有可能实现这个目标吗?
答案 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
import subprocess
completed_process = subprocess.run(
""" ssh -o PasswordAuthentication=no user@localhost 'hostname' """,
shell=True
)
assert completed_process.returncode == 0