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


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

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

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


11
2017-08-23 22:51


происхождения


Понятно, что вы хотите сделать. Мне не ясно, что вы говорите: «Я надеялся, что смогу полностью автоматизировать его или, по крайней мере, определить имя пользователя / хоста подключенного пользователя». Что вы имеете в виду? - hytromo
«сложнее автоматизировать и потребует вмешательства пользователя» в этом случае является синонимом «безопасности». Если удаленный хост мог запускать команды на клиентах, которые подключаются к нему, это было бы очень небезопасно ... представьте, что сервер получил компрометацию, и любой, кто подключается к нему, просто заражает свою локальную машину ... это будет весело :) - Sergey


ответы:


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

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

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

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

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

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

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

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


4
2017-11-18 04:28



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


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

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

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

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

ssh -p 20202 localuser@localhost

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

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


2
2018-05-10 21:01





Если ваш локальный и удаленный компьютер доступен из Интернета, вы можете просто открыть сеанс 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>

Для автоматизации материала взгляните на ткань (Требуется знание 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
2017-08-24 00:21





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

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

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


0
2018-02-18 12:21





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

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

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


0
2018-05-13 23:45





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

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


0
2017-11-15 10:04