Процитируйте еще раз:
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'
, что правильно дляsh
(и evil';reboot;: '.flac
как 'evil'\'';reboot;: '\''.flac'
вместо перезагрузки удаленной машины (у вас есть для запуска этого play
команда как root
? )).
Apache2 в Debian 9 и 10 запускается из systemd. он имеет
PrivateTmp=true
в его определении. Таким образом, процессы, запущенные с сервера, не имеют доступа к обычным каталогам /tmp и /var/tmp. Вместо этого у них есть свои собственные каталоги.
Вы можете либо переместить сокет из /tmp, либо запустить apache2 с
PrivateTmp=false