Я запускаю следующую команду:
$cmd = escapeshellcmd( "echo '$password' | sudo -S mv \"$old\" \"$new\" " );
system( $cmd, $out );
Это работает, когда $password
не содержит &
, но не работает, если содержит.
Как я могу разрешить &
и любые другие специальные символы в пароле?
Спасибо
Не используйте 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 — это бит пароля после &
Я проверил свой код и не могу воспроизвести эту ошибку.
Я повторно проверил, и я все еще получаю то же сообщение. Для тестирования я использую пароль Qr450dwY&R6aAdf3C
, и журналы ошибок возвращают приведенный выше вывод. Если я уберу &
, это сработает.
Я могу воспроизвести это, только если у меня есть echo '$password_esc'
вместо echo $password_esc
. Вам не нужно заключать его в кавычки, escapeshellarg()
сделает это за вас.
Мои команды: $password_esc = escapeshellarg($password); $cmd = "echo $password_esc | sudo -S mv '$old' '$new'";
поэтому я не добавляю лишних кавычек.
Я не знаю, почему у вас по-другому. Я проверил это, и я не получаю эту ошибку. Единственная ошибка, которую я получаю, заключается в том, что пароль неверен, так как это не мой правильный пароль. Если я добавлю кавычки, я получу ошибку, которую вы показываете.
перепроверил сегодня утром и заметил, что идет не так. Скрипт делает cp
перед mv
Мне нужно escapeshellarg
пароль, используемый для этого. Спасибо
Во-первых, это такая плохая идея... ваш пользователь веб-сервера находится в группе sudo? В самом деле?