我想在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
答案 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