我一直在寻找网络一段时间来解决我的问题,但没有运气。
我的问题是我似乎无法使用suram命令与paramiko一起运行。
首先,我尝试使用SSHClient()。exec_command(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命令,所以我很困惑为什么我会得到Connection Refused错误,因为每次运行此代码时它都在一个全新的实例...
另外,我正在使用paramiko 1.7.6。
答案 0 :(得分:3)
这是近期分布和影响的常见问题,而不仅仅是paramiko。 (前几天,当我将一个盒子从fedora2升级到最新版时,我遇到了它。几个ssh / sudo管理脚本坏了)
只要您有权访问远程主机,就可以修改/etc/sudoers
并注明该行:Defaults requiretty
sudoers man page中的详细信息:
<强> requiretty 强>
如果设置,sudo只会在运行时运行 用户登录到真正的tty。这个 将禁止“rsh等” somehost sudo ls“自rsh(1)以来 不分配tty。因为它不是 有可能在那里关闭回声 没有tty存在,一些网站可能与 设置此标志以防止用户 输入可见密码。这个 标志默认是关闭的。
答案 1 :(得分:0)
stdin, stdout, stderr = client.exec_command(cmd, get_pty=True)