在Apache上运行ssh - >无法获得伪终端:Permission denied

问题描述:

我正在用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

我该如何解决这个问题?

我认为Apache的登录shell是“/ sbin/nologin”。

如果你希望允许Apache来使用shell命令,修改/ etc/passwd和更改登录shell像 “/斌/庆典” 另一个shell。

但是,这种方法容易受到安全威胁。许多python ssh模块都可以在互联网上使用。使用其中之一。

你在做什么似乎非常不安全。如果你不能为你的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,或者重定向标准输入和标准输出。

我在RHEL 7下有这个问题。这是由于SELinux阻止apache用户访问pty。解决方法:

  1. 禁用或设置SELinux为宽容(检查您的安全需求):编辑/ etc/selinux/config并重新引导。
  2. 允许阿帕奇以控制其目录,用于存储SSH密钥:

    须藤-u阿帕奇

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

    ssh来所需宿主,接受密钥。