Командные файлы php system() из-за «&» в пароле

Я запускаю следующую команду:

$cmd = escapeshellcmd( "echo '$password' | sudo -S mv \"$old\" \"$new\" " );
system( $cmd, $out );

Это работает, когда $password не содержит &, но не работает, если содержит. Как я могу разрешить & и любые другие специальные символы в пароле?

Спасибо

Во-первых, это такая плохая идея... ваш пользователь веб-сервера находится в группе sudo? В самом деле?

Honk der Hase 16.05.2022 19:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте escapeshellcmd() для всей команды, используйте escapeshellarg() для отдельных аргументов.

$password_esc = escapeshellarg($password);
$cmd = "echo $password_esc | sudo -S mv '$old' '$new'";
system($cmd, $out);

Вам не нужны кавычки вокруг $password_esc, потому что escapeshellarg() добавляет их.

Спасибо, но это, кажется, не работает. Глядя на журнал ошибок apache2, я вижу: sh: R6aAdf3C: command not found [sudo] password for root: sudo: no password was provided R6aAdf3C — это бит пароля после &

Tom 16.05.2022 18:23

Я проверил свой код и не могу воспроизвести эту ошибку.

Barmar 16.05.2022 18:30

Я повторно проверил, и я все еще получаю то же сообщение. Для тестирования я использую пароль Qr450dwY&R6aAdf3C, и журналы ошибок возвращают приведенный выше вывод. Если я уберу &, это сработает.

Tom 16.05.2022 18:34

Я могу воспроизвести это, только если у меня есть echo '$password_esc' вместо echo $password_esc. Вам не нужно заключать его в кавычки, escapeshellarg() сделает это за вас.

Barmar 16.05.2022 18:37

Мои команды: $password_esc = escapeshellarg($password); $cmd = "echo $password_esc | sudo -S mv '$old' '$new'"; поэтому я не добавляю лишних кавычек.

Tom 16.05.2022 18:55

Я не знаю, почему у вас по-другому. Я проверил это, и я не получаю эту ошибку. Единственная ошибка, которую я получаю, заключается в том, что пароль неверен, так как это не мой правильный пароль. Если я добавлю кавычки, я получу ошибку, которую вы показываете.

Barmar 16.05.2022 18:56

перепроверил сегодня утром и заметил, что идет не так. Скрипт делает cp перед mv Мне нужно escapeshellarg пароль, используемый для этого. Спасибо

Tom 17.05.2022 10:01

Другие вопросы по теме