Вы также можете сделать это в обратном порядке, и это может быть проще.
Предположим, у вас открыт сеанс ssh с машиной, на которую вы хотите отправить файл. Этот ПК с самым дальним прыжком, мы назовем это hop2. Ваш "прокси" хост будет hop1. ПК, который является источником файла, мы назовем этот источник.
origin:~/asdf.txt --> hop1 --> hop2:~/asdf.txt
Вы можете строить туннели, делая локальный порт доступным на удаленном ПК. Таким образом, мы определяем порт, который будет открыт на удаленном ПК, который будет перенаправлять на порт, который вы перенаправили с собой, когда строили туннель.
На хопе 2:
ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555
Теперь в этом открытом сеансе туннеля вы можете сделать то же самое с hop1 до file_origin.
На прыжке 1:
ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.
Вы теперь туннелированы с hop2 на hop1 к источнику. По совпадению, теперь оба порта 5555 и 6666 открыты на источнике, которые перенаправляют на порт 22 hop2. В этом сеансе оба из следующих допустимых маршрутов scp к hop2:
По происхождению:
scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt
Таким образом, вы можете иметь произвольное количество переходов между ними, и с ним проще работать с точки зрения объединения более двух переходов.