我正在运行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
答案 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