На баш вообще
Дизайн Bash по отношению к файлам запуска довольно своеобразен. Bash загружается .bashrcв двух несвязанных обстоятельствах:
- Когда это интерактивная оболочка, кроме случаев, когда это оболочка входа в систему (и кроме случаев, когда она вызывается как
sh). Вот почему .bash_profileобычно загружается.bashrc .
Когда bash не является интерактивным, ни оболочка входа в систему, ни вызывается как, shно с заданной командой для выполнения -cи SHLVLне установлена или меньше или равна 1, и выполняется одно из следующих действий:
- Если стандартный ввод - это сокет. На практике это в основном происходит, когда bash вызывается
rshd, т.е. когда выполняется rsh remotehost.example.com somecommand.
Если активирован во время компиляции (что имеет место в некоторых дистрибутивах, таких как Debian и производные), если одна из переменных среды SSH_CLIENTили SSH2_CLIENTопределена. На практике это означает , что Баш вызывается sshd, т.е. ssh remotehost.example.com somecommand.
Если вы не знаете, как был скомпилирован bash, вы можете узнать, была ли установлена эта опция, проверив, содержит ли двоичный файл строку SSH_CLIENT:
strings /bin/bash | grep SSH_CLIENT
По SSH вообще
Когда вы выполняете команду через протокол SSH, команда передается по проводам в виде строки. Строка выполняется удаленной оболочкой. Когда вы запускаете ssh example.com somecommand, если оболочка входа удаленного пользователя работает /bin/bash, сервер SSH работает /bin/bash -c somecommand. Нет способа обойти оболочку входа в систему. Это разрешает ограниченные оболочки входа в систему, например, разрешает только копирование файлов, а не общее выполнение команд.
Есть одно исключение: протокол SSH позволяет клиенту запрашивать определенную подсистему. Если клиент запрашивает sftpподсистему, то по умолчанию сервер OpenSSH вызывает программу /usr/lib/openssh/sftp-server(местоположение может отличаться) через оболочку входа пользователя. Но он также может быть настроен для запуска внутреннего сервера SFTP через линию
Subsystem sftp internal-sftp
в sshd_configфайле. В случае внутреннего SFTP-сервера и только в этом случае оболочка входа пользователя в систему обходится.
Для этого вызова
В случае OverTheWire Bandit 18, .bashrcсодержит
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Таким образом, вы можете решить этот уровень, делая все, чтобы bash не был интерактивным.
Как вы обнаружили, SFTP работает.
Но ssh bandit18@bandit.labs.overthewire.org cat readmeтакже будет работать.
Как бы echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
И нажатие Ctrl + C в нужное время во время интерактивного входа в систему также будет работать: это приведет к прерыванию bash, поэтому выполнение .bashrcне будет полностью выполнено. Для запуска Bash требуется макроскопическое время, поэтому, хотя это не работает надежно, это можно сделать на практике.