从PHP简单的Linux脚本返回“Hello World”

时间:2016-11-26 06:47:43

标签: php linux bash shell

好的,很高兴接受选票来解决我的问题。我是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"

...谢谢

3 个答案:

答案 0 :(得分:3)

文件系统权限

在您的情况下,由于file system permissions不足,脚本可能无法执行。在Linux中,如果文件具有为当前用户设置的可执行位或用户组,例如:

,则只允许写入文件路径来执行文件。
~/scripts/abc.php
./script.sh

否则,您应该将该文件作为适当程序的参数传递,例如:

php ~/scripts/abc.php
/usr/bin/php ./script.php
bash ./script.sh

您可以使用lsstat命令检查文件系统权限,例如:

$ 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 ...)