Я пробовал это с ожиданием, но это не сработало: оно закрыло соединение в конце.
Можем ли мы запустить сценарий через 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 выполняет следующие действия:
- Если вход осуществляется на tty, и никакая команда не указана, выводится время последнего входа в систему и / etc / motd (если это не запрещено в файле конфигурации или ~ / .hushlogin; см. Раздел ФАЙЛЫ).
- Если вход осуществляется на tty, записывается время входа в систему.
- Проверяет / etc / nologin и / var / run / nologin; если он существует, он распечатывает его содержимое и завершает работу (кроме root).
- Изменения для запуска с правами обычного пользователя.
- Устанавливает базовую среду.
- Читает файл ~ / .ssh / environment, если он существует, и пользователям разрешено изменять свое окружение. См. Параметр PermitUserEnvironment в sshd_config (5).
- Изменения в домашнем каталоге пользователя.
- Если ~ / .ssh / rc существует, запускает его; иначе, если существует / etc / ssh / sshrc, запускает его; в противном случае запускает xauth (1). Файлы `` rc '' получают протокол аутентификации X11 и cookie в стандартном вводе. См. SSHRC ниже.
- Запускает оболочку пользователя или команда.
Как правило, вам следует избегать использования 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
сеанс, который также позволит вам войти в систему, используя оболочку, настроенную для этого пользователя.