Почему скрипт Perl CGI может не подключиться к MySQL, если он работает из консоли?

Процитируйте еще раз:

if [ "$#" -eq 1 ] ; then
    echo "   Playing..." "$1"
    sshpass -p "$passwd" ssh root@192.168.43.10 -p "$port" "play '$1'"
else
    echo "  No Input audio file."
fi

Дело в том, что первый слой кавычек "$@"расширяется при выполнении команды sshpass. Таким образом, к тому времени, когда вы входите в систему, запускаете удаленную оболочку и выполняете play, у вас есть строка без кавычек, поэтому ваш скрипт задыхается от пробелов. Заключая его во второй слой кавычек, вы гарантируете, что он будет передан удаленной команде в кавычках.

Это должно работать, если i )на удаленной машине запущена shили bashили похожая оболочка и ii )имена ваших файлов не содержат одинарных кавычек. Чтобы сделать его действительно надежным, см. Как выполнить произвольную простую команду через ssh, не зная оболочки входа удаленного пользователя? .

Для правильного цитирования произвольной строки (или даже списка произвольных строк, чтобы вы могли передать более одного аргумента вplay)в синтаксисе sh,мы можем использовать эту shquote()функцию, упомянутую там:

shquote() {
  LC_ALL=C awk -v q=\' -v b='\\' '
    BEGIN{
      for (i=1; i

Он будет цитировать Sgt. Pepper's lonely hearts club band.flacкак 'Sgt. Pepper'\''s lonely hearts club band.mp3', что правильно дляshevil';reboot;: '.flacкак 'evil'\'';reboot;: '\''.flac'вместо перезагрузки удаленной машины (у вас есть для запуска этого playкоманда как root? )).

0
10.09.2019, 21:40
1 ответ

Apache2 в Debian 9 и 10 запускается из systemd. он имеет

PrivateTmp=true

в его определении. Таким образом, процессы, запущенные с сервера, не имеют доступа к обычным каталогам /tmp и /var/tmp. Вместо этого у них есть свои собственные каталоги.

Вы можете либо переместить сокет из /tmp, либо запустить apache2 с

PrivateTmp=false
0
04.04.2020, 16:30

Теги

Похожие вопросы