
Обычно я вхожу в сеть через ssh, а затем на другой компьютер снова через ssh на мой конечный компьютер. Например, на домашний сервер, а оттуда на один из компьютеров моей семьи. Это выглядит примерно так:
user0@inital:> ssh -P port_number user1@server
user1@server:> ssh -P port_number user2@final
user2@final:>
После этого user2@final
я хотел бы скопировать (scp) обратно в user0@inital
.
Например, я могу сделать локальную переадресацию портов и копировать с моего локального компьютера на удаленный через сервер.user0@initial
user0@initial:> ssh -L4321:final:22 -p 443 user1@server
Это перенаправляет локальный порт 4321
через user0@initial
порт user1@server
на 22
. user2@final
Затем на , user0@initial
запустив
scp -P 4321 some_file [email protected]:~/
Я могу скопировать на user2@final
более чем user1@server
.
Вопрос в том, как обратить все вспять и скопировать обратно user2@final
из user0@initial
.
Спасибо за помощь.
решение1
Предположим, вы хотите запустить команду scp в командной строке final:
# have the local client tell the remote server's sshd to listen on
# port 8765 (randomly chosen) and forward any connection it receives
# to the client which will connect to port 22 locally.
user0@initial:> ssh -R127.0.0.1:8765:127.0.0.1:22 -p 443 user1@intermediate
# On this machine have the client tell this remote server's (final's)
# to listen on port 9876 (randomly chosen) and forward any connection
# that it receives back to this client which will connect it to poirt
# 8765 locally.
user1@intermediate:> ssh -R127.0.0.1:9876:127.0.0.1:8765 user2@final
# Now that you are on the final server (final) you run scp, telling
# it to connect to localhost on port 9876.
#
# So scp will connec to local (final's) port 9876, which is listened
# to by the local sshd based on our second command above. That sshd
# will forward the connection to the ssh client that connected to it
# (on intermediate).
#
# The ssh client on intermediate will connect to localhost:8765 as
# instructed which is a conenction to the sshd on intermediate that
# is listening on that port because it was instructed to do so by the
# ssh client on initial when it connected.
#
# The sshd on intermediate will forward the conenction back to the
# client on initial which will, as instructed, connect to localhost:22
# on initial.
#
# All this monkey motion means that now scp on final is "directly"
# connected to port 22 (sshd) on initial and can initiate a login
# and file transfer. to the ssh client that connected to it (on
# intermediate).
user2@final:> scp -P 9876 file_from_final 127.0.0.1:back_at_the_house
Обратите внимание, что я сделал все порты на 127.0.0.1, что защищает их от эксплуатации другими пользователями в Интернете (но не другими пользователями на «сервере» или «конечной точке»).
решение2
Да. Вам следует взглянуть на ключевое слово ssh_config.ProxyCommand
Указывает команду, используемую для подключения к серверу. Командная строка продолжается до конца строки и выполняется с использованием директивы оболочки пользователя 'exec', чтобы избежать затягивания процесса оболочки.
В командной строке любое вхождение '%h' будет заменено именем хоста для подключения, '%p' — портом, а '%r' — именем удаленного пользователя. Команда может быть в принципе любой и должна считывать со своего стандартного ввода и записывать в свой стандартный вывод. В конечном итоге она должна подключиться к серверу sshd(8), работающему на какой-либо машине, или выполнить sshd -i где-либо. Управление ключами хоста будет осуществляться с использованием HostName подключаемого хоста (по умолчанию — имя, введенное пользователем). Установка команды на «none» полностью отключает эту опцию. Обратите внимание, что CheckHostIP недоступен для подключений с помощью команды proxy.
Эта директива полезна в сочетании с nc(1) и его поддержкой прокси. Например, следующая директива будет подключаться через HTTP-прокси по адресу 192.0.2.0:
ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p