Как запустить локальный скрипт с пробелами в аргументах на удаленной машине через несколько SSH?

Если вы хотите иметь ровно одно место для каждой точки монтирования, кроме root /, вы можете использовать стандарт /mnt/my-mount-point. И, наконец, символическая ссылка, если это необходимо.

Я делаю это, например, для своей домашней папки и нахожу ее очень чистой, но в конечном счете -это мнение основано на мнении.

Сценарий

Я монтирую /dev/sda1в /mnt/downloads, но хочу получить доступ к этой папке из ~/downloads. Поэтому я делаю символическую ссылку с помощью утилиты ln:

ln -s /mnt/downloads $HOME/downloads

А теперь делаем

cd ~/downloads

Эквивалентно

cd /mnt/downloads
0
17.03.2020, 07:53
1 ответ

Если вы передаете его через 2 команды ssh, вы должны заключить в кавычки -escape-строку ДВАЖДЫ. Сделайте это с помощью дополнительного назначения PHRASE=${PHRASE@Q}.

Однако имейте в виду, что и ${var@Q}, и printf %q(, описанные ниже ), будут использовать escape-формат $'...'quote -, который может не поддерживаться удаленной оболочкой .

После исправления последней строки скрипта test.shна echo "$bval"вместоecho $bval:

PHRASE="multi word     arg"
PHRASE=${PHRASE@Q}
ssh -A user@host1 ssh -A user@host2 "bash -s" -- <./test.sh -b "${PHRASE@Q}"

multi word     arg

Вместо формы расширения ${var@P}, которая не поддерживается в старых версиях bash, вы можете использоватьprintf -v var %q:

PHRASE="multi word     arg"
printf -v PHRASE %q "$PHRASE"
printf -v PHRASE %q "$PHRASE"
ssh -A user@host1 ssh -A user@host2 "bash -s" -- <./test.sh -b "$PHRASE"

Кроме того, вместо передачи вашего скрипта через стандартный ввод, что неэффективно (bash будет выполнять системный вызов чтения для каждого байта при чтении скрипта из стандартного ввода ), вы можете просто поместить весь скрипт и его аргументы в переменная:

printf -v cmd 'bash -c %q bash -b %q' "$(cat test.sh)" 'multi word   wahterve'
printf -v cmd %q "$cmd"
ssh localhost ssh localhost "$cmd"

multi word   wahterve
1
28.04.2021, 23:20

Теги

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