Na festança em geral
O design do Bash em relação aos arquivos de inicialização é bastante peculiar. O Bash é carregado .bashrc
em duas circunstâncias não relacionadas:
- Quando é um shell interativo, exceto quando é um shell de logon (e exceto quando é chamado como
sh
). É por isso que .bash_profile
normalmente carrega.bashrc
.
Quando o bash não é interativo, nem um shell de login, nem invocado, sh
mas recebe um comando para executar com -c
e SHLVL
é desabilitado ou menor ou igual a 1, e uma das seguintes opções é verdadeira:
- Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado por
rshd
, ou seja, durante a execução rsh remotehost.example.com somecommand
.
Se ativado em tempo de compilação (que é o caso de algumas distribuições, como Debian e derivativos), se uma das variáveis de ambiente SSH_CLIENT
ou SSH2_CLIENT
estiver definida. Na prática, isso significa que o bash é invocado por sshd
, ie ssh remotehost.example.com somecommand
.
Se você não souber como o bash foi compilado, poderá descobrir se essa opção foi configurada verificando se o binário contém a sequência SSH_CLIENT
:
strings /bin/bash | grep SSH_CLIENT
No SSH em geral
Quando você executa um comando através do protocolo SSH, o comando é passado pela conexão como uma sequência. A cadeia é executada pelo shell remoto. Quando você executa ssh example.com somecommand
, se o shell de logon do usuário remoto estiver /bin/bash
, o servidor SSH será executado /bin/bash -c somecommand
. Não há como ignorar o shell de login. Isso permite shells de login restritos, por exemplo, para permitir apenas a cópia de arquivos e não a execução geral de comandos.
Há uma exceção: o protocolo SSH permite que o cliente solicite um subsistema específico. Se o cliente solicitar o sftp
subsistema, por padrão, o servidor OpenSSH chama o programa /usr/lib/openssh/sftp-server
(a localização pode variar) por meio do shell de login do usuário. Mas também pode ser configurado para executar um servidor SFTP interno através da linha
Subsystem sftp internal-sftp
no sshd_config
arquivo No caso do servidor SFTP interno, e somente nesse caso, o shell de logon do usuário é ignorado.
Para este desafio
No caso do OverTheWire Bandit 18, .bashrc
contém
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Assim, você pode resolver esse nível fazendo qualquer coisa que faça com que o bash não seja interativo.
Como você descobriu, o SFTP funciona.
Mas ssh bandit18@bandit.labs.overthewire.org cat readme
também funcionaria.
Como seria echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
E pressionar Ctrl + C no momento certo durante um login interativo também funcionaria: ele interromperia o bash, para .bashrc
que não fosse completamente executado. O Bash leva um tempo macroscópico para iniciar, portanto, embora isso não funcione de maneira confiável, pode ser feito na prática.