在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'])
如果你不能硬编码路径sshpass
和ssh
,你至少应该确保你做任何的在此之前的环境中有一个有限的,可控PATH
变量。
对于Failed to get a pseudo-terminal
的修复通常是为ssh
命令行添加-T
标志。我是这么做的。如果你的真实代码实际上需要一个tty(其中mkdir
显然不),也许试验-t
,或者重定向标准输入和标准输出。
我在RHEL 7下有这个问题。这是由于SELinux阻止apache用户访问pty。解决方法:
- 禁用或设置SELinux为宽容(检查您的安全需求):编辑/ etc/selinux/config并重新引导。
-
允许阿帕奇以控制其目录,用于存储SSH密钥:
须藤-u阿帕奇
CHOWN阿帕奇的/ etc /共享/ httpd的
ssh来所需宿主,接受密钥。