2015-11-07 149 views
0

我正在用apache(mod_wsgi)使用flask。在Apache上運行ssh - >無法獲得僞終端:Permission denied

當我使用ssh模塊與外部命令subprocess.call("ssh ......",shell=True)



(我的Python瓶代碼:沒有錯)

ssh = "sshpass -p \""+password+"\" ssh -p 6001 "+username+"@"+servername+" \"mkdir ~/MY_SERVER\""

subprocess.call(ssh, shell=True)



我得到這個Ë在Apache error_log上的錯誤:Failed to get a pseudo terminal: Permission denied

我該如何解決這個問題?

回答

0

我認爲Apache的登錄shell是「/ sbin/nologin」。

如果你希望允許Apache來使用shell命令,修改/ etc/passwd和更改登錄shell像 「/斌/慶典」 另一個shell。

但是,這種方法容易受到安全威脅。許多python ssh模塊都可以在互聯網上使用。使用其中之一。

0

你在做什麼似乎非常不安全。如果你不能爲你的SSH連接使用Python庫,那麼你至少應該堵住shell=True的漏洞。無論如何,這裏的殼很少,在Python中使用它可以提供更多的控制,並移除大量的移動部分。

subprocess.call(['/usr/bin/sshpass', '-p', password, 
    '/usr/bin/ssh', '-T', '-p', '6001', '{0}@{1}'.format(username, servername), 
    'mkdir ~/MY_SERVER']) 

如果你不能硬編碼路徑sshpassssh,你至少應該確保你做任何的在此之前的環境中有一個有限的,可控PATH變量。

對於Failed to get a pseudo-terminal的修復通常是爲ssh命令行添加-T標誌。我是這麼做的。如果你的真實代碼實際上需要一個tty(其中mkdir顯然不),也許試驗-t,或者重定向標準輸入和標準輸出。

0

我在RHEL 7下有這個問題。這是由於SELinux阻止apache用戶訪問pty。解決方法:

  1. 禁用或設置SELinux爲寬容(檢查您的安全需求):編輯/ etc/selinux/config並重新引導。
  2. 允許阿帕奇以控制其目錄,用於存儲SSH密鑰:

    須藤-u阿帕奇

    CHOWN阿帕奇的/ etc /共享/ httpd的

    ssh來所需宿主,接受密鑰。