6

У меня есть Linux-система на работе, в которую я часто захожу из дома. Блок Linux находится во внутренней сети, но есть блок, охватывающий обе сети, поэтому я могу войти так:

ssh -tA username@bridge.work.com ssh username@10.10.10.130

У меня есть пара файлов в ~/tmp, которые я хотел бы скопировать на мой локальный компьютер. (давайте назовем их ~/tmp/file1 ~/tmp/file2 и ~/tmp/file3 ради аргумента)

Я видел что-то вроде этой работы:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | tar xf -

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

Не работает:

На удаленной машине, если я бегу

tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63  -

С локальной машины:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36  -

Я предполагаю, что это, вероятно, порядок байтов snafu по сети ... В конце концов мне удалось обойти его, кодировав файл, перехватив его по сети, а затем локально расшифровав ... по какой-то причине я не смог получить правильный синтаксис для возможности tar | uuencode на удаленной стороне и uudecode | Унтар на местной стороне.

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

3 ответа3

6

Используйте опцию конфигурации SSH ProxyCommand, чтобы в конфигурации на вашем клиенте. Это позволяет вам установить прямую связь с пунктом назначения.

Host remotebox
    ProxyCommand /usr/bin/ssh username@bridge.work.com "/bin/netcat -w 1 10.10.10.130 22"
    User username

scp remotebox: файл локальный

6

Вы можете настроить переадресацию портов. Измените свою начальную команду на:

ssh -TA username@bridge.work.com -L 2222:10.10.10.130:22

Затем игнорируйте эту команду. Откройте новый терминал и запустите одно из:

ssh -p 2222 username_for_10.10.10.130@127.0.0.1
scp -P 2222 username_for_10.10.10.130@127.0.0.1 remote_file local_file

Всякий раз, когда ваша локальная система получает запрос на подключение через порт 2222 локального IP-адреса, команда SSH, которую вы запустили первым, перенаправит ее на удаленную систему и выдаст запрос на соединение 10.10.10.130. Это все указывается ключом -L.

4

Упорядочение байтов применяется только к таким вещам, как заголовки IP (которые имеют четырехбайтовые адреса в качестве одного блока), но не влияет на протоколы более высокого уровня, которые работают только с 8-битными байтами - все IP, TCP и SSH гарантировать, что вы получите данные именно так, как они были отправлены, побайтово.

Проблема вызвана опцией -t первого ssh . Это заставляет выделять псевдотетти для первого соединения, которое необходимо только для терминалов (и эмуляторов терминалов), и будет манипулировать некоторыми данными во время передачи. В частности, возврат каретки (0x0D) будет автоматически вставляться перед каждым переводом строки (0x0A).

Просто удалите опцию -t , и у вас будет чистый канал для передачи двоичных данных.

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