好的,很高兴接受选票来解决我的问题。我是Linux的新手,但是我已经在Linux云服务器上托管了我的基于PHP的站点,并且需要运行FFMPEG脚本来转换视频。在Windows下我有完整的应用程序工作但在Linux下我似乎无法得到一个基本的脚本工作,并想知道是否有人可以指出我正确的方向。我已阅读过关于此的无数帖子,例如Run bash Command from PHP,但它无助于我深入了解它。
这是我到目前为止所拥有的。
$old_path = getcwd();
chdir('videos/');
$new_path = getcwd();
echo('newpath '.$new_path); <-- this outputs 'old_path/videos'
$temp= shell_exec('./testScript.sh');
echo ($temp) <-- produces nothing
测试脚本 testScript.sh 位于视频目录中,只是
echo "hello world"
...谢谢
答案 0 :(得分:3)
文件系统权限
在您的情况下,由于file system permissions不足,脚本可能无法执行。在Linux中,如果文件具有为当前用户设置的可执行位或用户组,例如:
,则只允许写入文件路径来执行文件。~/scripts/abc.php
./script.sh
否则,您应该将该文件作为适当程序的参数传递,例如:
php ~/scripts/abc.php
/usr/bin/php ./script.php
bash ./script.sh
您可以使用ls
或stat
命令检查文件系统权限,例如:
$ stat --format='perm: %A | user: %U | group: %G' 1.sh
perm: -rwxr-xr-x | user: ruslan | group: users
$ ls -l 1.sh
-rwxr-xr-- 1 ruslan users 1261 Nov 26 11:47 1.sh
在上面的示例中,可执行位设置为用户ruslan
和组users
,但未设置为其他(r--
)。其他人只允许读取(r
)文件,但不能执行或写入文件。
要设置可执行位,请使用chmod
命令,例如:
# For the user
chmod u+x file.sh
# For the group
chmod g+x file.sh
更好地控制命令执行
shell_exec
函数返回写入标准输出描述符的内容。如果命令不打印或失败,则返回NULL
。例如:
$out = shell_exec("ls -l inexistent-file");
var_dump($out); // NULL
因此,您无法使用shell_exec
很好地控制错误情况。我建议改为使用prop_open
:
$cmd = 'ls -l 1.sh inexistent-file';
// Descriptors specification
$descriptors = [
1 => ['pipe', 'w'], // standard output
2 => ['pipe', 'w'], // standard error
];
// Open process for the command
$proc = proc_open($cmd, $descriptors, $pipes);
if (!is_resource($proc))
die("failed to open process for $cmd");
if ($output = stream_get_contents($pipes[1])) {
echo "output: $output\n";
}
fclose($pipes[1]);
if ($errors = stream_get_contents($pipes[2])) {
fprintf(STDERR, "Errors: %s\n", $errors);
}
fclose($pipes[2]);
// Close the process
if (($status = proc_close($proc)) != 0)
fprintf(STDERR, "The command failed with status %d\n", $status);
<强>认领强>
考虑将shebang用于可执行脚本。例子:
#!/bin/bash -
#!/usr/bin/php
答案 1 :(得分:2)
要做的第一件事是检查PHP实际上是否允许运行shell脚本。
在命令提示符下运行以下命令
php -i | grep disable_functions
这应该回复一个看起来像这样的行
disable_functions => no value => no value
但是如果它返回一个包含shell_exec的字符串,就像这样(它可能包含其他内容)
disable_functions => shell_exec => shell_exec
然后你将无法继续。 此时的诀窍是尝试本地php.ini文件,看看是否可以关闭违规指令。
要执行此操作,请将php.ini文件复制到您正在使用的目录中。找到disable_functions =&gt; shell_exec =&gt; shell_exec行删除shell_exec。
然后在命令行上运行脚本,就像这样
php -c php.ini myscript.php
然而,在云托管环境中这可能都非常受限制,因为访问shell显然会造成一定程度的混乱。
您也可以使用apache config和.htaccess执行此操作。
如果以上所有都正常则检查testScript.sh的权限并将其设置为可执行文件。要做到这一点是
chmod +x testScript.sh
可悲的是,我敢打赌,受限制的云服务器环境会阻止你。
答案 2 :(得分:1)
在shell脚本中必须编写和解释器。
试试这个:shell_exec(&#39; php ./testScript.sh');
编辑:用正确的解释器更改php(bash,sh ...)