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

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

Я пытаюсь запустить скрипт 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:

Связанный контент