PHP exec, system или passthru все удаляют одинарные или двойные кавычки - PullRequest
2 голосов
/ 16 декабря 2011

Когда я пытаюсь выполнить команду для оболочки через exec / passthru / system функции php, она, похоже, удаляет кавычки из команды.

$str_file = '1323988284_700.csv';
exec("/usr/bin/lftp -e 'set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/{$str_file}; bye;' -u user,pass ftp://ftp.site.com/uploaddir/");

Вот результат проверки процесса

ps faxxx | grep lftp
4486 ?        S      0:00  |       \_ /usr/bin/lftp -e set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/1323988284_700.csv; bye; -u user,pass ftp://ftp.site.com/uploaddir/

Как вы видите, он показывает процесс, запущенный без одинарных кавычек.Это приводит к ошибке lftp.

Теперь он просто зависает до тех пор, пока я не убью его, я верю, что это потому, что если я введу в команду то, что показано в списке процессов, то это приведет к ошибке и оставит вас в lftpshell.

PHP Safemode выключен

Я попробовал следующее для цитаты

\'
\\'
\\\'
\\\\'
''
'''
''''

UPDATE


I 'Я хотел бы добавить это при дальнейшем тестировании ... если я создаю сценарий оболочки (run_ftp.sh) и запускаю его через php, он также удаляет кавычки из run_ftp.sh .., так что это заставляет меня думать, что это не php, вызывающий проблему.

SELinux выключен .. Существуют ли какие-либо другие меры безопасности, которые применяются в linux / bash, которые могут вызвать это?

Ответы [ 5 ]

1 голос
/ 14 марта 2013

Я нашел решение, используя функцию PHP proc_open . Это более сложный, но хорошо работает для меня.

$command = "lftp -u $USER,$PASSWORD -e 'get /tmp/backup-2012-08-15.zip; bye' sftp://$HOST";

$io = array();            
$p = proc_open($command,
           array(1 => array('pipe', 'w'),
                 2 => array('pipe', 'w')), $io);

/* Read output sent to stdout. */
while (!feof($io[1])) {
    echo "STDOUT: ".fgets($io[1]);
}
/* Read output sent to stderr. */
while (!feof($io[2])) {
    echo "STDERR: ".fgets($io[2]);
}

fclose($io[1]);
fclose($io[2]);
proc_close($p);

Этот код был основан на инструменте PHP SHELL . PDT: Извините за мой английский

1 голос
/ 16 декабря 2011
Команды

exec() и system() в PHP передаются через оболочку. Оболочка анализирует командную строку и удаляет кавычки. Однако он сохраняет всю строку как один параметр и переводит ее в фактический системный вызов execve() и т. Д.

Приложение получит вашу строку, заключенную в одинарные кавычки , в качестве одного параметра . Однако инструмент ps может просто перечислять их как есть.

Возможно, однако, что инструмент lftp выполняет собственный анализ (флаг -e звучит так). В этом случае могут помочь два уровня кавычек:

exec("lftp -e '\'multiple; commands; for the lftp thingy\''");
1 голос
/ 12 июля 2012

Кто-нибудь читал man-страницу lftp?

В разделе "ОПЦИИ" написано:

-e команды выполняют данные команды и не выходят из

-c командвыполняет указанные команды и завершает работу

Таким образом, ваш lftp зависает, потому что вы используете -e вместо -c.

Это не имеет ничего общего с PHP или оболочкой, удаляющей кавычки.Оболочка всегда так делает, вот как это работает.Вывод PS не предназначен для копирования и вставки.

0 голосов
/ 19 ноября 2018

1) Запишите аргументы в файл tmp (это сохранит одинарные кавычки).
2) exec("/usr/bin/lftp<tmp");

0 голосов
/ 16 декабря 2011

Существует самообъясняющееся UNIX SHELL Цитирование Учебное пособие , попробуйте!

...