2011-04-26 43 views
5

我一直在寻找网络一段时间现在解决我的问题,没有运气。帕拉米科和sudo

我的问题是,我似乎无法得到与paramiko运行sudo命令。

起初,我想简单地使用SSHClient()exec_command(命令)函数来执行sudo命令,但这样的错误:

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

接着,将这个职位的建议:How to make a sudo command using Paramiko,我尝试这样做:

#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的,所以我很困惑,为什么我会得到连接拒绝错误,因为每次我运行这个代码,它是在一个新的实例...

此外,我使用paramiko 1.7.6。

回答

3

这是近期分布和影响的一个常见问题,而不仅仅是paramiko。 (当我从Fedora2升级到最新版本时,我碰到了它)几个ssh/sudo管理脚本破坏了)

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

详细的sudoers man page

requiretty

如果设置,当 用户登录我须藤将只运行n到真正的tty。这个 将不允许诸如“rsh somehost sudo ls”之类的事情,因为rsh(1)确实没有 没有分配tty。由于 可能在没有tty存在时关闭回显,因此某些站点可能会用 来设置此标志以防止用户 输入可见密码。这个 标志默认是关闭的。

+1

你好J.J.,我有和KAND完全一样的问题。如果我理解这个权利,那么移除这个requiretty标志应该可以解决这个问题。不过,我仍然可以得到与上面相同的堆栈跟踪。我究竟做错了什么? (道歉,如果这是错误的地方问) – Patrick 2011-07-24 12:26:16

+0

是的,同样的问题在这里。这并不能真正解决我的问题,并且最终该行甚至在默认情况下甚至不在/ etc/sudoers文件中。 – lpapp 2013-12-10 09:07:38

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

考虑添加你的代码的描述。这将有助于未来的用户访问此帖子。 – 2017-04-10 16:49:29