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

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

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

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

13
задан 24 August 2012 в 02:51

6 ответов

У меня иногда есть подобная потребность, пока я соединяюсь по Шпаклевке с нашим сервером 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 через Шпаклевку на находящемся в CentOS VM, и от этого подключение VM по SSH к некоторому другому хосту.

Надежда это помогает кому-то!

5
ответ дан 24 August 2012 в 02:51

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

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

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

0
ответ дан 24 August 2012 в 02:51

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

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

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

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

0
ответ дан 24 August 2012 в 02:51

Если у Вас есть доступ к другому терминалу, можно отправить, использование SIGSTOP "уничтожают-19 PID" к ssh, управляют, чтобы инициировал соединение. Вы затем получите контроль терминала на терминале на клиентской машине. После того как Вы закончили, можно восстановить соединение SSH путем простого ввода fg для пробуждения ssh клиента.

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

0
ответ дан 24 August 2012 в 02:51

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

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

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

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

ssh -p 20202 localuser@localhost

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

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

4
ответ дан 24 August 2012 в 02:51

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

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