Передача массивов в соединения SSH - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу передать массив скрипту, который находится на удаленном компьютере.Я использую SSH для этого.Я попробовал приведенный ниже код, и я получаю сообщение об ошибке, в котором говорится, что параметр недоступен.

ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "${array_1[*]}"  -u "${array_2[*]}"

Здесь array_1 и array_2 являются индексированными массивами.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

другое решение, немного отличающееся от ответов в вопрос, предложенный @ jww
Идея состоит в том, чтобы передать определение массива в виде текста;
, а затем проверить их через устройство stdin
образец коданиже
вам необходимо заменить эхо-часть собственным сценарием определения массива
и поместить source /dev/stdin в script.sh

echo 'array_1[id]=3.14'|ssh  ubuntu@18.220.20.50 'source /dev/stdin; echo ${array_1[id]}'
0 голосов
/ 19 сентября 2019

Если я правильно понимаю ситуацию, у вас есть два массива, содержащих числа, что-то вроде:

array_1=(1 2 3)
array_2=(21 22 23)

... и вы хотите передать эти списки чисел в сценарий в виде разделенных пробелами списков, что-тонапример, запустить это на удаленном компьютере:

./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3"  -u "21 22 23"

Если это правильно, попробуйте следующую команду:

ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "'${array_1[*]}'"  -u "'${array_2[*]}'"

Объяснение: команды, переданные через ssh, анализируются дважды;сначала локальной оболочкой, а затем результат этого снова анализируется удаленной оболочкой.На каждом из этих этапов анализа кавычки (и экранирование) применяются и удаляются .Ваша исходная команда имела только один уровень кавычек, поэтому локальная оболочка анализирует, применяет и удаляет ее, поэтому удаленная оболочка не видит кавычек, поэтому она обрабатывает каждое из чисел как отдельную вещь.

Более подробно: исходная команда:

ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "${array_1[*]}"  -u "${array_2[*]}"

имеет расширенные ссылки на массивы, что дает эквивалент (при условии, что содержимое массива я перечислил выше):

ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3"  -u "21 22 23"

Локальная оболочкаанализирует и удаляет кавычки, но они передают 1 2 3 и 21 22 23 программам ssh как один аргумент.Но затем ssh просто вставляет список аргументов команды, которые он получил, вместе с пробелами между ними, так что это то, что он отправляет в удаленную оболочку:

./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b 1 2 3  -u 21 22 23

..., что сбивает с толку сценарий.

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

./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b '1 2 3'  -u '21 22 23'

Одиночные кавычки здесь имеют тот же эффект, что и двойные кавычки (так как других кавычек нет, экранирование выполняется,знаки доллара или другие специальные символы внутри них), поэтому это должно дать желаемый результат.

...