Intereting Posts
Отключение xscreensaver, когда firefox воспроизводит видео HTM5 Есть ли что-то важное в / var? разрешение папки с папками ftp и apache avahi: Как связать имя хоста с адресом eth0: avahi, сгенерированным avahi-autoipd? Есть ли способ использовать знак фунта «#» как псевдоним? IPTables – порт для другого ip и порта (изнутри) База данных MySQL Выключить звуковой сигнал Xorg Могу ли я безопасно удалить файл ~ / Trash? FTP через SSL в AIX (UNIX) Когда sh является символической ссылкой на bash или тире, bash ограничивает себя соблюдением POSIX, поэтому он должен быть на 100% совместим с sh? Увеличится ли средняя загрузка моего ящика Linux, если он достигнет дескрипторов файлов или ограничений TCP-соединений? icons управления громкостью и сетевые уведомления становятся невидимыми и взаимоисключающими после обновления до Mint 19 Почему в этом простом случае не является седой жадный? Ускоритель загрузки консоли, который одновременно загружает * несколько файлов

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 .