【问题标题】:pass variable from PHP to Ubuntu shell script将变量从 PHP 传递到 Ubuntu shell 脚本
【发布时间】:2014-12-11 13:31:54
【问题描述】:

我有一个这样的 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 传递的文件一起运行。

【问题讨论】:

  • 你想用这些脚本做什么?据我了解,我认为您想从使用 php 脚本中定义的路径定义的文件中导入 SQL,您能告诉我为什么要将 php 文件传递​​给您的 postgresql 命令吗?
  • 我没有将 PHP 文件传递​​给 postgres。相反,我将 SQL 数据文件的名称传递给脚本。这个想法是使用它并将数据插入到 postgresql 数据库中。
  • 那么,为什么 $NewFile = "/var/www/...master-data.php" ?
  • 谢谢阿纳斯 - 这是一个错字。

标签: php shell postgresql-9.1


【解决方案1】:

我认为问题可能在于您将参数传递给 shell 脚本的方式,即$NewFile。在relevant SO Post 中,您可能想尝试用双引号将参数括起来,如下所示:

$strImport = '/usr/local/bin/esm-script/import-master.sh "'.$NewFile.'"';

我假设权限设置正确,并且您可以正常使用shell_exec() 通过 PHP 执行 shell 脚本。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    首先,非常感谢 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?

    【讨论】: