На этот вопрос уже есть ответ здесь:
Обычно есть SSH-клиент, который подключается к SSH-серверу. Затем клиент размещает команды, которые выполняются на сервере.А есть ли способ сделать это наоборот? Таким образом, клиент подключается к серверу, но сервер также подключается к клиенту и может выполнять команды на клиенте. Возможно ли это?
Причина, по которой я это ищу, заключается в том, что у меня есть два сервера (A и B) в двух разных сетях, причем обе сети подключены к Интернету. Доступ к серверу A можно получить через переадресацию портов, а к серверу B - нет. Поскольку сервер A выполняет всю работу, я бы хотел, чтобы сервер B подключился к серверу A и просто делал все, что сервер A хочет.
Возможны ли подобные обратные соединения? Или, может быть, двунаправленное соединение SSH?
EDIT :
В качестве примера я хотел бы сделать следующее. Находясь на сервере A и зная, что сервер B подключен ко мне по SSH, я хотел бы подключиться, чтобы подключиться к серверу B и разместить команду типа
echo "This is test content." > /home/myuser/mytestfile`
После этого я хотел бы найти файл
/home/myuser/mytestfile
на сервере B.
Как @terdon сказанный можно использовать следующую команду для выполнения, что-то на удаленном сервере через SSH и сохранить (перенаправляет) вывод к локальному экземпляру:
UserA@HostA:~$ ssh UserB@HostB ls ~ > /home/UserA/ls-of-home-UserB.txt
Также можно использовать следующую команду, чтобы выполнить что-то на локальном экземпляре и передать вывод по каналу к удаленному серверу и сохранить его командой tee
:
UserA@HostA:~$ ls ~ | ssh UserB@HostB tee /home/UserB/ls-of-home-UserA.txt
Я - согласитесь с @Sebastian Stark, который Вы, вероятно, спрашиваете, как создать туннель отворота с перенаправлением портов SSH. Соединение SSH позволяет связывать порт на удаленном сервере к порту на локальном при помощи опции -R
. И наоборот можно связать локальный порт с удаленным портом -L
.
В Вашем случае должен быть применен первый сценарий при помощи опции -R
:
UserA@HostA:~$ ssh UserB@HostB -R 2222:localhost:22
Эта команда установит соединение от HostA
кому: HostB
как обычно, и свяжет порт 2222
на HostB
к порту 22
на петлевом интерфейсе на HostA
. Это означает, когда Вы запрашиваете что-то на порте 2222
на HostB
запрос будет обработан сервисом, которые слушают на порте 22
на HostA
, обычно это - сервер SSH. В этой точке Вы могли смочь использовать некоторые следующие команды для соединения назад от HostB
кому: HostA
:
UserB@HostB:~$ ssh UserA@HostB -p 2222 UserB@HostB:~$ ssh UserA@localhost -p 2222
Или можно использовать вышеупомянутые команды, например:
UserB@HostB:~$ ls ~ | ssh UserA@localhost -p 2222 tee /home/UserA/ls-of-home-UserB.txt
Обратите внимание, что необходимо было установить сервер SSH на HostA
!
Одно интересное использование состоит в том, что можно привязать удаленный порт HostB
к порту на другом экземпляре в локальной сети HostA
:
UserA@HostA:~$ ssh UserB@HostB -fTN -R 3389:192.168.100.115:3389
Где 192.168.100.115
IP-адрес на любом компьютере Windows в LAN HostA
, давайте назовем его HostC
. Опции -fTN
отодвинет соединение SSH на задний план, и у Вас будет просто туннель от HostB:3389
через HostA
кому: HostC:3389
.
Я использую это комбинацией с autossh
поддерживать соединение. Например, у меня есть следующая строка в моем crontab
:
@reboot sleep 15 && autossh remote-server-with-public-ip -fTN
Где remote-server-with-public-ip
Хост, определенный в моем ~/.ssh/config
файл на HostA
:
Host remote-server-with-public-ip
HostName hostB
IdentityFile ~/.ssh/hostB/id_rsa
User userB
Port 22
RemoteForward 2223 127.0.0.1:22
RemoteForward 8080 127.0.0.1:80
RemoteForward 6900 127.0.0.1:5900
RemoteForward 3389 192.168.100.115:3389
Порты 2223
, 6900
, 3389
на HostB
не общедоступны, и я могу получить доступ к ним только посредством другого соединения SSH - например, от HostD
это находится где-нибудь в Интернете. Но к доступу 8080
Я использую Apache с обратным прокси на HostB
:-) и конфигурационный файл виртуального хоста смотрит как это:
<VirtualHost _default_:443>
ServerName forward.example.com
# Other configuration directives
SSLEngine on
# SSL certificate files
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass "/" "http://localhost:8080/"
ProxyPassReverse "/" "http://localhost:8080/"
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
proxy
и proxy_http
требуются.Дальнейшее чтение: