Python popen,bash脚本和CentOS

时间:2014-10-01 18:33:53

标签: python apache bash popen

我正在运行Apache的Django服务器,它通过subprocess.popen启动Bash脚本(/ usr / bin / tf)。我的问题是我无法从Bash脚本访问特定目录,但它实际上似乎不是权限问题。通过在Bash脚本中运行 whoami 确认的执行用户是 apache

注意:/ usr / bin / tf是通过Bash执行的Bash脚本。 / usr / lib / tfs是包含Bash脚本依赖项的目录。

Python popen call:

subprocess.Popen(['/bin/bash', '/usr/bin/tf'],
                 env=env,
                 stderr=subprocess.PIPE,
                 stdout=subprocess.PIPE,
                 close_fds=(os.name != 'nt'))

我也尝试过使用 shell = True (只是为了看看是否可以解决问题)。在所有情况下,除 shell = True 之外,我甚至无法从 ls / 获得有效列表。使用 shell = True ,我可以看到 ls / 一直到 ls / usr / bin ;但是,我仍然无法访问/ usr / lib / tfs / lib中的tf的libs文件夹。我可以在/ usr / lib中看到内容。通过“无法访问”,我的意思是“ls”调用返回一个空行而不是文件/目录列表。

我按照this page的建议通过/ bin / bash执行Bash脚本。

我已经尝试了一些方法来确保权限至少可以起作用:

chown -R apache:apache /usr/lib/tfs
chmod -R 7777 /usr/lib/tfs (obviously bad but should have worked...)

chown -R --reference=/usr/lib /usr/lib/tfs
chmod -R --reference=/usr/lib /usr/lib/tfs

简而言之,使用popen在Python中启动时是否存在限制进程文件访问的内容?

更新2 执行“ls -la / usr / lib”已经显示了一些非常奇怪的东西,它们都是/ usr / lib / tfs的目录权限。

d??????????  ? ?    ?         ?            ? tfs
drwxr-xr-x.  3 root root   4096 Jul  1 17:08 udev
drwxr-xr-x. 15 root root   4096 Jul 31 14:09 vmware-tools
drwxr-xr-x.  4 root root   4096 Jul  7 04:26 x86_64-redhat-linux5E
drwxr-xr-x.  2 root root   4096 Jul  1 17:10 yum-plugins

2 个答案:

答案 0 :(得分:0)

也许试试:

#!/usr/local/cpython-3.4/bin/python

# pylint: disable=superfluous-parens
# superfluous-parens: Parentheses are good for clarity and portability

'''Start tf'''

# Runs on 2.[4567] and 3.[01234]

import os
import subprocess


def main():
    '''Main function'''
    stuff = subprocess.Popen(
        ['/bin/bash', '/usr/local/bin/tf'],
        env=os.environ,
        stderr=subprocess.PIPE,
        stdout=subprocess.PIPE,
        close_fds=(os.name != 'nt'),
    )
    stdout, dummy = stuff.communicate()
    os.write(1, stdout)

main()

HTH

顺便说一下,不要试图运行“ls -l”。取而代之的是['ls',' - l'],除非你给shell = True。

答案 1 :(得分:0)

目录权限虽然在以root或apache登录时看起来很好(使用 su apache -s / bin / bash )但是执行的bash脚本被搞砸了。我怀疑这些目录来自一台Windows机器,并且涉及无效的权限设置。

修复实际上只是复制目标目录并使用副本,删除旧目录。

mv /usr/lib/tf /usr/lib/tfold
cp /usr/lib/tfold /usr/lib/tf
rm -rf /usr/lib/tfold