如何更改php的exec()的shell

时间:2009-11-24 20:16:04

标签: php bash shell ubuntu exec

我想在ubuntu服务器上使用php的exec()函数。 问题是,我总是得到一个错误,找不到命令。例如,使用

exec("echo 123");

打印

  

sh:/ echo:not found

对我来说,当我想使用bash时,看起来php正在使用sh shell。 我尝试在/ etc / passwd中更改www-data的shell,但这也无济于事。

有没有人知道问题可能来自哪里,或者我如何为php的ubuntu用户更改shell。

谢谢,蒂莫


[编辑]

也许这会有所帮助:

我从ssh调用bash脚本作为timo,这个脚本调用一个php脚本,它使用exec。我知道,这听起来很奇怪,但它是更大的开发环境的一部分......

关键是,我不确定,exec中的脚本执行的用户是哪个用户。


[编辑]

到现在为止,我发现必须涉及另一个权利问题。 即使我尝试从exec中调用bash脚本test.sh(通过它的完整路径!),php test.php也会说。

  

sh:/test.sh:not found

5 个答案:

答案 0 :(得分:10)

尝试使用shell_exec()。 exec不应该调用任何shell来执行你的程序。或者,您可以使用exec调用bash,如

exec("/bin/bash -c \"echo $foo > bar.txt'\"")

答案 1 :(得分:0)

我认为问题在于没有$ PATH设置。尝试使用二进制文件的完整路径,即     / bin中/回波

答案 2 :(得分:0)

如果你想做的是:

/usr/bin/mysql --user=asdf --password=asdf mydb < ./dump.sql

然后我想这会起作用(无论shell):

/usr/bin/mysql --user=asdf --password=asdf mydb < /full/path/to/dir/dump.sql

答案 3 :(得分:0)

无论您使用哪种功能,我都认为PHP内部会调用/ bin / sh(在Windows上为cmd.exe)。

在Linux系统的终端中运行ls -l /proc/$$/exe | sed 's%.*/%%'会告诉您正在使用的Shell,默认情况下在Ubuntu终端中为bash。如果您在Ubuntu中运行以下命令:

<?php

exec('ls -l /proc/$$/exe | sed \'s%.*/%%\'', $res);
// or:
//$res = shell_exec('ls -l /proc/$$/exe | sed \'s%.*/%%\'');
echo(json_encode($res));

无论使用哪种功能,都将得到[“破折号”]。如果将/ bin / sh更改为指向bash而不是破折号,则PHP的结果将更改为bash,但我不建议您这样做。

长话短说,如果不修改整个服务器的默认shell或从源代码编译PHP,则可能无法更改它。

如果您想进一步解决这个问题,它可能与PHP源代码中的ext / standard / proc_open.c和ext / standard / exec.c(所有这些功能都在其中,系统,通过等)有关。 ,但老实说,它击败了我。

答案 4 :(得分:0)

我在使用 Debian Docker PHP 映像时遇到问题,这对我有帮助:

https://www.reliableembeddedsystems.com/wiki/index.php?title=Make_bash_default_shell

/bin/sh 是破折号的符号链接,它可能更好但不适用于我的脚本。

        echo "dash dash/sh boolean false" | debconf-set-selections
        dpkg-reconfigure -f noninteractive dash