如何在paramiko连接中发送额外的arg,例如“ssh -t -l user P.P.P.P D.D.D.D”用于交互式shell?

时间:2018-04-14 13:09:12

标签: python paramiko

我是网络工程师,也是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方法。

0 个答案:

没有答案