Ssh, запустіть команду для входу в систему, а потім залишитись увійти?


29

Я спробував це з очікуванням, але це не вийшло: він закрив з'єднання наприкінці.

Чи можемо ми запустити скрипт через ssh, який увійде у віддалені машини, запустить команду, а не відключиться?

Отже, ssh в машині, cd в такий і такий каталог, а потім запустіть команду і залиште ввійти в систему.

-Джонатан

(очікував, що я використав)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
Це тільки я, або ви "автоматизуєте" автентифікацію паролів таким чином, замість того, щоб використовувати пабкі або інший здоровий метод?
grawity

Відповіді:


25

Додати в ; /bin/bashкінець вашого командного рядка на віддаленій стороні? Це є:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Ще краще, змінити .bashrc root на щось подібне:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
Ви можете додати -iдо цього базу.
Тедді

Так, я думаю :)
Білл Вайс

Коли я це роблю, у новій оболонці (навіть із "-i") вкладка завершується вкладкою - будь-яка ідея, чому / як виправити?
Coderer

1
Я перевірив свою нову відповідь тут, вона чудово працює. Трохи грубо, але це працює.
Білл Вайс

7
Спробуйте ssh -tвиділити піт.
Призупинено до подальшого повідомлення.

4

Якщо у вас все в порядку з Python, у pexpect є приклад, який робить майже саме те, що ви просите:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Щоб зробити це за допомогою ssh замість ftp, ви хочете код, подібний до наступного (приклади файлів у pexpect мають набагато більше деталей та інформації, але ось основи):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Не зрозумійте мене неправильно, я люблю очікувати (особливо автоочікую), але python просто soooo набагато простіше для мене.


Я теж переходжу від очікування до перспективного. пітон зараз набагато більше всюдисущий.
Дж. М. Бекер

4

Напевно, найпростіший і найпростіший спосіб запустити ssh на сервер, покласти інтерактивну оболонку і запустити команди всередині цієї оболонки - створити спеціальний файл rc для bash.

У вашому власному файлі bashrc на сервері спочатку створіть файл за замовчуванням, а потім додайте власні команди, наприклад

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Ви можете розпочати сеанс SSH так:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

В -tопції сили на виділення псевдо-термінал, так що такі речі , як закладка закінчення роботи.

В --rcfileопції визначає , який файл конфігурації для завантаження замість заданого за замовчуванням. Важливо: перед тим, як розпізнати параметри з одним символом, у командному рядку потрібно поставити "аргументи подвійного тире".

-iАргумент / бен / Баш є для виклику інтерактивної оболонки.


насправді ні. Що робити, якщо я хочу запускати різні команди для кожного з'єднання?
Євген Конков

1

Якщо хтось хоче інформації про те, що відбувається у фоновому режимі, слід поглянути на посібник з sshd:

Коли користувач успішно входить у систему, sshd виконує такі дії:

  1. Якщо вхід увімкнено tty, і не вказана жодна команда, друкується час останнього входу та / etc / motd (якщо це не завадить у файлі конфігурації чи ~ / .hushlogin; див. Розділ FILES).
  2. Якщо вхід увімкнено, записується час входу.
  3. Перевіряє / etc / nologin та / var / run / nologin; якщо така існує, вона друкує вміст і закриває (крім кореня).
  4. Зміни для запуску із звичайними правами користувача.
  5. Налаштовує базове середовище.
  6. Читає файл ~ / .ssh / середовище, якщо він існує, і користувачі можуть змінювати своє середовище. Дивіться параметр PermitUserEnvironment в sshd_config (5).
  7. Зміни домашнього каталогу користувача.
  8. Якщо ~ / .ssh / rc існує, запустіть його; інакше, якщо / etc / ssh / sshrc існує, запускає його; інакше працює xauth (1). Файлам `` rc '' надається протокол аутентифікації X11 та cookie у стандартному вході. Дивіться SSHRC, нижче.
  9. Запускає оболонку або команду користувача.

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

Як правило, слід уникати використання ssh таким чином, оскільки це перемагає його призначення.
Зробіть

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

щоб побачити, чи вказаний ваш ключ у пулі активних сеансів ssh чи ще додати його самостійно (з ssh-add).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.