Я бы использовал механизм bash history:
$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/b/B/
echo 'foo\Bar\Baz'
foo\Bar\Baz
Однако я не могу заставить его заменить обратные слеши
$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/\\/\//
bash: :gs/\\/\//: substitution failed
Когда запускать ssh example.com my-script-which-is-on-the-remote-machine, имя учетной записи и пароль по-прежнему запрашиваются локально.
Это все еще не интерактивная оболочка входа в систему!
Интерактивность оболочки входа не определяется случаем «вы вводите логин и пароль». Ваш локальный ssh
запрашивает пароль (или используются ключи), он передает их на удаленный sshd
сервер, и только если они правильно проверены, вам предоставляется оболочка
(если вы не используете UseLogin yes
в sshd_config
, что довольно опасно).
Логин является основной концепцией на жаргоне--login shell.
Для описания работы Linux выделяют четыре этапа: Init, Getty, Login, Shell.
Здесь логин — это программа, которая получает имя пользователя в качестве параметра и запрашивает у пользователя пароль.
На локальной стороне:
vim /tmp/shell.sh
shopt login_shell
На стороне сервера (мой сервер vps):
vim /tmp/shell.sh
shopt login_shell
1. неинтерактивная оболочка входа в систему
общий формат: ssh example.com <мой-скрипт-который-хранится-локально
ssh root@vps_ip < /tmp/shell.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
login_shell on
Более четко
ssh -t -t root@vps_ip < /tmp/shell.sh
Last login: Wed Mar 8 03:16:00 2017 from vps_ip
root@localhost:~$
root@localhost:~$ shopt login_shell
login_shell on
Интерпретатор на локальной стороне break ssh -t -t root@vps_ip < /tmp /shell.sh
на две части.
1.ssh -t -t root@vps_ip
Программа входа в систему принимает root как пользователя на vps, вошла в систему.
2./tmp/shell.sh
сценарий на локальной стороне передается в качестве параметра интерпретатору на удаленной стороне и выполняется.
Это неинтерактивная оболочка входа в систему во время процесса.
2. неинтерактивная оболочка без входа в систему
общий формат:пример ssh.com мой скрипт, который хранится на удаленной машине
debian8@hwy:~$ssh root@vps_ip '/bin/bash /tmp/shell.sh'
login_shell off
debian8@hwy:~$
Это неинтерактивная оболочка без входа в систему во время процесса.
Некоторые хакерские трюки позволяют отображать его как оболочку входа в систему.
debian8@hwy:~$ssh root@vps_ip '/bin/bash --login /tmp/shell.sh'
login_shell on
debian8@hwy:~$
Сервер vps не заходит после выполнения всей команды ssh root@vps_ip '/bin/bash --login /tmp/shell.sh'.
login_shell на не отображал значения, он вошел в систему, но сервер vps закрыл соединение, вышел из системы.
Выводы Жиля о неинтерактивной оболочке входа и неинтерактивной оболочке без входа верны.