我是网络工程师,也是python的新手,我尝试了一些python / paramiko程序[对不起,如果我没有使用确切的技术术语]我感谢你的帮助和谢谢。
在代理服务器上有一个程序(不确定它是如何工作的),P.P.P.P接受我的SSH会话并将其转发给我打算登录的任何设备,D.D.D.D
下面使用正常的SSH命令,它调用D.D.D.D
上的交互式shell ssh -t -l user P.P.P.P D.D.D.D
如果我想执行单个命令并退出设备,那么我会在
下面执行 ssh -t -l username P.P.P.P D.D.D.D command_to_run_on_D_D_D_D
我想使用paramiko完成同样的操作但是在P.P.P.P上调用交互式shell被拒绝所以如果我paramiko连接到P.P.P.P并运行paramiko.invokeshell()我从P.P.P.P获得一条不允许的消息。 (如果我只使用ssh -l用户P.P.P.P,那将是相同的结果。这是预期的行为) 而且我不想在P.P.P.P上使用shell,我希望调用D.D.D.D上的shell。
从SSH文档中,-t强制伪tty分配。这可用于在远程机器上执行任意基于屏幕的程序,这在实现菜单服务时非常有用。多个-t选项强制分配,即使ssh没有本地tty。
它在paramiko中的等价物是exec_command(* args,** kwds)和get_pty(* args,** kwds)
所以我尝试了这段代码。
import paramiko
import sys
proxy = 'P.P.P.P'
device = 'D.D.D.D'
username = 'xxxx'
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=proxy,username=username)
stdin, stdout, stderr = ssh_client.exec_command(device, get_pty=True)
stdin.write('sh ver | no-more\n')
stdin.write('sh config | display set | no-more\n')
stdin.write('show security flow session | no-more\n')
for line in stdout:
print line.strip("\n")
我将设备(DDDD)作为命令传递给PPPP,它选择了打开DDDD中继会话的预期参数,我从DDDD得到了这三个命令的预期输出,但无法实现我真正想要的是,能够在DDDD上调用交互式shell并使用其send和recv方法。