Назад | Перейти на главную страницу

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

Я пробовал это с ожиданием, но это не сработало: оно закрыло соединение в конце.

Можем ли мы запустить сценарий через 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

Добавить ; /bin/bash в конец командной строки на удаленной стороне? То есть:

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

Еще лучше, измените корневой каталог .bashrc на что-то вроде этого:

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

:)

Вероятно, самый простой и чистый способ подключиться к серверу по ssh, создать интерактивную оболочку и запускать команды внутри этой оболочки - это создать собственный rc-файл для bash.

В вашем настраиваемом файле bashrc на сервере сначала укажите файл по умолчанию, а затем добавьте свои собственные команды, например

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Затем вы можете начать сеанс SSH следующим образом:

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

В -t option принудительно выделяет псевдо-tty, чтобы работали такие вещи, как завершение табуляции.

В --rcfile опция указывает, какой файл rcfile загружать вместо файла по умолчанию. Важно: вы должны поместить «аргументы с двойным тире» в командной строке перед односимвольными параметрами, чтобы их можно было распознать.

В -i Аргумент / bin / bash предназначен для вызова интерактивной оболочки.

Если вы согласны делать это на Python, ожидание есть пример, который делает почти то, о чем вы просите:

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.

Не поймите меня неправильно, я ОБОЖАЮ ожидать (особенно autoexpect), но python мне намного проще разобраться.

Если кому-то нужна информация о том, что происходит в фоновом режиме, вам следует взглянуть на руководство по sshd:

Когда пользователь успешно входит в систему, sshd выполняет следующие действия:

  1. Если вход осуществляется на tty, и никакая команда не указана, выводится время последнего входа в систему и / etc / motd (если это не запрещено в файле конфигурации или ~ / .hushlogin; см. Раздел ФАЙЛЫ).
  2. Если вход осуществляется на tty, записывается время входа в систему.
  3. Проверяет / etc / nologin и / var / run / nologin; если он существует, он распечатывает его содержимое и завершает работу (кроме root).
  4. Изменения для запуска с правами обычного пользователя.
  5. Устанавливает базовую среду.
  6. Читает файл ~ / .ssh / environment, если он существует, и пользователям разрешено изменять свое окружение. См. Параметр 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

Как правило, вам следует избегать использования ssh таким образом, поскольку это противоречит его назначению.
Сделайте

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

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

Если хочешь tmux:

ssh -t user@host "cd /tmp; tmux a || tmux"

После входа это всегда запускается cd /tmp на удаленном хосте. Затем пытается подключиться к уже запущенному tmux сеанс, на котором вы можете продолжить работу с того места, на котором остановились после последнего ssh отключение (смоделируйте это, набрав последовательно Войти ~ .) или tmux отряд (Ctrl+б d), а если нет бега tmux сеанс, то начнется новый tmux сеанс, который также позволит вам войти в систему, используя оболочку, настроенную для этого пользователя.