Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SSH跳转到使用授权代码作为第二步验证的服务器_Python_Ssh_Paramiko - Fatal编程技术网

Python SSH跳转到使用授权代码作为第二步验证的服务器

Python SSH跳转到使用授权代码作为第二步验证的服务器,python,ssh,paramiko,Python,Ssh,Paramiko,我对编写代码有点陌生,我正在尝试在防火墙中自动搜索APR表中的mac地址 在我们的部署中,我们只能通过跳转服务器访问(SSH)防火墙。这是一种嵌套的ssh,我发现使用Paramiko运行它时没有问题的帖子和代码 我在这里面临的挑战是,跳转服务器在输入用户名和密码后会向我发送一封电子邮件,其中包含一个链接,用于单击以完成身份验证,或从该电子邮件中复制一个代码,并在请求输入该代码的消息之后将其输入shell 当然,对于我的代码,我总是得到身份验证失败,因为我忽略了第二个身份验证步骤。我不知道如何保持

我对编写代码有点陌生,我正在尝试在防火墙中自动搜索APR表中的mac地址

在我们的部署中,我们只能通过跳转服务器访问(SSH)防火墙。这是一种嵌套的ssh,我发现使用Paramiko运行它时没有问题的帖子和代码

我在这里面临的挑战是,跳转服务器在输入用户名和密码后会向我发送一封电子邮件,其中包含一个链接,用于单击以完成身份验证,或从该电子邮件中复制一个代码,并在请求输入该代码的消息之后将其输入shell

当然,对于我的代码,我总是得到身份验证失败,因为我忽略了第二个身份验证步骤。我不知道如何保持ssh隧道打开,并提示脚本允许我输入我在电子邮件中收到的验证代码,然后继续脚本

下面是我访问跳转服务器并验证我可以从其shell运行命令的代码:

import paramiko
import sys
import subprocess

ssh_access = paramiko.SSHClient()
ssh_access.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_access.connect('192.168.1.1', username='root', password='root')
stdin, stdout, stdrr = ssh_access.exec_command("ls -l")

response = stdout.read()
print(response)
我被困在这一部分,并感谢帮助继续做脚本中的实际目标

对跳转服务器执行SSH时调试文件的一部分

debug1:可以继续的身份验证:密码、键盘交互^M
debug1:下一个身份验证方法:键盘交互^M
debug1:身份验证成功(键盘交互)。^M
已验证为10.101.xx.xx([10.101.xx.xx]:22)。^M
调试1:通道0:新建[客户端会话]^M
debug1:不再请求-sessions@openssh.com^M
debug1:正在进入交互式会话。^M
debug1:保证:网络^M
debug1:客户端\输入\全局\请求:rtype主机密钥-00@openssh.com 
想要回复0^M吗
调试1:发送环境。^M
debug1:发送env LANG=C.UTF-8^M
调试1:客户端输入通道请求:通道0 rtype退出状态回复0^M
debug1:客户端\输入\通道\请求:通道0 rtypeeow@openssh.com回复
0^M
debug1:通道0:空闲:客户端会话,nchannels 1^M
调试1:fd 2清除非块^M
与10.101.xx.xx的连接已关闭。^M
已传输:在21.5秒内发送2760个字节,接收4520个字节^M
每秒字节数:发送128.4,接收210.3^M
debug1:退出状态0^M

因此,我能够通过使用
auth_interactive_dumb
解决这个问题,它将提示从远程服务器传输到终端,以便您可以交互并响应这些提示

下面是一段适用于我的代码:

import paramiko
import socket
import getpass

def connect_ssh(user):
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    my_socket.connect(("xx.xx.xx.xx", 22))
    my_transport = paramiko.Transport(my_socket)
    my_transport.start_client(timeout=60)
    my_transport.auth_interactive_dumb(user)
    channel = my_transport.open_session()
    channel.exec_command("netstat -an")
    channel.recv_ready()
    response = channel.recv(1024).decode("utf-8")
    print(response)

connect_ssh('your_user_name')
当我运行脚本时,系统会提示我输入密码。然后我收到了第二步验证的信息

电子邮件发送至xxxx@abc.com. 单击链接或手动输入
要验证的代码。之后,请按完成身份验证:
我点击链接并点击回车,然后运行
exec\u命令
,因此我得到以下输出

活动Internet连接(服务器和已建立)
Proto Recv-Q Send-Q本地地址外部地址状态
tcp 0 0 127.0.0.1:5000 0.0.0.0:*听
tcp 0 0 127.0.0.1:5001 0.0.0.0:*听
tcp 0 0 127.0.0.1:6062 0.0.0.0:*听
tcp 0.0.0.0:22 0.0.0.0:*听
tcp 0.0.0.0:8089 0.0.0.0:*听
tcp 0 0 127.0.0.1:25 0.0.0.0:*听
tcp 0 0 127.0.0.1:8126 0.0.0.0:*听
tcp 0 0 10.101.xx.xx:22 10.47.xx.xx:55533已建立
tcp 0 0 10.101.xx.xx:22 10.47.xx.xx:62391已建立