Такие вопросы, как Как удаленно записать в файл с использованием SSH, касаются прямого SSH.

Но я достигаю конца обратного туннеля, который заканчивается на промежуточном сервере. То есть я ssh'ing к одной машине через другую. И я хочу написать в файл на удаленной машине. Следующее терпит неудачу; он заканчивает тем, что пишет на промежуточном сервере!

ssh -A -t  intermediateserver ssh -A -t -p 666 localhost  "echo 30 > tmp"

Тот факт, что там есть обратный ssh-туннель, вероятно, не усложняет ситуацию, поэтому в целом я сижу на homeserver и прохожу промежуточный сервер к distantserver.

(В моем случае здесь удаленный сервер, по-видимому, является промежуточным сервером внутри своего порта 666 из-за существующего обратного туннеля).

1 ответ1

2

Для каждого прыжка вам понадобится слой цитирования. По сути, ssh server some command foo bar запускает команду $SHELL с аргументами -c и some command foo bar , поэтому:

  1. Первый слой кавычек удаляется вашей локальной оболочкой, где вы запускали команду ssh, и
  2. Каждый последующий переход вызывает оболочку, которая удаляет еще один уровень цитирования.

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

Например, если у меня были файлы foo-a и foo-? в моем домашнем каталоге:

$ touch foo-a foo-\?
$ echo foo-*
foo-? foo-a
$ ssh Server1 echo foo-*
foo-? foo-a foo-a # foo-* expanded locally to foo-? foo-a, foo-? expanded again remotely
$ ssh Server1 'echo foo-*'
foo-? foo-a       # foo-* expanded remotely to foo-? foo-a
$ ssh Server2 ssh Server1 'echo foo-*'
foo-? foo-a foo-a # foo-* expanded remotely to foo-? foo-a, foo-? expanded again remotely in the next hop
$ ssh Server2 "ssh Server1 'echo foo-*'"
foo-? foo-a       # foo-* expanded in the last hop

Было бы проще, если бы вы использовали ProxyCommand или ProxyHost . Это создаст туннель между двумя системами вместо создания пахлавы оболочек, выполняющих команды:

~ ssh -o ProxyCommand='ssh Server2 nc %h %p' Server1 'echo foo-*'
foo-? foo-a

~ ssh -J Server2 Server1 'echo foo-*'
foo-? foo-a

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .