Eu estraguei tudo, saia em .bashrc


27

Eu coloquei "exit" no meu arquivo .bashrc. Como não tenho acesso físico à máquina, para conectar a ela, uso o ssh. Eu não tenho privilégios de root. Sempre que eu me conecto ao servidor, a conexão é fechada automaticamente.

Até agora, eu tentei:

  • Substituindo .bashrc com scp e sftp. A conexão fecha antes que eu possa fazer qualquer coisa.
  • Usando alguns programas GUI diferentes para acessar o ssh (a conexão fecha)
  • Sobrescrevendo o arquivo com ftp. (não pode usar ftp)
  • Do meu computador doméstico
    • $ ssh host "bash --noprofile --norc" (a conexão é fechada)
    • $ ssh host "mv .bashrc bashrc_temp" (a conexão é fechada)
    • host $ ssh "rm .bashrc" (a mesma coisa)
    • $ ssh host -t (a conexão fecha)

Existe algo que eu possa fazer para desativar o .bashrc ou talvez substituir o arquivo antes que o .bashrc seja fornecido?

ATUALIZAR

@ ring0

Eu tentei sua sugestão, mas sem sorte. O arquivo bashrc ainda roda primeiro.

Outra coisa que tentei foi fazer login com outra conta e sudo editar o .bashrc, mas não tenho privilégios de sudo nessa conta.

Acho que vou entrar em contato com o administrador.

EDITAR

@shellholic

Não acredito, mas essa abordagem funcionou! Mesmo que "exit" ocorra nas primeiras linhas (compostas apenas por algumas se blocos e instruções de exportação ) no arquivo .bashrc, ainda assim consegui interromper a operação com Ctrl-c com êxito em vinte tentativas (demorou cerca de 3 minutos). Eu removi a linha incorreta no .bashrc e tudo está funcionando novamente.


2
darwinawards.com, você deve ter (temporariamente) um acesso como um usuário que pode sobrescrever seu arquivo .bashrc ou alterar seu shell padrão para outra coisa. "Pergunte ao administrador do sistema", como a MS diz.

2
man 8 sshddiz que é 9. Runs user's shell or command.o nono passo ...: - /

11
O scp também irá parar de funcionar porque o shell ainda é aberto e o .bashrc é chamado #
Aleksandr Levchuk

Para sua informação, a razão pela qual a maioria dessas sugestões não funciona é porque o ssh executa qualquer comando passando-o como um argumento para o shell do usuário. Procure por execve em session.c. Não há como modificar / adicionar / excluir os argumentos dessa chamada do shell do usuário.
Mark Wagner

Respostas:


37

você pode tentar abortar (ctrl + C) antes que a parte de saída .bashrcseja executada.

Eu tentei adicionando o seguinte no topo do bashrc de um testador, funciona, é apenas uma questão de tempo. Muito fácil no meu caso:

sleep 3
echo "Too late... bye"
exit 0

8
+1, porque provavelmente é a única solução que não requer ajuda do administrador do sistema. No entanto, é necessária muita sorte para ter o tempo correto (o host ssh -v pode ajudar um pouco).
JooMing

Na verdade, o ctrl + C funcionou. Mesmo sem dormir. Eu coloquei "exit" no meu bashrc e consegui me recuperar com um ctrl + C rápido após cerca de 4 tentativas. Por favor, edite a resposta para que eu possa alterar o "-1" para "+1".
Aleksandr Levchuk 28/11

@Aleksandr Levchuk done
shellholic

4
Aprecio muito a combinação de eficácia brutal e patética ridícula aqui.
Unixtippse

11
Eu estou rindo como um louco, aquela pressa quando finalmente funciona. Obrigado @JooMing, tentei todos os métodos aqui serverfault.com/questions/94503/… mesmo o pressionando Ctrl + C, mas só funcionou depois de adicionar a opção -v!
Mxmlnkn 12/10

12

Também consegui atrapalhar meu arquivo .bashrc em um novo cluster ao qual tive acesso experimental. Não querendo parecer um noob, a última coisa que eu queria fazer era pedir ajuda aos administradores, e eu não conseguia obter um ^ + C oportuno para o trabalho.
O que funcionou, no entanto, foi enviar um comando 'rm' como argumento final para o ssh. ie

ssh -tv user@host rm .bashrc

Não consegui que um comando 'mv' funcionasse (tentei antes sem -t), então acho que a opção -t deve ter feito isso, mas você pode testá-lo se quiser. Agora eu recuperei do arquivo .bashrc ~ (criado pelo vim) tudo, menos a linha desonesta em questão e tudo está certo no mundo! = D


2
ssh -tv user@home mv .bashrc .bashrc-oldfuncionou para mim
Code Commander

3

Se você pode fazer login como um usuário diferente, tente o seguinte:

su user -s /bin/sh

Você precisará da sua senha, é claro.


11
você poderia tentar shell diferente, não baseado em sh: kshoucsh
Hubert Kario 27/11

3

Se eu me lembro de algumas experiências ruins que tive assim, o ssh, scp, sftp parecem executar os arquivos de inicialização.

Minha sugestão é usar o FTP simples e, em seguida, excluir ou renomear o arquivo inválido na linha de comando do FTP após o login. Estou assumindo que o seu sistema permitirá o acesso ao FTP. Nesse caso, certifique-se de alterar sua senha (com segurança) quando concluir o reparo.


O Filezilla funcionou perfeitamente para isso. Basta clicar no menu "Servidor" e selecionar a configuração "Forçar exibição de arquivos ocultos".
Danny G

1

De man ssh( OpenSSH_5.6p1pelo menos, não tenho certeza de quando foi adicionado),

~/.ssh/rc
        Commands in this file are executed by ssh when the user logs in, just
        before the user's shell (or command) is started.  See the sshd(8) manual
        page for more information.

..que significa que você pode criar ~/.ssh/rccontendo o seguinte:

mv ~/.bashrc ~/bak.bashrc

Então, quando você sshentrar, o problemático bashrc será movido antes que seu shell de login seja iniciado - você poderá, obviamente, consertar bak.bashrce movê-lo de volta ao lugar


0

Conecte-se via SCP ou SFTP e edite / renomeie / exclua seu arquivo .bashrc dessa maneira. Edit - D'oh, vejo que você disse que tentou isso. Ah bem.


0

Eu tive o mesmo problema e, de alguma forma, consegui resolvê-lo. Usei o ssh para acessar o sistema e pressionei e segurei Ctrl + c assim que entrei no sistema. Então, ~ / .bashrc não foi lido e eu pude modificá-lo.


11
Duplicata exata da resposta mais upvoted aqui
pauska

0

Eu encontrei isso funcionando.

Interrompa o carregador de inicialização do grub pressionando e ... novamente pressione e para entrar nas linhas de carregamento do grub, novamente pressione e para editar a linha do kernel,

vá para o fim da linha;

adicione init = / bin / bash no final da linha,

digite para retornar, b para inicializar,

ele abrirá um shell bash, abra o vim /root/.bashrc e edite-o de acordo. sair e agora você poderá entrar



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.