【问题标题】:Paramiko and Pseudo-tty AllocationParamiko 和伪 tty 分配
【发布时间】:2011-02-23 23:12:41
【问题描述】:

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

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

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

sudo:对不起,你必须有一个 tty 才能 运行须藤

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

是否可以使用 paramiko 做同样的事情?

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    其实很简单。只是:

    stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
    

    【讨论】:

    • 这是正确的答案。 get_pty 标志也在做同样的事情(参见客户端的 exec_command)
    • 感谢您拯救我的一天 :-)
    【解决方案2】:

    以下代码适用于我:

    #!/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))
    

    这只是通过在线查看一些示例组装而成的......不确定它是否“正确”的方式。

    【讨论】:

    • 当接受的答案没有时,这个答案对我有用。谢谢!
    【解决方案3】:

    我认为您想要 SSHClient 对象的 invoke_shell 方法(我很想提供一个 URL,但 lag.net 的 paramiko 文档是框架重的,只是不会向我显示特定的 URL文档中的给定位置)-它为您提供Channel,您可以在其上执行exec_command等,但通过伪终端(完成终端类型以及行数和列数!- ) 这似乎是您所要求的。

    【讨论】:

    【解决方案4】:

    根据 sudo 手册页:

    -S (stdin) 选项使 sudo 从标准输入而不是终端设备读取密码。这 密码后面必须跟一个换行符。

    您可以写入标准输入,因为它是一个带有 write() 的文件对象:

    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()
    

    【讨论】:

    • 这对我来说非常有效,而其他建议却没有。
    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多