Auf Bash im Allgemeinen
Das Design von Bash in Bezug auf Startdateien ist ziemlich eigenartig. Bash-Ladungen .bashrc
unter 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_profile
normalerweise geladen.bashrc
.
Wenn bash weder interaktiv noch eine Login-Shell ist oder als sh
Befehl aufgerufen wird , mit dem ausgeführt werden soll, -c
und SHLVL
nicht 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_CLIENT
oder SSH2_CLIENT
definiert 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 somecommand
die Anmeldeshell des Remotebenutzers ausführen , wird /bin/bash
der 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 sftp
Subsystem 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_config
Datei. 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 .bashrc
enthä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 readme
wü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 .bashrc
nicht 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.