Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s popen、bash脚本和CentOS_Python_Apache_Bash_Popen - Fatal编程技术网

Python';s popen、bash脚本和CentOS

Python';s popen、bash脚本和CentOS,python,apache,bash,popen,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调用: subprocess.Popen(['/bin/bash', '/usr/bin

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

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

Python popen调用:

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”调用返回一个空行,而不是文件/目录列表

我通过/bin/Bash-per的建议执行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
简言之,在Python中使用popen启动进程时,是否存在限制进程访问文件的因素

更新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
也许可以试试:

#!/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()


顺便说一句,不要尝试运行“ls-l”。除非您给出shell=True,否则改为使用['ls','-l'.

目录权限,尽管在以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

你说的“无法访问”到底是什么意思?大概当您运行它时,
/usr/bin/tf
不起作用,但以什么方式运行?您通过
bash
运行
tf
而不是直接运行它,这有什么原因吗?这是作为什么用户运行的?该用户能否手动运行
tf
?使用
['/bin/bash','/usr/bin/tf']
只有在
tf
是一个shell脚本的情况下才会起作用,而如果它是一个二进制脚本,则不会起作用,因为它试图运行
/bin/bash/usr/bin/tf
,您自己试试看。tf是一个bash脚本,我应该更清楚。调查指出,popen模拟了一个shell,但缺少通用的shell功能,所以大多数人都会通过bash执行bash脚本。tf确实正确执行,但在脚本中我无法访问目录。执行用户是apache(由通过apache运行的Django发起)。直接执行tf(而不是通过bash)的工作原理类似,但无法访问一些常用命令(即cd)。我不需要它,我最初在没有Bash的情况下尝试过,但仍然得到了相同的结果。您仍然没有解释“无法访问目录”。这到底是什么意思?到底什么是失败的,是否有任何错误?在bash中,如果执行“ls/usr/lib/tfs”,我会得到一个空行。没有错误,只是一个空行。我确实得到了一个带有“ls/”甚至“ls/usr/lib”的文件/目录列表,只是没有tfs。注意,只有当我使用shell=True时才会出现这种情况。如果我不使用shell=True,那么我总是从“ls anything”中得到空行,除了当前目录(即“ls”而不是“ls”),这总是给出一个空行)。您如何从“[w]I在bash中”执行这些命令<代码>['/bin/bash','ls/usr/lib/tfs']?因为那不是你想象的那样。检查该子进程调用的stderr,看看您得到了什么。