Em bash em geral
O design do Bash em relação aos arquivos de inicialização é bastante peculiar. O Bash carrega .bashrc
em duas circunstâncias não relacionadas:
- Quando é um shell interativo, exceto quando é um login shell (e exceto quando é invocado como
sh
). É por isso que.bash_profile
normalmente carrega.bashrc
-
Quando o bash não é não interativo, nem um shell de login nem invocado como
sh
, mas um comando para executar com-c
eSHLVL
é indefinido ou menor ou igual a 1, e um das seguintes afirmações é verdadeira:- Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado por
rshd
, ou seja, ao executarrsh 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
ouSSH2_CLIENT
for definida. Na prática, isso significa que o bash é chamado porsshd
, ou seja,ssh remotehost.example.com somecommand
.
Se você não sabe como o bash foi compilado, você pode descobrir se esta opção foi configurada verificando se o binário contém a stringSSH_CLIENT
:strings /bin/bash | grep SSH_CLIENT
- Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado por
No SSH em geral
Quando você executa um comando através do protocolo SSH, o comando é passado pelo fio como uma string. A string é executada pelo shell remoto. Quando você executar ssh example.com somecommand
, se o shell de login do usuário remoto for /bin/bash
, o servidor SSH executará /bin/bash -c somecommand
. Não há como ignorar o shell de login. Isso permite shells de login restrito, por exemplo, para permitir somente a cópia de arquivos e não a execução geral de comandos.
Existe uma exceção: o protocolo SSH permite que o cliente solicite um subsistema específico. Se o cliente solicitar o subsistema sftp
, por padrão, o servidor OpenSSH chamará o programa /usr/lib/openssh/sftp-server
(o local 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 arquivo sshd_config
. No caso do servidor SFTP interno, e somente nesse caso, o shell de login 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
Então você pode resolver este nível fazendo qualquer coisa que faça com que o bash não seja interativo.
As you discovered, SFTP works.
Butssh [email protected] cat readme
would also work.
As wouldecho 'cat readme' | ssh [email protected]
.
And pressing Ctrl+C at the right time during an interactive login would also work: it would interrupt bash, so the.bashrc
would not be completely executed. Bash takes macroscopic time to start up, so while this doesn't work reliably, it can be done in practice.