【发布时间】:2013-06-21 12:08:09
【问题描述】:
我有一个脚本,它接受一些参数并将heredoc 的输出重定向到另一个文件,以便为Web 服务器创建一个虚拟主机文件。 当我在命令行中运行脚本时,它执行良好并创建了文件,但是当我使用 PHP 的 exec 或 shell_exec 运行它时,它不会创建文件。其他一切(回显或尝试简单地返回输出而不是重定向它)运行良好 - 只是创建文件不会发生,我没有收到任何迹象表明存在问题。
这是我的代码: create_vhost.sh:
#!/bin/bash
#Use the template to create the vhost file
echo "Creating vhost file in sites-available"
sudo /absolute/path/to/vhost_template.sh $1 $2 > /etc/nginx/sites-available/$2
service nginx restart
我像这样运行上面的脚本:/absolute/path/to/create_vhost.sh site_id domain.com,它可以完美地使用带有终端的 ssh。
作为参考,vhost_template文件是这样的:
#!/bin/sh
SITE_ID=$1
DOMAIN=$2
#define the template.
cat << EOF
[template code here with $SITE_ID and $DOMAIN parameters somewhere]
EOF
但是,如果我像这样在 PHP 中运行它:
return shell_exec("/absolute/path/to/create_vhost.sh site_id domain.com");
我得到了很好的输出,但没有创建文件!就像我说的,如果我放弃重定向,那么即使在 PHP 中,我也可以毫无问题地看到模板文件的输出。
我已经看了好几个小时了,但我只是被难住了。有什么建议吗?
编辑:只是想我会提到我认为这可能是一个权限问题,但我尝试在 shell_exec() 中使用 sudo,并使用 visudo 为 www-data 用户提供 sudo 权限。还是一样的问题……
【问题讨论】:
-
可能网络服务器用户对您尝试在其中创建文件的目录没有写入权限
-
@DevZer0 可能不是,但是如果我使用 sudo 来运行我的脚本,那不再重要了吗?还是我只是愚蠢。我以前使用过由网络服务器用户运行并写入同一目录的另一个脚本(这个是 ruby,而不是 bash)......正如我在帖子中提到的,我尝试使用 sudo 运行,但仍然没有运气。
-
运行这个,看看你会得到什么
return shell_exec("/absolute/path/to/create_vhost.sh site_id domain.com 2>&1"); -
好吧,差不多了。在没有 sudo 的情况下运行,我几乎对脚本的每一行都拒绝了权限。使用 sudo,PHP 脚本根本不返回任何数据......所以我似乎在某个地方搞砸了,允许 www-data 用户对该文件具有 root 权限。谢谢,我会再调查一下……至少现在我知道出了什么问题。
-
没问题欢迎来到 Stack Overflow
标签: php bash exec io-redirection