我正在尝试在PHP中使用后端运行python脚本的POC。 Web服务器是Docker容器中的Apache。
这是PHP代码:
$command = escapeshellcmd('/usr/local/test/script.py');
$output = shell_exec($command);
echo $output;
当我使用后端执行python脚本时,我们收到了一个用于创建文件的权限被拒绝错误。
我的python脚本:
#!/usr/bin/env python
file = open("/tmp/testfile.txt","w+")
file.write("Hello World")
file.close()
这是我得到的错误:
IOError:[Errno 13]权限被拒绝:'testfile.txt'
对于使用权限的目录,如下所示,
drwxrwsr-x 2 1001 www-data 4096 5月8日05:35。
drwxrwxr-x 3 1001 1001 4096 5月3日08:49 ..
对此有何想法?我该如何克服这个问题?
答案 0 :(得分:2)
开始是在任何脚本环境中拥有相对路径的非常糟糕的做法。首先,重写代码以使用完整路径,例如/usr/local/test/script.py
和/tmp/testfile.txt
。我的猜测是你的剧本试图写到一个与你想象的不同的地方。
当您知道文件的确切位置时,请转到该目录并运行ls -la
并检查该目录的权限。您希望它可以与Web服务器运行时由同一用户或组写入。
查看您显示的权限,您没有用户能够写入目录,只有每个人和组。您需要添加用户写入权限 - chmod u+w /tmp
才能完成工作。
答案 1 :(得分:1)
我认为问题在于您正在尝试写入b
目录中的现有文件。通常def f(n):
X=np.random.uniform(-0.3,0.3,(n))
Y=np.random.uniform(-0.3,0.3,(n))
D=np.array(np.exp(1j*(5*np.pi/6)*np.abs((a+X[a])-(b+Y[b]))))
D[diag,diag]=1-1j/np.sqrt(3)
return D
Ddiff = np.abs( np.dstack( inv(
[f(n) for _ in range(500)]
)
)
)
D2diff = gmean(Ddiff,axis=-1)
will have the sticky permission bit set.这意味着只有文件的所有者才有权写入或删除它。如果在父目录上设置了粘滞位,则对文件的组写权限无关紧要。
所以如果这是你的/ tmp
的内容/tmp/
我们可能会假设群组/tmp/
中的用户应该能够写入$ ls -al /tmp
drwxrwxrwt 5 root root 760 Apr 30 12:00 .
drwxr-xr-x 21 root root 4096 Apr 30 12:00 ..
-rw-rw---- 2 1001 www-data 80 May 8 12:00 testfile.txt
。但事实并非如此,因为www-data
(/ tmp /目录本身)设置了粘滞位(权限部分中的testfile.txt
表示这一点)。
这里设置粘滞位的原因是每个人都应该能够在那里写文件,但不必担心其他用户可能会修改我们的临时文件。
为避免权限错误,您可以使用标准库tempfile模块。此代码将创建一个唯一的文件名,例如.
,因此t
已存在并不重要。
testfile.JCDxK2.txt