У меня есть система, которая позволяет выполнять команды с хоста на различные внешние машины из сценария оболочки bash с использованием ssh или 'sersh', который похож на ssh, но отправляет команды через последовательный порт. (Детали этих команд не имеют значения.)
Я пытаюсь связать команды вместе, с одной внешней машины на третью машину. Мне трудно понять, как заставить оболочку расширять параметры только на конечной машине.
function do_cmd () {
case $TRANSPORT in
ssh)
ssh -i ${SSH_KEY} ${LOGIN}@${IPADDR} "$@"
;;
serial)
sersh ${SER_LOGIN}@{SERIAL_DEV} "$@"
;;
ssh2serial)
ssh -i ${SSH_KEY} ${LOGIN}@{IPADDR} \
"sersh ${SER_LOGIN}@${SERIAL_DEV} $@"
;;
*)
echo "Unknown transport $TRANSPORT"
;;
esac
}
do_cmd "echo hello"
do_cmd "echo \"my pid is \$\$\""
do_cmd "cd /proc ; for pid in 1* ; do echo \$pid, ; done"
Все три из этих вызовов работают правильно, когда TRANSPORT имеет значение «ssh» или «serial». Для TRANSPORT 'ssh2serial' во втором вызове do_cmd значение $$ расширяется преждевременно (на промежуточной, а не на конечной машине). И для третьего вызова do_cmd $pid заканчивается пустой строкой до того, как цикл будет выполнен на последней машине.
Я подумал о двойном экранировании знаков доллара, но вызывающая сторона не знает, сколько существует уровней промежуточных машин. Есть ли способ предотвратить расширение параметра на промежуточной машине и делать это только на конечной машине?
sersh
? Если бы это были две командыssh
, я бы рекомендовалssh -o ProxyCommand="ssh login1@host1" login2@host2 ...
вместоssh login1@host1 "ssh login@host2 ..."
, но я не знаю, есть ли что-то подобное дляsersh
. - person chepner   schedule 12.02.2019ProxyCommand
(см.man ssh_config
) дает примерnc
в качестве команды, так что это может работать; У меня просто нет возможности проверить или подтвердить это. (Я думаю, что он ожидает, что конечный хост все еще будет работать под управлениемsshd
, что, однако, не будет иметь место для вашего последовательного устройства.) - person chepner   schedule 13.02.2019