Я пытаюсь запустить скрипт test.sh
(который находится на моей локальной машине) на удаленном сервере. test.sh
принимает аргумент, который часто состоит из нескольких слов.
тест.ш:
#!/bin/bash
while getopts b: opt;
do
case $opt in
b)
bval="$OPTARG"
;;
esac
done
echo $bval
На моем локальном компьютере все работает отлично:
./test.sh -b "multi word arg"
Выход:
multi word arg
Но когда я запускаю его на удаленном сервере, вот так:
ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"
Я получаю только:
multi
Есть идеи, как передать в скрипт полный аргумент из нескольких слов?
решение1
Вам нужен другой уровень цитат:'"multi word arg"'
Первый уровень кавычек удаляется вашей локальной оболочкой и ssh
получает multi word arg
. Затем ssh
, на удаленной системе, запускается что-то вроде $SHELL -c "bash -s -- -b multi word arg"
(где $SHELL
находится ваша оболочка входа, скорее всего, снова bash). Затем оболочка входа удаляет кавычки (ничего не удаляется) и разбивает слова, поэтому вы получаете одно слово.
Проиллюстрировать:
% ssh 192.168.0.2 'printf :%s:\\n' '"foo bar baz"'
:foo bar baz:
% ssh 192.168.0.2 'printf :%s:\\n' 'foo bar baz'
:foo:
:bar:
:baz: