ProxyJump
Новое в OpenSSH 7.3:
A$ scp -oProxyJump=B thefile C:destination
(За кулисами это просто использует ProxyCommand и ssh -W
.)
ProxyCommand
Обновлено, чтобы включить -W из других ответов:
A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination
Если у A установлен очень старый SSH-клиент (без поддержки -W
) или если B настроен на запрет перенаправления TCP (но все еще допускает команды оболочки), используйте альтернативы:
A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination
трубы
A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""
Только для одного файла:
A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile
"Туннель" через Б
A$ ssh -f -N -L 4567:C:22 B
(continues running in background)
A$ scp -P 4567 thefile localhost:destinationPath
Когда вы закончите, не забудьте завершить ранее запущенный процесс ssh
(который перешел в фоновый режим из-за -f -N
).
-f
Запрашивает ssh перейти в фон непосредственно перед выполнением команды. Это полезно, если ssh собирается запрашивать пароли или парольные фразы, но пользователь хочет сделать это в фоновом режиме. Это подразумевает -n.
-N
Не выполнять удаленную команду. Это полезно только для переадресации портов.
Обратный "туннель" через B к A
Не всегда работает, хотя:
A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)
B$ scp -P 4567 localhost:thefile C:destination
-R
Указывает, что соединения с данным портом TCP или сокетом Unix на удаленном (серверном) хосте должны перенаправляться на данный хост и порт или сокет Unix на локальной стороне.