передать переменную из PHP в скрипт оболочки Ubuntu

У меня есть сценарий оболочки, как это (в /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!

Я не пишу сценарии, поэтому я не знаю, что я что-то упустил.

Я проверил, что папка с файлом sql имеет правильные разрешения (775) и содержит данные (операторы вставки).

Так почему же это не работает? Любые идеи и рекомендации действительно приветствуются.

РЕДАКТИРОВАТЬ
Я жестко запрограммировал файл в файле сценария оболочки следующим образом:

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

Решение

Я думаю, что проблема может быть в том, как вы передаете аргумент в свой скрипт оболочки, т.е. $NewFile, Из соответствующий SO Post, вы можете попробовать заключить аргумент (ы) в двойные кавычки:

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

Я предполагаю, что разрешения установлены правильно, и вы можете использовать shell_exec() нормально выполнять сценарии оболочки через PHP. Надеюсь это поможет.

1

Другие решения

Во-первых, большое спасибо за то, что Вивек дал мне идею использовать цитаты. Затем я подумал, что ошибка заключалась в том, что аргумент командной строки заключался в одинарные кавычки в файле сценария оболочки.

Поэтому я попробовал следующее:

script -c 'PGPASSWORD="#UR!23" /usr/bin/psql --host localhost --port 5432 --username "postgres" --no-password --quiet "dbESM" < "'$1'"' /dev/null

И да, это решило проблему.

Идея состоит в том, что аргумент $ 1 был задан вне строки в кавычках для команды сценария.

У меня также были сомнения относительно того, как объединить строки в bash, и вот отличная ссылка, которую я нашел для этого: Как объединить строковые переменные в Bash?

0

По вопросам рекламы [email protected]