我有一个像这样的shell脚本(在/usr/local/bin/esm-script/import-master.php中):
#! /bin/bash
echo "this is the file name $1."
script -c 'PGPASSWORD="pwd123" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "$1"' /dev/null
现在我通过这样的PHP脚本调用它:
$NewFile = "/var/www/...master-data.sql"; //full path
$strImport = '/usr/local/bin/esm-script/import-master.sh ' . $NewFile;
$strMsg = shell_exec($strImport);
echo "$strMsg<br />";
echo 'done!';
但是,当我运行PHP代码时,这是我在浏览器上收到的消息:
this is the file name /var/www/ESM-Backend/uploads/master-data.sql. Script started, file is /dev/null Script done, file is /dev/null sh: 1: cannot open : No such file Script started, file is /dev/null
done!
我不是一个shell脚本的人,所以我不知道我是否遗漏了什么。
我已经检查过带有sql文件的文件夹是否具有正确的权限(775)并且有数据(插入语句)。
那为什么这不起作用?任何想法和指导都非常感谢。
修改 我在shell脚本文件中对文件进行了硬编码,如下所示:
script -c 'PGPASSWORD="#UR!23" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "/var/www/ESM-Backend/uploads/master-data.sql"' /dev/null
它有效。但我需要它与通过PHP传递的文件一起运行。
答案 0 :(得分:1)
我认为问题可能在于您将参数传递给shell脚本的方式,即$NewFile
。从relevant SO Post开始,您可能希望尝试将参数括在双引号中,如下所示:
$strImport = '/usr/local/bin/esm-script/import-master.sh "'.$NewFile.'"';
我假设权限设置正确,您可以正常使用shell_exec()
通过PHP执行shell脚本。希望这会有所帮助。
答案 1 :(得分:0)
首先,非常感谢Vivek给我使用引号的想法。然后我认为错误是命令行参数包含在shell脚本文件中的单引号内的方式。
所以我尝试了以下内容:
script -c 'PGPASSWORD="#UR!23" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "'$1'"' /dev/null
是的,它解决了这个问题。
这个想法是$ 1参数是在脚本命令的引用字符串之外给出的。
我还怀疑如何在bash中连接字符串,这是我找到的一个很好的链接:How to concatenate string variables in Bash?