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

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

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

这是ssh -vvv命令的输出:

ssh -vvv -p2222 [email protected]
OpenSSH_6.4,OpenSSL 1.0.1e-fips 2013年2月11日
debug1:读取配置数据/ etc / ssh / ssh_config
debug1:/ etc / ssh / ssh_config第51行:为*应用选项
debug2:ssh_connect:needpriv 0
debug1:连接到10.213.23.112 [10.213.23.112]端口2222。
debug1:建立连接。
debug1:永久设置uid:0/0
debug3:不正确的RSA1标识符
debug3:无法将“ /root/.ssh/id_rsa”作为RSA1公钥加载
debug1:身份文件/root/.ssh/id_rsa类型1
debug1:身份文件/root/.ssh/id_rsa-cert类型-1
debug1:身份文件/root/.ssh/id_dsa类型-1
debug1:身份文件/root/.ssh/id_dsa-cert类型-1
debug1:身份文件/root/.ssh/id_ecdsa类型-1
debug1:身份文件/root/.ssh/id_ecdsa-cert类型-1
debug1:为协议2.0启用兼容模式
debug1:本地版本字符串SSH-2.0-OpenSSH_6.4
debug1:远程协议版本2.0,远程软件版本OpenSSH_7.4
debug1:匹配项:OpenSSH_7.4 pat OpenSSH *
debug2:fd 3设置O_NONBLOCK
debug3: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-rss-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
debug2:kex_parse_kexinit:无,zlib @ openssh.com,zlib
debug2:kex_parse_kexinit:无,zlib @ openssh.com,zlib
debug2:kex_parse_kexinit:
debug2:kex_parse_kexinit:
debug2: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
debug2:kex_parse_kexinit:hmac-sha2-256,hmac-sha2-512
debug2:kex_parse_kexinit:hmac-sha2-256,hmac-sha2-512
debug2:kex_parse_kexinit:无,zlib @ openssh.com
debug2:kex_parse_kexinit:无,zlib @ openssh.com
debug2:kex_parse_kexinit:
debug2:kex_parse_kexinit:
debug2:kex_parse_kexinit:first_kex_follows 0
debug2:kex_parse_kexinit:保留0
debug2:mac_setup:找到hmac-sha2-256
debug1:kex:服务器->客户端aes128-ctr hmac-sha2-256无
debug2:mac_setup:找到hmac-sha2-256
debug1: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
debug3:put_host_port:[10.213.23.112]:2222
debug3: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:签名正确
debug2:kex_derive_keys
debug2:set_newkeys:模式1
debug1:发送了SSH2_MSG_NEWKEYS
debug1:需要SSH2_MSG_NEWKEYS
debug2:set_newkeys:模式0
debug1:收到SSH2_MSG_NEWKEYS
debug1:服务器不允许漫游
debug1:发送了SSH2_MSG_SERVICE_REQUEST
debug2:service_accept:ssh-userauth
debug1:收到SSH2_MSG_SERVICE_ACCEPT
debug2:密钥:/root/.ssh/id_rsa(0x55f959096720),
debug2:密钥:/root/.ssh/id_dsa((nil)),
debug2:密钥:/root/.ssh/id_ecdsa((nil)),
debug1:可以继续进行的身份验证:publickey,gssapi-keyex,gssapi-with-mic,密码
debug3:重新开始,传递了另一个列表publickey,gssapi-keyex,gssapi-with-mic,password
debug3:首选gssapi-keyex,gssapi-with-mic,publickey,交互式键盘,密码
debug3:authmethod_lookup gssapi-keyex
debug3:仍然首选:带麦克风的gssapi,公钥,交互式键盘,密码
debug3:authmethod_is_enabled gssapi-keyex
debug1:下一个身份验证方法:gssapi-keyex
debug1:没有有效的密钥交换上下文
debug2:我们没有发送数据包,禁用方法
debug3:authmethod_lookup gssapi-with-mic
debug3:仍然首选:publickey,交互式键盘,密码
debug3:authmethod_is_enabled gssapi-with-mic
debug1:下一个身份验证方法:gssapi-with-mic
debug1:未指定的GSS故障。次要代码可能会提供更多信息
没有可用的Kerberos凭据(默认缓存:KEYRING:永久:0)

debug1:未指定的GSS故障。次要代码可能会提供更多信息
没有可用的Kerberos凭据(默认缓存:KEYRING:永久:0)

debug2:我们没有发送数据包,禁用方法
debug3:authmethod_lookup公共密钥
debug3:仍然首选:交互式键盘,密码
debug3:authmethod_is_enabled公钥
debug1:下一个身份验证方法:publickey
debug1:提供RSA公钥:/root/.ssh/id_rsa
debug3:send_pubkey_test
debug2:我们发送了一个公钥包,等待回复
debug1:可以继续进行的身份验证:publickey,gssapi-keyex,gssapi-with-mic,密码
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:下一个身份验证方法:密码
[email protected]的密码:
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]
debug3:ssh_session2_open:channel_new:0
debug2:通道0:发送打开
debug1:请求[email protected]
debug1:进入交互式会话。
debug1:client_input_global_request:rtype [email protected] want_reply 0
debug2:回调启动
debug2:fd 3设置TCP_NODELAY
debug3:packet_set_tos:设置IP_TOS 0x10
debug2:client_session2_setup:ID 0
debug2:通道0:请求pty-req确认1
debug1:发送环境。
debug3:忽略环境XDG_SESSION_ID
debug3:忽略环境主机名
debug3:忽略环境TERM
debug3:忽略环境外壳
debug3:忽略环境历史记录
debug3:忽略环境SSH_CLIENT
debug3:忽略环境SSH_TTY
debug3:忽略环境用户
debug3:忽略环境LS_COLORS
debug3:忽略环境邮件
debug3:忽略环境路径
debug3:忽略环境PWD
debug1:发送env LANG = en_US.UTF-8
debug2:通道0:请求环境确认0
debug3:忽略环境HISTCONTROL
debug3:忽略环境SHLVL
debug3:忽略env HOME
debug3:忽略环境LOGNAME
debug3:忽略环境XDG_DATA_DIRS
debug3:忽略环境SSH_CONNECTION
debug3:忽略环境LESSOPEN
debug3:忽略环境XDG_RUNTIME_DIR
debug3:忽略环境_
debug2:通道0:请求外壳程序确认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上接受外壳程序请求
上次登录时间:2018年12月11日星期二21:17:10从10.213.23.201
请输入shell密码: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
debug3:收到SSH2_MSG_IGNORE

进入外壳...
[root @ atd-reg root]#

最佳答案

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

仅在启动外壳程序时询问第二个密码。为此使用了简单的I / O。

此外,您的服务器似乎不支持“ exec”接口/通道来执行命令(因为ssh user@host command不起作用)。可能与“外壳密码”功能有关。因此,您可能必须使用“ 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 - 如何使用SSH的Paramiko模块将其SSH到需要两次密码身份验证的服务器中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59553227/

10-12 00:02