我将通过 python 脚本测试是否设置了无密码 ssh 登录。如果我运行正常的 ssh 命令,那么它将等待一段时间以接受密码。有没有办法让 ssh 命令在 ssh 要求输入密码时立即返回错误。
有可能实现这一目标吗?
ssh 命令接受相当多的选项,因此假设您的 Python 代码正在调用 shell 命令,请执行以下操作:
ssh -oNumberOfPasswordPrompts=0 <host> "echo hello"
如果没有设置密钥,这将立即失败,如果有,则立即完成,这就是将命令传递给主机的原因。这给了你一个简单的测试。
AuthenticationException
如果您没有将密码传递给SSHClient
'.connect()
方法并且找不到工作密钥,paramiko 将引发 an 。
您可以为 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
我希望这对你有用。
您可以使用该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