代码之家  ›  专栏  ›  技术社区  ›  Jonathan Holloway

Paramiko与伪tty分配

  •  21
  • Jonathan Holloway  · 技术社区  · 15 年前

    我正在尝试使用Paramiko连接到远程主机并执行一些文本文件替换。

    i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
                                  + replaced + "/g'" + conf);
    

    其中一些命令需要作为sudo运行,这会导致:

    苏多:对不起,你一定有时间 运行sudo

    我可以使用-t开关和ssh强制进行伪tty分配。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Alex Martelli    15 年前

    我想你想要 invoke_shell SSHClient 对象(我很想提供一个网址,但paramiko文档在 lag.net 是框架沉重,只是不会给我一个特定的网址为一个给定的地点在文档)-它给你一个 Channel ,你可以在上面 exec_command 诸如此类,但这是通过伪终端实现的(包括终端类型和行数和列数!)这似乎是你想要的。

        2
  •  37
  •   Maciej Wawrzyńczuk    10 年前

    其实很简单。只是:

    stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
    
        3
  •  22
  •   David    13 年前

    以下代码适用于我:

    #!/usr/bin/env python
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('localhost',username='root',password='secret')
    chan = ssh.get_transport().open_session()
    chan.get_pty()
    chan.exec_command('tty')
    print(chan.recv(1024))
    

    这是从网上的几个例子中总结出来的。。。不确定这是不是“正确”的方式。

        4
  •  8
  •   ksaylor11    10 年前

    根据sudo手册:

    密码后面必须跟一个换行符。

    import paramiko
    
    client = paramiko.client.SSHClient()
    client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
    client.connect(hostname='localhost', port=22, username='user', password='password')
    stdin, stdout, stderr = client.exec_command('sudo -S aptitude update')
    stdin.write('password\n')
    stdin.flush()
    # print the results
    print stdout.read()
    client.close()