如何使用 Python 的 Paramiko 模块 ssh 进入需要两次密码验证的服务器?

Posted

技术标签:

【中文标题】如何使用 Python 的 Paramiko 模块 ssh 进入需要两次密码验证的服务器?【英文标题】:How can I ssh into a server that requires two password authentication using Python's Paramiko module? 【发布时间】:2019-05-12 12:10:04 【问题描述】:

如何使用 Paramiko SSH 到需要双重密码身份验证的服务器?

当使用特定用户时,它首先提示输入用户密码,然后输入另一个密码,所以我的会话需要是交互式的。 我已经使用 pexpect 模块在 Linux 上生成了一个 ssh 进程,但由于我无法在 Windows 中执行此操作,因此我需要一种使用 Paramiko 的方法。

服务器是我们的产品,它是 CentOS 的略微修改版本。我正在编写自动化代码来测试一些需要我 ssh 进入服务器并验证一些命令的功能。我能够以 root 用户身份登录,但对于我感兴趣的用户,它要求输入第二个密码。

这是ssh -vvv 命令的输出:

ssh -vvv -p2222 nobrk1n@10.213.23.112
OpenSSH_6.4,OpenSSL 1.0.1e-fips 2013 年 2 月 11 日
debug1:读取配置数据 /etc/ssh/ssh_config
debug1:/etc/ssh/ssh_config 第 51 行:为 * 应用选项
调试2:ssh_connect:需要priv 0
debug1:连接到 10.213.23.112 [10.213.23.112] 端口 2222。
debug1:建立连接。
调试1:永久设置uid:0/0
debug3:RSA1 标识符不正确
debug3:无法加载“/root/.ssh/id_rsa”作为 RSA1 公钥
debug1:身份文件 /root/.ssh/id_rsa 类型 1
debug1:身份文件/root/.ssh/id_rsa-cert type -1
debug1:身份文件 /root/.ssh/id_dsa 类型 -1
debug1:身份文件 /root/.ssh/id_dsa-cert type -1
debug1:身份文件 /root/.ssh/id_ecdsa 类型 -1
debug1:身份文件/root/.ssh/id_ecdsa-cert type -1
debug1:为协议 2.0 启用兼容模式
debug1:本地版本字符串 SSH-2.0-OpenSSH_6.4
debug1:远程协议版本2.0,远程软件版本OpenSSH_7.4
debug1:匹配:OpenSSH_7.4 拍 OpenSSH*
debug2:fd 3 设置 O_NONBLOCK
调试3:put_host_port:[10.213.23.112]:2222
debug3:load_hostkeys:从文件“/root/.ssh/known_hosts”加载主机“[10.213.23.112]:2222”的条目
debug3:load_hostkeys:在文件 /root/.ssh/known_hosts:1 中找到密钥类型 ECDSA
debug3: load_hostkeys: 加载了 1 个键
debug3: order_hostkeyalgs: 首选 hostkeyalgs: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa -sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
debug1: SSH2_MSG_KEXINIT 已发送
debug1:收到 SSH2_MSG_KEXINIT
debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1, diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2- nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com, ssh-dss-cert-v00@openssh.com,ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,3des-cbc,blowfish-cbc,cast128- cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,3des-cbc,blowfish-cbc,cast128- cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256- etm@openssh.com、hmac-sha2-512-etm@openssh.com、hmac-ripemd160-etm@openssh.com、hmac-sha1-96-etm@openssh.com、hmac-md5-96-etm@openssh。 com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com, hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256- etm@openssh.com、hmac-sha2-512-etm@openssh.com、hmac-ripemd160-etm@openssh.com、hmac-sha1-96-etm@openssh.com、hmac-md5-96-etm@openssh。 com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com, hmac-sha1-96,hmac-md5-96
调试2:kex_parse_kexinit:无,zlib@openssh.com,zlib
调试2:kex_parse_kexinit:无,zlib@openssh.com,zlib
调试2:kex_parse_kexinit:
调试2:kex_parse_kexinit:
调试2:kex_parse_kexinit:first_kex_follows 0
debug2:kex_parse_kexinit:保留 0
debug2:kex_parse_kexinit:curve25519-sha256、curve25519-sha256@libssh.org、ecdh-sha2-nistp256、ecdh-sha2-nistp384、ecdh-sha2-nistp521、diffie-hellman-group-exchange-sha256、diffie-hellman-group16- sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
调试2:kex_parse_kexinit:hmac-sha2-256,hmac-sha2-512
调试2:kex_parse_kexinit:hmac-sha2-256,hmac-sha2-512
调试2:kex_parse_kexinit:无,zlib@openssh.com
调试2:kex_parse_kexinit:无,zlib@openssh.com
调试2:kex_parse_kexinit:
调试2:kex_parse_kexinit:
调试2:kex_parse_kexinit:first_kex_follows 0
debug2:kex_parse_kexinit:保留 0
debug2:mac_setup:找到 hmac-sha2-256
调试1:kex:服务器->客户端aes128-ctr hmac-sha2-256无
debug2:mac_setup:找到 hmac-sha2-256
调试1:kex:客户端->服务器aes128-ctr hmac-sha2-256无
debug1:发送 SSH2_MSG_KEX_ECDH_INIT
debug1:期待 SSH2_MSG_KEX_ECDH_REPLY
debug1:服务器主机密钥:ECDSA 30:5c:e6:be:81:31:79:b8:71:80:bf:49:95:a9:79:12
调试3:put_host_port:[10.213.23.112]:2222
调试3:put_host_port:[10.213.23.112]:2222
debug3:load_hostkeys:从文件“/root/.ssh/known_hosts”加载主机“[10.213.23.112]:2222”的条目
debug3:load_hostkeys:在文件 /root/.ssh/known_hosts:1 中找到密钥类型 ECDSA
debug3: load_hostkeys: 加载了 1 个键
debug3:load_hostkeys:从文件“/root/.ssh/known_hosts”加载主机“[10.213.23.112]:2222”的条目
debug3:load_hostkeys:在文件 /root/.ssh/known_hosts:1 中找到密钥类型 ECDSA
debug3: load_hostkeys: 加载了 1 个键
debug1:主机 '[10.213.23.112]:2222' 已知且与 ECDSA 主机密钥匹配。
debug1:在 /root/.ssh/known_hosts:1 中找到密钥
debug1:ssh_ecdsa_verify:签名正确
调试2:kex_derive_keys
debug2:set_newkeys:模式 1
debug1: SSH2_MSG_NEWKEYS 已发送
debug1:期待 SSH2_MSG_NEWKEYS
调试2:set_newkeys:模式0
debug1:收到 SSH2_MSG_NEWKEYS
debug1:服务器不允许漫游
debug1:SSH2_MSG_SERVICE_REQUEST 已发送
debug2: service_accept: ssh-userauth
debug1:收到 SSH2_MSG_SERVICE_ACCEPT
debug2: key: /root/.ssh/id_rsa (0x55f959096720),
debug2: key: /root/.ssh/id_dsa ((nil)),
debug2: key: /root/.ssh/id_ecdsa ((nil)),
debug1:可以继续的身份验证:publickey、gssapi-keyex、gssapi-with-mic、password
debug3:重新开始,传递不同的列表 publickey、gssapi-keyex、gssapi-with-mic、password
debug3:首选 gssapi-keyex、gssapi-with-mic、publickey、keyboard-interactive、密码
debug3:authmethod_lookup gssapi-keyex
debug3:仍然首选:gssapi-with-mic、publickey、keyboard-interactive、password
debug3:authmethod_is_enabled gssapi-keyex
debug1:下一个认证方法:gssapi-keyex
debug1:没有有效的密钥交换上下文
debug2:我们没有发送数据包,禁用方法
debug3:authmethod_lookup gssapi-with-mic
debug3:剩余首选:publickey、keyboard-interactive、password
debug3:authmethod_is_enabled gssapi-with-mic
debug1:下一个身份验证方法:gssapi-with-mic
debug1:未指定的 GSS 故障。次要代码可以提供更多信息
没有可用的 Kerberos 凭据(默认缓存:KEYRING:persistent:0)
  
debug1:未指定的 GSS 故障。次要代码可以提供更多信息
没有可用的 Kerberos 凭据(默认缓存:KEYRING:persistent:0)
  
debug2:我们没有发送数据包,禁用方法
debug3: authmethod_lookup 公钥
debug3:剩余首选:键盘交互,密码
debug3:authmethod_is_enabled 公钥
debug1:下一个认证方式:publickey
debug1:提供 RSA 公钥:/root/.ssh/id_rsa
调试3:send_pubkey_test
debug2:我们发送了一个公钥包,等待回复
debug1:可以继续的身份验证:publickey、gssapi-keyex、gssapi-with-mic、password
debug1:尝试私钥:/root/.ssh/id_dsa
debug3:没有这样的身份:/root/.ssh/id_dsa:没有这样的文件或目录
debug1:尝试私钥:/root/.ssh/id_ecdsa
debug3:没有这样的身份:/root/.ssh/id_ecdsa:没有这样的文件或目录
debug2:我们没有发送数据包,禁用方法
debug3:authmethod_lookup 密码
debug3:剩余首选:,密码
debug3:authmethod_is_enabled 密码
debug1:下一个认证方式:密码
nobrk1n@10.213.23.112 的密码:
debug3: packet_send2: 添加 64 (len 60 padlen 4 extra_pad 64)
debug2:我们发送了一个密码包,等待回复
debug1:认证成功(密码)。
已通过 10.213.23.112 ([10.213.23.112]:2222) 的身份验证。
debug1:通道 0:新的 [client-session]
调试3:ssh_session2_open:channel_new:0
debug2:通道 0:发送打开
debug1:请求 no-more-sessions@openssh.com
debug1:进入交互式会话。
调试1:client_input_global_request:rtype hostkeys-00@openssh.com want_reply 0
debug2:回调开始
debug2: fd 3 设置 TCP_NODELAY
debug3: packet_set_tos: 设置 IP_TOS 0x10
调试2:client_session2_setup:id 0
debug2:通道 0:请求 pty-req 确认 1
debug1:发送环境。
debug3:忽略环境 XDG_SESSION_ID
debug3:忽略 env HOSTNAME
debug3:忽略 env TERM
debug3:忽略 env SHELL
debug3:忽略 env HISTSIZE
debug3:忽略环境 SSH_CLIENT
debug3:忽略环境 SSH_TTY
debug3:忽略环境用户
debug3:忽略环境 LS_COLORS
debug3:忽略 env MAIL
debug3:忽略环境路径
debug3:忽略 env PWD
debug1:发送 env LANG = en_US.UTF-8
debug2:通道 0:请求 env 确认 0
debug3:忽略 env HISTCONTROL
debug3:忽略环境 SHLVL
debug3:忽略 env HOME
debug3:忽略 env LOGNAME
debug3:忽略环境 XDG_DATA_DIRS
debug3:忽略 env SSH_CONNECTION
debug3:忽略 env LESSOPEN
debug3:忽略环境 XDG_RUNTIME_DIR
debug3:忽略 env _
debug2:通道 0:请求 shell 确认 1
debug2:回调完成
debug2:通道 0:打开确认 rwindow 0 rmax 32768
debug2:channel_input_status_confirm:类型 99 id 0
debug2: 在通道 0 上接受 PTY 分配请求
debug2:通道 0:rcvd 调整 2097152
debug2:channel_input_status_confirm:类型 99 id 0
debug2:在通道 0 上接受了 shell 请求
最后登录时间:2018 年 12 月 11 日星期二 21:17:10 从 10.213.23.201
请输入shell密码:debug3: Received SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
debug3:收到 SSH2_MSG_IGNORE
  
进入外壳...
[root@atd-reg root]# 

我无法执行这样的命令:

ssh -vvv -p2222 nobrk1n@10.213.23.112 ls

在执行上述命令时,系统会提示我输入 nobrk1n 用户密码。但是在输入密码时它会卡住。我已将上述命令的输出粘贴到https://pastebin.com/hSfiCmdi。通常我首先使用ssh -p2222 user@host ssh 进入服务器,当连接建立并成功登录后,我开始执行命令。

【问题讨论】:

【参考方案1】:

您的服务器对第一个密码使用标准密码验证。

只有在 shell 启动时才会询问第二个密码。为此使用了简单的 I/O。

此外,您的服务器似乎不支持“exec”接口/通道来执行命令(因为ssh user@host command 不起作用)。什么可能与“shell密码”功能有关。所以你可能不得不使用“shell”通道来执行你的命令,否则不推荐

ssh = paramiko.SSHClient()
ssh.connect(hostname, username = username, password = password1)
channel = ssh.invoke_shell()
channel.send(password2 + "\n")
channel.send(command + "\n")
while not channel.recv_ready():
    time.sleep(1)
out = channel.recv(9999)

【讨论】:

以上是关于如何使用 Python 的 Paramiko 模块 ssh 进入需要两次密码验证的服务器?的主要内容,如果未能解决你的问题,请参考以下文章

python第三方模块之paramiko模块

python paramiko模块

使用python的Paramiko模块登陆SSH

python(paramiko模块的简单使用)

python - 常用模块 - paramiko

Python模块 - Paramiko