Paramiko和sudo

5

我已经在网络上搜索了一段时间,但没有找到解决我的问题的方法。

我的问题是无法使用paramiko运行sudo命令。

起初,我尝试简单地使用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

作为一个侧面说明,我试图在亚马逊网络服务 EC2 实例上运行这些 sudo 命令,所以我很困惑为什么会出现“连接被拒绝”的错误,因为每次我运行此代码都是在一个全新的实例上...
另外,我正在使用 paramiko 1.7.6。
2个回答

3
这是最近发行版中的常见问题,影响的不仅仅是paramiko。(我最近在将一个盒子从fedora2升级到最新版本时遇到了这个问题。一些ssh / sudo管理脚本中断了) 只要您可以访问远程主机,就可以编辑/etc/sudoers并注释掉行:Defaults requiretty。详细信息请参见sudoers手册页面:sudoers man page:如果设置了requiretty,则sudo仅在用户登录到真正的tty时运行。这将禁止诸如"rsh somehost sudo ls"之类的事情,因为rsh(1)不分配tty。因为在没有tty的情况下无法关闭回显,所以一些站点可能希望设置此标志以防止用户输入可见密码。此标志默认为关闭状态。

1
你好J.J.,我和kand有完全相同的问题。如果我理解正确的话,那么删除requiretty标志应该可以解决这个问题。然而,我仍然得到与上面相同的堆栈跟踪。我做错了什么?(如果这不是提问的正确地方,请谅解) - Patrick
是的,我也有同样的问题。这并没有真正解决我的问题,最终那一行甚至默认情况下都不在/etc/sudoers文件中。 - László Papp

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

考虑添加代码描述。这将有助于未来访问此帖子的用户。 - BusyProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接