Как мне получить доступ к стороне клиента SSH со стороны сервера SSH? [дубликат]

На этот вопрос уже есть ответ здесь:

Обычно есть 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.

2
задан 4 May 2018 в 23:42

1 ответ

Как @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>
  • Модули Apache proxy и proxy_http требуются.

Дальнейшее чтение:

2
ответ дан 2 December 2019 в 03:33

Другие вопросы по тегам:

Похожие вопросы: