SSH без использования .bashrc
Я экспериментировал со своим .bashrcфайлом, когда удаленно входил на сервер через SSH. Я случайно оставил exitтам сообщение, которое привело к немедленному отключению всех последующих входов в систему. Я был фактически заблокирован. Мне удалось восстановить доступ с вмешательством кого-то с правами root, но было бы это возможно без чьей-либо помощи?
Я пробовал делать такие вещи, как запуск ssh <server> 'bash --norc --noprofile'и ssh <server> 'mv .bashrc bashrc-backup', и даже пытался принудительно перезаписать его scp empty-file <server>:.bashrc. Тем не менее, все эти параметры, похоже, полагаются на то, что сначала нужно найти сломанный, .bashrcпрежде чем запускать команду, поэтому ни один из них не работал.
Вполне может быть, что выхода из такой ситуации нет. Но так ли задумано? Есть ли причина, по которой так легко заблокировать систему, например, просто запустив ее ssh <server> 'echo exit > .bashrc'? Есть ли способы исправить такую ошибку?
Ответы
Как обсуждалось в другом ответе, когда клиент SSH подключается к серверу OpenSSH, сервер OpenSSH обычно запускает сеанс оболочки от имени клиента, используя оболочку входа пользователя:
- Если клиент запрашивает интерактивный сеанс, сервер запускает оболочку входа пользователя.
- Если клиент запрашивает выполнение команды, сервер будет использовать оболочку входа пользователя для выполнения команды как команды оболочки.
- Утилиты, такие как
scp,rsyncи,gitкоторые используют ssh для транспорта, будут запрашивать команду для запуска в удаленной системе, поэтому они подпадают под №2.
Если у вас есть что-то в файлах запуска оболочки удаленного пользователя, из-за чего оболочка завершает работу, у вас возникнут проблемы с входом.
Однако SFTP - это особый случай. Сервер OpenSSH может быть настроен для поддержки SFTP без запуска внешней команды. Если это так, то вы были бы в состоянии использовать SFTP для подключения к серверу и удалять, переименовывать или изменять .bashrcфайл , который вызывает проблему.
Это зависит от того, как сервер настроен для поддержки sftp. Он может обслуживать сеансы sftp, запустив внешнюю программу (с именем sftp-server). В этом случае вы столкнетесь с той же проблемой, что и с программами вроде scp. Или сервер может обслуживать сеанс sftp с помощью чего-то, называемого «internal-sftp» , что не требует вызова оболочки. Это просто зависит от того, как настроен конкретный SSH-сервер.
Причина, по которой это происходит, заключается в том sshd, что компонент на стороне сервера вызывает процессы, используя вашу оболочку. Если он порождает интерактивную оболочку, он порождает ее как оболочку входа в систему; в противном случае он использует -cаргумент для создания неинтерактивной оболочки для выполнения указанной вами команды.
Все указанные вами операции (указанные команды и scp) являются неинтерактивными операциями, поэтому обычно bash не загружается .bashrc, но bash имеет специальный регистр для при вызове, sshdтак что он все равно вызывает его. Если бы вы использовали zsh, то .zshenv(который вызывается для всех оболочек) будет загружен, но .zshrc(который предназначен только для интерактивных оболочек) не будет, если вы специально не загружали сеанс оболочки.
В этом случае, если вы используете bash, вам не повезло. Невозможно вызвать команду SSH на стороне сервера без использования оболочки; это верно даже для scp и sftp. В большинстве случаев вы хотите использовать оболочку, потому что она настраивает вещи, например, PATHдля различных программ, и позволяет создавать разумное количество сценариев для сложных команд, поэтому OpenSSH всегда использует ее.
Это также имеет некоторые преимущества безопасности: если вы попытаетесь войти в системную учетную запись, у которой каким-то образом есть действующий пароль, но оболочка /usr/sbin/nologinили /bin/false, то вы ничего не сможете сделать, что, вероятно, и задумал системный администратор.
Есть способы смягчить это. Многие люди хранят Git-репозиторий своих точечных файлов и разрабатывают их в одной системе, а затем развертывают в других. Например, я всегда занимаюсь разработкой точечных файлов на своем ноутбуке. Предположительно, вы заметили бы эту проблему немного раньше, если бы каждый раз, когда вы открывали новое окно терминала, оно сразу же закрывалось, и у вас мог быть root-доступ, чтобы исправить это самостоятельно.
Если вам нужно протестировать конфигурацию, которая может вас заблокировать, например конфигурацию оболочки или ее sudoersизменение, вы можете оставить одну оболочку (нормальную или корневую, соответственно) открытой, а затем провести некоторое тестирование, поэтому, если вы что-то сломаете, у вас все еще будет способ отменить это.