Как в Linux разлогиниться с двух пользователей и выполнить команду один раз?

Как закрыть подключение SSH, находясь в режиме суперпользователя, без необходимости возвращаться на уровень обычного пользователя? Команда exit; exit не дает желаемого результата.
  • 15 января 2024 г. 16:39
Ответы на вопрос 4
Чтобы разлогиниться с двух уровней оболочек (например, если вы выполнили `su` или `sudo` для перехода в режим суперпользователя), вы можете попробовать выполнить команду `exit` дважды, по одной на каждый шаг возврата. Например:

```bash
exit
exit
```

Если это не срабатывает или если вы хотите использовать единую команду, попробуйте следующие подходы:

1. Сцепление команд с `&&`:
   ```bash
   exit && exit
   ```
Однако, это не сработает, если первый `exit` действительно закрыл сессию.

2. Использование подоболочки с `exec`:
   ```bash
   exec bash -c 'exit; exit'
   ```
Эта команда запустит новую оболочку (`bash`), которая выполнит обе команды `exit` последовательно.

Если вы находитесь в сессии SSH и хотите закрыть подключение, находясь в режиме суперпользователя, без возврата к обычному пользователю, вы можете использовать следующие методы:

1. Выполните команду `logout` или `exit` в оболочке суперпользователя для выхода из сессии суперпользователя и возврата в предыдущую сессию, затем наберите `exit` снова для закрытия SSH-сессии.
   
2. Если вы хотите сразу завершить SSH-сессию, используйте клавиатурный сокращение `~.`, которое является пунктом управления SSH, чтобы закрыть клиент SSH немедленно, находясь в любой точке сессии. Обратите внимание, что это нужно нажимать сразу после new line (новой строки), и чтобы это сработало, перед ним не должно быть других символов, например:
   ```
   $ [нажмите Enter]
   [нажмите ~.]
   ```

3. Отправить сигнал HUP родительскому процессу сессии SSH. Найдите PID родительского процесса вашего SSH-соединения (часто это будет shell, который использовался для запуска клиента SSH) и отправьте ему сигнал SIGHUP:
   ```bash
   pkill -SIGHUP -P PPID
   ```
где `PPID` это PID родительского процесса вашей текущей оболочки. Вы можете его найти при помощи команды `echo $PPID`. Это завершит родительский процесс и, как следствие, SSH-соединение.

Пожалуйста, будьте осторожны с использованием таких методов, так как они могут привести к незапланированному завершению процессов и сессий.
Погуглить “drop ssh connection“
И не будет, ведь такая команда будет исполняться в одном shell, а не в двух разных. После первого exit дальше уже всё, остаток будет проигнорирован. 

Способы есть:

1. Из суперпользователя убить shell пользователя. Некрасиво и неудобно, но закроет оба шелла.

2. Переключение в суперпользователя оформить сразу с выходом, тогда выход из внутреннего сделает выход и из внешнего, например:

sudo -i; exit

Недостаток - если не удастся правильно ввести пароль - сразу же и выкинет. Ну, можно поразбираться с кодами возврата, чтобы не делать exit.

3. Вместо предыдущего можно сделать exec, тогда запускаемая команда заместит текущий shell, а не будет запущена как дочерний процесс:

exec sudo -i

Недостаток тот же - если не ввести правильно пароль, то выкинет.

Но в целом я не вижу во всём этом смысла. Выход можно делать комбинацией Ctrl-D. Нажать дваждый Ctrl-D ничто не мешает, это даже удобнее.
Вопрос: возможно ли закрыть соединение ssh сразу от суперпользователя?

Вынуть шнур питания из розетки

Серьезно - нет. Тем более это не то, что стоит автоматизировать
Похожие вопросы