Auf Bash im Allgemeinen
Das Design von Bash in Bezug auf Startdateien ist ziemlich eigenartig. Bash-Ladungen .bashrcunter zwei unabhängigen Umständen:
- Wenn es sich um eine interaktive Shell handelt, außer wenn es sich um eine Anmeldeshell handelt (und außer wenn sie als aufgerufen wird
sh). Aus diesem Grund wird .bash_profilenormalerweise geladen.bashrc .
Wenn bash weder interaktiv noch eine Login-Shell ist oder als shBefehl aufgerufen wird , mit dem ausgeführt werden soll, -cund SHLVLnicht gesetzt oder kleiner oder gleich 1 ist und eine der folgenden Bedingungen erfüllt ist:
- Wenn der Standardeingang eine Buchse ist. In der Praxis geschieht dies meistens, wenn bash von aufgerufen wird
rshd, dh wenn ausgeführt wird rsh remotehost.example.com somecommand.
Wenn zur Kompilierungszeit aktiviert (was bei einigen Distributionen wie Debian und Derivaten der Fall ist), wenn eine der Umgebungsvariablen SSH_CLIENToder SSH2_CLIENTdefiniert ist. In der Praxis bedeutet dies, dass bash von aufgerufen wird sshd, dh ssh remotehost.example.com somecommand.
Wenn Sie nicht wissen, wie bash kompiliert wurde, können Sie herausfinden, ob diese Option festgelegt wurde, indem Sie überprüfen, ob die Binärdatei die Zeichenfolge enthält SSH_CLIENT:
strings /bin/bash | grep SSH_CLIENT
Auf SSH im Allgemeinen
Wenn Sie einen Befehl über das SSH-Protokoll ausführen, wird der Befehl als Zeichenfolge über die Leitung übertragen. Die Zeichenfolge wird von der Remote-Shell ausgeführt. Wenn Sie ssh example.com somecommanddie Anmeldeshell des Remotebenutzers ausführen , wird /bin/bashder SSH-Server ausgeführt /bin/bash -c somecommand. Es gibt keine Möglichkeit, die Anmeldeshell zu umgehen. Dies ermöglicht eingeschränkte Anmeldeshells, um beispielsweise nur das Kopieren von Dateien und nicht die allgemeine Befehlsausführung zuzulassen .
Es gibt eine Ausnahme: Das SSH-Protokoll ermöglicht es dem Client, ein bestimmtes Subsystem anzufordern. Wenn der Client das sftpSubsystem anfordert , ruft der OpenSSH-Server das Programm standardmäßig /usr/lib/openssh/sftp-serverüber die Anmeldeshell des Benutzers auf (der Speicherort kann variieren). Es kann jedoch auch so konfiguriert werden, dass ein interner SFTP-Server über die Leitung ausgeführt wird
Subsystem sftp internal-sftp
in der sshd_configDatei. Im Fall des internen SFTP-Servers und nur in diesem Fall wird die Anmeldeshell des Benutzers umgangen.
Für diese Herausforderung
Im Fall von OverTheWire Bandit 18 .bashrcenthält
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Sie können dieses Level also lösen, indem Sie alles tun, was dazu führt, dass Bash nicht interaktiv ist.
Wie Sie festgestellt haben, funktioniert SFTP.
Aber ssh bandit18@bandit.labs.overthewire.org cat readmewürde auch funktionieren.
Wie würde echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
Und das Drücken von Strg + C zum richtigen Zeitpunkt während eines interaktiven Logins würde ebenfalls funktionieren: Es würde das Bash unterbrechen, sodass das .bashrcnicht vollständig ausgeführt würde. Bash benötigt makroskopische Zeit zum Starten. Dies funktioniert zwar nicht zuverlässig, kann aber in der Praxis durchgeführt werden.