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

393
CPBL

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

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

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

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

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

0
Если вы `ssh`ing с“ промежуточного сервера ”на` localhost`, то вы все еще на “промежуточном сервере”. Где вы подключаетесь к удаленной машине? Вы говорите, что туннель заканчивается на «промежуточном сервере», так какая машина находится дальше, чем конец линии? Scott 5 лет назад 0
Я отредактировал для ясности. Моя ситуация, вероятно, немного сложнее, чем уместна в вопросе. CPBL 5 лет назад 0

1 ответ на вопрос

2
muru

Для каждого прыжка вам понадобится слой цитирования. По сути, в 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 
Мне известны только два варианта цитирования: «и». Могу ли я использовать их поочередно для последующих слоев? Т.е. разворачивание цитат отслаивается в самом конце и в самом начале? (В любом случае я попробую ваш лучший подход) CPBL 5 лет назад 0
Муру: Наш кодекс поведения гласит «будь милым», а не «будь милым». При чем тут пахлава? :-) ⁠ Scott 5 лет назад 0
@CPBL, к сожалению, нет. `" l1 'l2 "l3' l4 '3" 2' 1 "` рассматривается первой оболочкой как три строки: `l1 'l2 l3`,` l4`, `3 2' 1`. Может быть возможно получить до трех уровней цитирования, также используя обратную косую черту, но это приводит к безумию. muru 5 лет назад 0
@ Скотт напомнил мне кое-что, что я видел в блоге Джеффа Этвуда некоторое время назад: см. # 14 в https://blog.codinghorror.com/new-programming-jargon/ muru 5 лет назад 0
Есть ли шанс, что вы могли бы привести пример ProxyCommand, используя мою ситуацию, когда пунктом назначения является промежуточный порт? Я все еще застрял, интерпретируя эти загадочные биты CPBL 5 лет назад 0
@CPBL примерно так: `ssh -o ProxyCommand = 'промежуточный сервер ssh nc% h% p' -p 666 localhost" echo 30> tmp "` muru 5 лет назад 0
@muru Это дает мне "bash: nc: команда не найдена". CPBL 5 лет назад 0

Похожие вопросы