2011-04-26 41 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