En bash en general
El diseño de Bash con respecto a los archivos de inicio es bastante peculiar. Bash se carga .bashrc
en dos circunstancias no relacionadas:
Sobre SSH en general
Cuando ejecuta un comando a través del protocolo SSH, el comando se pasa por el cable como una cadena. La cadena es ejecutada por el shell remoto. Cuando ejecuta ssh example.com somecommand
, si el shell de inicio de sesión del usuario remoto es /bin/bash
, se ejecuta el servidor SSH /bin/bash -c somecommand
. No hay forma de evitar el shell de inicio de sesión. Esto permite restringidas shells de entrada, por ejemplo, para permitir solamente la copia de archivos y no la ejecución de comandos en general.
Hay una excepción: el protocolo SSH permite al cliente solicitar un subsistema específico. Si el cliente solicita el sftp
subsistema, entonces, de manera predeterminada, el servidor OpenSSH invoca el programa /usr/lib/openssh/sftp-server
(la ubicación puede variar) a través del shell de inicio de sesión del usuario. Pero también se puede configurar para ejecutar un servidor SFTP interno a través de la línea
Subsystem sftp internal-sftp
en el sshd_config
archivo En el caso del servidor SFTP interno, y solo en este caso, se omite el shell de inicio de sesión del usuario.
Para este desafío
En el caso de OverTheWire Bandit 18, .bashrc
contiene
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Entonces puede resolver este nivel haciendo cualquier cosa que haga que bash no sea interactivo.
Como descubriste, SFTP funciona.
Pero ssh bandit18@bandit.labs.overthewire.org cat readme
también funcionaría.
Como lo haría echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
Y presionar Ctrl + C en el momento correcto durante un inicio de sesión interactivo también funcionaría: interrumpiría bash, por lo .bashrc
que no se ejecutaría por completo. Bash toma tiempo macroscópico para iniciarse, por lo que si bien esto no funciona de manera confiable, se puede hacer en la práctica.