5

我一直在网上搜索一段时间来解决我的问题,但没有运气。

我的问题是我似乎无法让 sudo 命令与 paramiko 一起运行。

起初,我尝试简单地使用 SSHClient().exec_command(command) 函数来执行 sudo 命令,但出现以下错误:

sudo: sorry, you must have a tty to run sudo

然后,按照这篇文章的建议:如何使用 Paramiko 制作 sudo 命令,我尝试了这个:

#self._ssh is the SSHClient object    
self._ssh.invoke_shell().exec_command(command)

然而,大多数时候,这只是给了我:

File "pipelines/load_instance/ssh_tools.py", line 71, in executeCommand
    stdin, stdout, stderr = self._ssh.invoke_shell().exec_command(command)
  File "<absolute_path>/paramiko/channel.py", line 213, in exec_command
    self._wait_for_event()
  File "<absolute_path>/paramiko/channel.py", line 1084, in _wait_for_event
    raise e
paramiko.SSHException: Channel closed.

另一个,我不得不说,40% 的时间,我得到这个:

File "<absolute_path>/paramiko/client.py", line 291, in connect
    sock.connect(addr)
File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

作为旁注,我正在尝试在 Amazon Web Services EC2 实例上运行这些 sudo 命令,所以我很困惑为什么会收到 Connection Refused 错误,因为每次我运行此代码时,它都是在一个全新的实例...

另外,我使用的是 paramiko 1.7.6。

4

2 回答 2

3

这是最近发行版中的一个常见问题,影响的不仅仅是 paramiko。(前几天我将一个盒子从fedora2升级到最新版本时遇到了它。几个ssh / sudo管理脚本坏了)

只要您有权访问远程主机,您就可以编辑/etc/sudoers并注释掉该行:Defaults requiretty

sudoers 手册页中的详细信息:

要求

如果设置,sudo 将仅在用户登录到真实 tty 时运行。这将禁止诸如“rsh somehost sudo ls”之类的事情,因为 rsh(1) 不分配 tty。因为在没有 tty 的情况下无法关闭回显,某些站点可能会设置此标志以防止用户输入可见密码。该标志默认关闭。

于 2011-04-26T05:37:37.557 回答
0
stdin, stdout, stderr = client.exec_command(cmd,  get_pty=True)
于 2017-04-10T13:03:18.070 回答