Избегайте разделения строк при передаче аргументов по ssh ⇐ Linux
Избегайте разделения строк при передаче аргументов по ssh
Чтобы запустить распределенные вычисления, я написал сценарий запуска, который использует ssh для входа на удаленный компьютер и запуска сценария, который считывается из стандартного ввода. Однако этот сценарий запуска должен правильно передать предоставленные пользователем аргументы из $@ на удаленный компьютер. Однако я заметил, что аргументы передаются неправильно.
Предположим, сценарий task.sh, который должен выполнить удаленный компьютер,
i=0 для p в "$@"; делать echo "#${i}: ${p}" я = $((я+1)) сделанный Этот скрипт просто перебирает аргументы и печатает их построчно, например:
$ bash Task.sh привет мир 'в одну строку' №0: привет №1: мир №2: в одну строку Мой упрощенный сценарий запуска run.sh теперь выглядит следующим образом:
ssh user@remote.example.com "bash -s $@" < Task.sh Однако это напечатает:
$ bash run.sh hello world 'в одну строку' №0: привет №1: мир #2: в №3: один № 4: линия Когда я цитирую $@ с помощью ', т.е.
ssh user@remote.example.com "bash -s '$@'" < Task.sh печатается следующее:
$ bash run.sh hello world 'в одну строку' #0: привет, мир, в одну строку Может быть, это работает, когда я использую массив в run.sh?
ARGS=(bash -s "$@") ssh user@remote.example.com "${ARGS[@]}" < Task.sh Нет, он также печатает в одну строку в несколько строк.
При добавлении дополнительных одинарных кавычек вокруг ${ARGS[@] ssh интерпретирует его как одну команду и сообщает: bash: bash -s hello world в одну строку: команда не найдена.
Итак, как правильно передать аргументы в ssh, чтобы они правильно разделились? Я думаю, это, вероятно, работает с переменными среды, но могу ли я заставить его работать и без них?
Чтобы запустить распределенные вычисления, я написал сценарий запуска, который использует ssh для входа на удаленный компьютер и запуска сценария, который считывается из стандартного ввода. Однако этот сценарий запуска должен правильно передать предоставленные пользователем аргументы из $@ на удаленный компьютер. Однако я заметил, что аргументы передаются неправильно.
Предположим, сценарий task.sh, который должен выполнить удаленный компьютер,
i=0 для p в "$@"; делать echo "#${i}: ${p}" я = $((я+1)) сделанный Этот скрипт просто перебирает аргументы и печатает их построчно, например:
$ bash Task.sh привет мир 'в одну строку' №0: привет №1: мир №2: в одну строку Мой упрощенный сценарий запуска run.sh теперь выглядит следующим образом:
ssh user@remote.example.com "bash -s $@" < Task.sh Однако это напечатает:
$ bash run.sh hello world 'в одну строку' №0: привет №1: мир #2: в №3: один № 4: линия Когда я цитирую $@ с помощью ', т.е.
ssh user@remote.example.com "bash -s '$@'" < Task.sh печатается следующее:
$ bash run.sh hello world 'в одну строку' #0: привет, мир, в одну строку Может быть, это работает, когда я использую массив в run.sh?
ARGS=(bash -s "$@") ssh user@remote.example.com "${ARGS[@]}" < Task.sh Нет, он также печатает в одну строку в несколько строк.
При добавлении дополнительных одинарных кавычек вокруг ${ARGS[@] ssh интерпретирует его как одну команду и сообщает: bash: bash -s hello world в одну строку: команда не найдена.
Итак, как правильно передать аргументы в ssh, чтобы они правильно разделились? Я думаю, это, вероятно, работает с переменными среды, но могу ли я заставить его работать и без них?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение