Intereting Posts
Как найти и заменить в одном поле на основе значения в другом поле? Не удается подключиться к серверу EC2: «Соединение отказано в порту 22» двуличие: как создать и восстановить полную резервную копию системы Поддерживается ли в Linux поддержка звуковой карты Sound Sound Blaster X-FI Surround 5.1 SB1090 USB? systemd: не удалось создать coredump в файловой системе только для чтения Ограничьте пользователя, чтобы он не имел права делать что-либо Можно ли загружать USB-устройство из GRUB? Yum update / install для любого пакета дает мне следующую ошибку. Какие действия я должен предпринять, чтобы преодолеть это? Как я могу переключиться на свой встроенный аудиоконтроллер? В чем разница между построением исходного кода и использованием пакета установки? xterm login prompt not gnome login prompt Тайм-аут Connecttrack TCP для штатного неработающего Почему расширение файла работает для имен файлов с символом новой строки? Высокая скорость разряда Создайте файл gzip с заданным размером

Bash – переменная содержит знаки доллара

У меня есть скрипт php, который передает переменную в скрипт bash:

exec("bash.sh $path") 

Скрипт bash выглядит так:

 #!/bin/bash path=$1 echo $path 

Если путь заканчивается знаками доллара, например, так: myfile.$$$

Вывод: myfile.32577$

Как я могу избежать долларов в переменной, чтобы эхо было точным?

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

    Руководство по PHP для exec явно напоминает процитирование команды или аргументов для обработки оболочки:

    Предупреждение
    При разрешении передачи пользовательских данных в эту функцию используйте escapeshellarg () или escapeshellcmd (), чтобы гарантировать, что пользователи не смогут обмануть систему в выполнении произвольных команд.

    Я не могу найти версию system() / exec() / others, которая позволяла бы запускать команды напрямую (например, версия с несколькими аргументами system() / exec() в Perl), поэтому может случиться так, что единственный опция заключается в использовании escapeshellarg() . Он заключает аргумент в одинарные кавычки и обрабатывает одинарные кавычки.

     $ php -r '$foo="$$$"; system("/bin/echo $foo");' 21836$ $ php -r '$foo="$$$"; system("/bin/echo " . escapeshellarg($foo));' $$$ 

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


    Кроме того, как упоминает Кусалананда, (и как обычно) вы все еще хотите заключить в кавычки переменные в вашем скрипте Bash. Так что используйте echo "$path" вместо echo $path . Знак доллара здесь не проблема, символы пробела и глобуса.

    Увидеть:

    • Разделение слов на вики Грега, и
    • Когда необходимо двойное цитирование?

    Если эта функция exec в php реализована с помощью sh -c cmd , вам нужно вызвать:

      exec("bash.sh '$path'") 

    Внутри вашего сценария оболочки, похоже, нет проблем, так как $$ будет развернут, только если вы используете eval .