将 python Paramiko 用于 ssh:sudo:不存在 tty 且未指定 askpass 程序

mis*_*yes 5 linux ssh python

我想使用paramikossh 进入一堆远程节点并运行一些具有root特权的命令行

我的主目录中有 ssh 密钥,因此当我通过 ssh 进入这些远程节点时不需要输入密码

但是在运行以下脚本时:

    def connect(hostname):
                    ssh = paramiko.SSHClient()
                    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())               
                    ssh.connect(hostname, username='niky', pkey=paramiko.RSAKey.from_private_key(open('id_rsa'), 'passwd'), timeout = 240.0)                return ssh          



    def run(hostname):
            ssh = connect(hostname)
            (stdin, stdout, stderr) = ssh.exec_command("sudo ls")
            res = stderr.readlines()
            print hostname+': '+''.join(str(elem) for elem in res)+'\n'

    run(remote.nity.com)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

remote.nity.com: sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)

如果我sudols 一切正常之前不添加,潜在的原因是什么?谢谢!

daw*_*wud 2

在库存sudoers配置中,通常存在以下行:

Defaults requiretty

这既安全又符合您在大多数用例中所需要的。

在您的情况下,您需要为特定用户覆盖此默认值,因此您可以编写如下:

Defaults:niky !requiretty

另外,您需要定义一条允许无密码niky调用的线路sudo

niky remote.nity.com = (root)NOPASSWD: /bin/ls

该行意味着允许用户无需密码即可niky执行。/bin/lsrootremote.nity.com

进一步的参考可以在这里找到。