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