Na festança em geral
O design do Bash em relação aos arquivos de inicialização é bastante peculiar. O Bash é carregado .bashrcem 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_profilenormalmente carrega.bashrc .
Quando o bash não é interativo, nem um shell de login, nem invocado, shmas recebe um comando para executar com -ce 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_CLIENTou SSH2_CLIENTestiver 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 sftpsubsistema, 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_configarquivo 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, .bashrcconté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 readmetambé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 .bashrcque 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.