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


13

Скажіть, я підключився до віддаленого комп’ютера через SSH. З програми на цьому віддаленому комп'ютері мені потрібно виконати команду на своєму локальному комп'ютері (ініціатор підключення).

Звідки виникає питання: чи можна підключитись до існуючого з'єднання між двома комп'ютерами для запуску команди на локальному комп'ютері?

Я розглядав запуск команди ssh user@host-of-connecting-party <command>на віддаленому комп'ютері для встановлення зворотного зв'язку. Але це важче автоматизувати і вимагатиме втручання користувача. Я сподівався, що зможу повністю його автоматизувати або хоча б виявити ім’я користувача / хоста підключеного користувача.


Зрозуміло, що ти хочеш робити. Що мені незрозуміло - це частина, де ви говорите: «Я сподівався, що зможу повністю автоматизувати це або принаймні визначити ім’я користувача / хоста підключеного користувача». Що ви маєте на увазі?
гітром

"важче автоматизувати і вимагатиме втручання користувача" є синонімом "захищеного" в цьому випадку. Якби віддалений хост міг запускати команди на клієнтах, які підключаються до нього, це було б дуже небезпечно ... уявіть, що сервер потрапив у компроміс, і кожен, хто підключиться до нього, просто заразиться своєю локальною машиною ... це було б весело :)
Сергій

Відповіді:


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 на VOS на базі CentOS, і від цього VM підключається через 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 stackexchange .


Це відмінна відповідь. Саме те, що мені потрібно, щоб мати змогу зробити ssh на віддаленій машині, яка знаходилась за брандмауером і яка була доступна лише через teamniewer. Я просто підключився через teamviewer, потім із сеансу teamviewer назад до моєї машини, створюючи ssh тунель, і тоді я міг відкрити стільки сеансів ssh з мого комп'ютера на віддалений, скільки мені потрібно.
Маріан

Дійсно, це набагато кращий варіант використання для такого тунелю, як цей @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.