Выполнить команду на локальном компьютере с подключенного удаленного хоста SSH?


13

Скажем, я подключился к удаленному компьютеру через SSH. Из программы на этом удаленном компьютере мне нужно выполнить команду на локальном компьютере (инициатор подключения).

В связи с этим возникает вопрос: можно ли подключиться к существующему соединению между двумя компьютерами, чтобы выполнить команду на локальном компьютере?

Я рассмотрел запуск команды ssh user@host-of-connecting-party <command>на удаленном компьютере, чтобы установить обратное соединение. Но это сложнее автоматизировать и потребует вмешательства пользователя. Я надеялся, что смогу полностью автоматизировать его или хотя бы определить имя пользователя / хоста подключенного пользователя.


Понятно, что ты хочешь делать. Что мне не ясно, так это то, что вы говорите: «Я надеялся, что смогу полностью автоматизировать его или, по крайней мере, определить имя пользователя / хоста подключенного пользователя». Что вы имеете в виду?
Hytromo

«сложнее автоматизировать и потребует вмешательства пользователя» в данном случае является синонимом «защищенного». Если бы удаленный хост мог запускать команды на клиентах, которые к нему подключаются, это было бы крайне небезопасно ... представьте, что сервер был взломан, а любой, кто подключается к нему, просто заражает свою локальную машину ... это было бы весело :)
Сергей

Ответы:


5

Иногда у меня возникает аналогичная потребность, пока я подключаюсь через Putty к нашему VPN-серверу, а оттуда через ssh к другому хосту, который недоступен для меня напрямую из-за настройки VPN.

Иногда мне просто нужно быстро что-то проверить на компьютере с VPN-сервером, пока у меня все еще работает ssh-сессия. Один из подходов - запустить сессию ssh screen, что, как я заметил, добавляет некоторую задержку по сравнению с «обычным ssh». Другой подход, которым я хотел бы поделиться здесь, заключается в следующем:

Во время сеанса SSH нажмите Enter, затем ~(убедитесь, что он не отображается, т. Е. Вы находитесь в командном режиме), затем Ctrl- Z. Это поместит клиентский процесс ssh на «хост» в фоновом режиме, и вы получите что-то вроде:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh root@10.0.0.167
[root@vps291736 ~]#

Теперь вы находитесь на «хосте», можете делать все, что захотите (хотя я не уверен, как долго будет продолжаться сессия ssh), а затем вернуться к сеансу SSH, запустив его fg.

По крайней мере, это работает для меня, пока я подключаюсь с рабочей станции Win10 через Putty к виртуальной машине на базе CentOS, и с этой виртуальной машины подключаюсь через SSH к другому хосту.

Надеюсь, это поможет кому-то!


2
Если у вас есть PermitLocalCommand yesв вашем .ssh/configдля хоста, вы также можете сделать <Enter>~C, то !<command>.
муру

5

Ответ @ 62mkv - гораздо лучшее решение. Используйте это.

Для полноты и любопытства, если на локальном компьютере запущен ssh-сервер, вы можете создать ssh-туннель, чтобы разрешить ssh-соединения с удаленного хоста через порт 20202 обратно на локальный через порт 22. Пример команды:

ssh -R20202:localhost:22 remoteuser@remotehost.com

Это запустит соединение SSH, но также настроит туннель обратно к серверу SSH, работающему на вашем компьютере. Затем вы можете сделать это, когда ssh'ed на удаленный хост:

ssh -p 20202 localuser@localhost

Конечно, это может быстро запутать, особенно если техника вложена более одного раза. Это также добавляет немного задержки - все, что вы выполняете на локальном компьютере, пересылается через удаленный хост.

Дополнительную информацию о ssh-туннелировании для тех, чье любопытство еще не удовлетворено, можно найти в ответе на этот вопрос обмена стеками Unix .


Это отличный ответ. Именно то, что мне нужно, чтобы иметь возможность делать ssh с удаленной машиной, которая находилась за брандмауэром и была доступна только через teamniewer. Я просто подключился через teamviewer, затем из сеанса teamviewer обратно к моей машине, создавая ssh-туннель, и затем я мог открыть столько сеансов ssh с моего компьютера на удаленный, сколько мне было нужно.
Marian

Действительно, это гораздо лучший вариант использования для туннеля, подобного этому @Marian. Я делаю это сам.
Starbeamrainbowlabs

0

Если ваш локальный и удаленный компьютер доступны из Интернета, вы можете просто открыть сеанс SSH с локального компьютера на удаленном компьютере, а затем в этом сеансе открыть другой сеанс SSH с удаленного компьютера на локальном компьютере:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Для автоматизации вещей взгляните на Fabric (требуется знание Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')

0

Вы можете использовать sshpass для подключения к удаленному компьютеру и запуска команд.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Используйте простой сценарий оболочки на локальном компьютере и используйте приведенный выше код всякий раз, когда вы хотите запускать команды на удаленном компьютере. Это один из способов, которые я обычно использую в автоматизации.


0

Нет, вы не можете проникнуть в существующую сессию.

Вашему приложению потребуется способ подключения к клиенту. SSH будет работать, если на клиенте запущен SSH-сервер и сервер может подключиться к порту 22 на клиенте. Нетрудно автоматизировать, если вы используете аутентификацию на основе ключей вместо аутентификации по паролю - таким образом, вмешательство пользователя не будет необходимым.

Информацию о настройке аутентификации на основе ключей можно найти здесь: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/


0

Если у вас есть доступ к другому терминалу, вы можете отправить SIGSTOP с помощью команды kill -19 PID команде ssh, которая инициировала соединение. После этого вы получите контроль над терминалом на клиентском компьютере. Когда вы закончите, вы можете восстановить ssh-соединение, просто набрав fg, чтобы разбудить ssh-клиента.

Но, конечно, здесь возникает вопрос: если у вас уже есть терминал на клиентской машине, зачем вы это делаете :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.