Efetue login sem executar o bash_profile ou o bashrc


75

Então, digamos que alguém digitou algo .bashrcque impede que ele faça o login via ssh(ou seja, o login do ssh sai por causa do erro no arquivo). Existe alguma maneira pela qual a pessoa possa fazer login sem executá-la (ou .bashrcdesde que uma execute a outra) ou excluir / renomear / invalidar o arquivo?

Suponha que você não tenha acesso físico à máquina e essa seja a única conta de usuário com capacidade de realizar o ssh.

Para referência: .bash_profileinclui .bashrc:

[[ -f ~/.bashrc ]] && . ~/.bashrc

Edit: Coisas que eu tentei:

ssh user@host "rm ~/.bashrc"

scp nothing user@host:/RAID/home/tom/.bashrc

ssh user@host  "/bin/bash --norc"

Todos dão o erro:

/RAID/home/tom/.bashrc: line 16: /usr/local/bin/file: No such file or directory
/RAID/home/tom/.bashrc: line 16: exec: /usr/local/bin/file: cannot execute: No such file or directory

4
Seu comando scp não funcionará porque o scp também lerá .bashrc ao se conectar. Para evitar o problema No futuro, você pode adicionar algo como [ -z "$PS1" ] && returnno início de ./bashrc. Dessa forma, o scp interromperá a análise do .bashrc após a primeira linha, e você poderá substituí-lo em caso de emergência.
Dalloliogm 26/08/16

Respostas:


24

Eu acho que suas únicas opções são:

  • ssh como outro usuário e su na sua conta;

  • use algo como ftp ou smbclient, se os serviços relevantes estiverem ativados no host;

  • encontre uma vulnerabilidade aberta em um serviço de rede aberto e explore-o :).

  • obtenha um administrador para corrigir o problema.


4
"Suponha que você não tenha acesso físico à máquina, e esta é a única conta de usuário com capacidade de realizar o ssh".
Dennis Williamson

Eu estou indo por este caminho. Vou postar a solução depois que a encontrar. Felizmente, tenho algumas avenidas de ataque.
Tom Ritter

1
usei o Filezilla para SFTP no meu servidor e ele me corrigiu. Muito obrigado, você me salvou. Eu tive uma condição de "saída 1" no meu .bash_profile por acidente e isso me prejudicou.
djangofan

117

ssh -t username@hostname /bin/sh funciona para mim.


Isso funciona bem - simples e fornece um shell que você pode usar para corrigir o problema.
MT.

1
Tentando fazer isso com o aplicativo Secure Shell no Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ), mas não consegue descobrir como / onde colocar os argumentos da linha de comando. Alguma dica?
Benj

2
Isso não funciona para mim (embora deva de acordo com a página de manual). O host local executa o ubuntu 14.04.1 e o ubuntu 12.04.5 no host remoto. Não consigo fazer o rsync porque meu shell de login é tcsh e no host remoto ele imprime lixo (tcsh: não existe esse arquivo ou diretório tcsh: tentando iniciar a partir de "/ u / levy" - o que me disseram que é porque o diretório está montado NSF). Eu pensei em resolver o problema ignorando o shell de login, mas isso não funciona.
Silvio Levy

2
Se seu shell padrão for csh / tcsh, ele sempre fornecerá seu .cshrc/ .tcshrcmesmo para shells não interativos.
18715 Brian Brian Gandy

Estou sentada aqui rindo da minha própria estupidez por ter chegado a esse ponto. Sua solução funcionou muito bem. Muito obrigado por ajudar este tinkerer obter algum trabalho feito
ijustlovemath

36

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
Eu era cético, mas isso realmente funciona ...
rmobis

Isso é genial!
user1747134

Na verdade funciona ... obrigado! Os outros métodos nunca funcionaram para mim.
Zzzach ... 30/10

no mac com apenas um .bash_profile, isso funcionou para mim :)
AnneTheAgile

OMG, eu pensei que tinha pesquisado toda a internet, então eu decidi tentar isso, e esta é a única maneira que funciona para mim! Obrigado!
Jiahao Cai

21

Usei um CVE publicado para executar um comando como root através de uma interface da Web em um software de monitoramento de rede que eu havia instalado. rm /RAID/home/tom/.bashrc

Então eu poderia entrar e svn reverter as alterações que fiz.


11
Isso é incrível e failriffic ao mesmo tempo.
18711 Mike_B

1
@ TomRitter: forneça essa referência.
user2284570

1
Estava em uma versão oooold de cactos, então, a menos que você esteja executando um software de 8 anos, não acho que isso o ajudará. E se você estiver executando um software de 8 anos, não posso ajudá-lo. ;)
Tom Ritter

15

Você precisa a) começar a festa sem source'ing quer ~/.bashrcou ~/.bash_profilee b) uma vez que tal shell não seria um shell de login completo / não têm tty ligada, força ssh para anexar um tty :

ssh -t user@host bash --norc --noprofile

3
Isso funciona, mas observe que você não terá seu prompt habitual, apenas uma tela vazia. tente fazer um lspara se convencer de que você está :). Além disso, note que este irá usar um dumbtermo, então para mim nano não funciona
Ciprian Tomoiagă

7

Você está sem sorte.

Todos os comandos ssh executam seu shell de login. ssh $COMMANDcorre $SHELL -c $COMMAND, scpcorre $SHELL -c /path/to/sftp-server, simples sshsimplesmente executa seu shell.


3
Isso também é válido para sftp - mesmo os subsistemas SSH são aparentemente executados de dentro de um shell.
Lxgr

Na minha experiência, você está correto, mesmo que a página de manual do ssh diga "Se o comando for especificado, ele será executado no host remoto em vez de no shell de login". No entanto, o pôster conseguiu resolver o problema usando a resposta mais bem classificada (ssh hostname / bin / sh). O que da?
Silvio Levy

@ Silvio, a resposta do OP é que ele usou uma exploração não relacionada ao SSH.
Tobu

Direito. Alguém relatou sucesso com a resposta mais alta e eu rapidamente assumi que era o OP. Eu gostaria que funcionasse - eu tenho uma situação semelhante, embora seja apenas irritante, não incapacitante. (Ver o meu comentário sob a resposta de maior audiência acima.)
Silvio Levy

6

Nenhuma das respostas acima pode ignorar o shell de login do ssh. Você pode passar uma linha de comando completa e executar o shell remoto para processar o comando e definir o ambiente de trabalho para o comando. É para isso que servem as conchas e é a maneira do Unix. Você teria todos os tipos de problemas de compatibilidade se tentasse executar algo sem um shell. Da mesma forma, tentar um C-controle deve fazer o mesmo que chamar exit, que é o comportamento que você está tentando evitar. Se o bash continuar, é um bug. Por que as pessoas continuam dizendo que a página de manual diz algo diferente precisa citá-la, porque não diz nada disso na minha página de manual.

Além disso, na maioria dos sistemas linux, especificar / bin / sh NADA, pois é apenas um link simbólico para o bash!

Quer testar? Adicione instruções "eco" a você .bashrc e .profile e veja qual é executado. Eu fiz. Aqui estão os resultados.

ssh user@hostexecutará .bash_profile ssh user@host /bin/bashexecutará .bashrc, mas considera não interativo (sem prompt). ssh -t user@host /bin/bashexecuta .bashrc duas vezes ... uma vez no login, uma vez para o comando passado, portanto, especificar QUALQUER shell sempre executará o primeiro. ssh -T user@hosté o mesmo que não especificar -T ou -t.

Agora, se você perceber, MEU sistema não está executando os dois arquivos, apenas um ou outro. Mas o pôster original tem uma linha em .bash_profile executando .bashrc, portanto, .bashrc sempre será executado, não importa o quê. Não deveria ter colocado essa linha lá! Se essa linha não existisse, você não teria problemas.

Você precisará encontrar outra maneira ou encontrar um administrador. É para isso que servem os administradores.


Alguns bons pontos; não executável passado como um comando pode ajudar, como você explicar, mas em um ponto um tanto discutível: se /bin/sh fez começar a ser executado primeiro, ele iria ajudar, porque Bash não carregar ~/.bashrcquando invocada como sh. Esta resposta é um superconjunto da sua outra resposta, portanto, exclua a outra.
mklement

3

Algo como:

ssh host "/bin/bash --norc"

o que parece funcionar, mas observe que o PS1 não está definido, portanto você digitará comandos sem aviso prévio.

Isso tem a vantagem de não ser destrutivo.


1
Isso não funciona, ele tentou um login bem-sucedido primeiro, mas não pode fazer o login e, portanto, não pode executar o bash --norc
Tom Ritter

2

experimentar

echo ^C | ssh <hostname> ' rm .bashrc'

^ C existe controle-v então c


1
É ctrl-v e ctrl-c no meu sistema. Obrigado mesmo assim! :) #
31416 mzuther

2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"

Isso funcionou para mim em um ambiente muito restrito, quando nada funcionaria. Eu tive que especificar o caminho completo para .bashrc.
Zbeekman

1

Mascarar ctrl-C funciona desde que você possa inserir um ctrl-C antes que o .bashrc saia. Infelizmente, isso pode ser difícil de fazer se ocorrer exitno início do .bashrc.

Você pode inserir um ctrl-C o mais rápido possível, canalizando-o para ssh diretamente:

{ echo ^C; cat /dev/tty; } | ssh -tt user@host

Observe que ^Cé digitado como ctrl-V seguido por ctrl-C.

Isso canaliza um único ctrl-C seguido pela entrada do terminal de controle, enquanto -ttforça um terminal psuedo a ser alocado. Ao todo, isso fornece um shell (um tanto malformado) na máquina remota, ignorando o máximo possível de .bashrc.


0

Você pode tentar sobrescrever o .bash_profilearquivo vazio usando o scpcomando Pelo que pesquisei, o scp usa um login não interativo que não lê .bash_profile.


A menos que eu esteja (hipoteticamente) lembrando a estrutura do diretório errado, e isso não está me dando um erro, isso não funciona - o scp também executa o (s) arquivo (s).
Tom Ritter

1
O que as pessoas não estão percebendo é que scp não é nada de especial; é apenas mais um comando executado sobre o ssh - o que significa quase tudo o que acontece em uma sessão interativa do ssh também é feliz com o scp.
Larsks

e quanto ao sftp, o afaik é um subsistema ssh.
allo

0

Você também pode excluir o arquivo bashrc:

ssh <hostname> rm ~/.bashrc

O problema está no arquivo .bash_profile, não no bashrc.
Laurent Etiemble

1
Isso não funciona - ele tenta primeiro um shell e falha.
Tom Ritter

0

Se o sistema estiver configurado normalmente, .bash_profile não será executado para um shell não interativo (como a execução de um comando).

Como você declara que o problema está no arquivo .bash_profile, tente movê-lo para fora do caminho:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"

Eu não pensei que maneira os arquivos estavam vinculados importava - .bash_profile inclui .bashrc = (eu adicionei mais informações.
Tom Ritter

1
Mas o que Lockie está sugerindo - o que é confirmado pela página de manual do bash - é que um shell não interativo não executará .bashrc ou .bash_profile. No entanto, mesmo quando você passa comandos na linha de comando ssh (como neste exemplo), o bash ainda é iniciado como um shell "interativo", o que significa que ele lerá seu arquivo .bashrc. É uma boa ideia, mas infelizmente o ssh não cooperará.
Larsks

0

UH = 'usuário @ host'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Não recorte e corra, altere usere host, em seguida, edite letmeine salve como.bashrc


0

Parabéns ao user60069, funcionou para mim, mas eu uso o arquivo de inicialização específico do shell .bashrc, portanto, fazer o login com / bin / sh funcionou para mim.

No entanto, se você estiver na situação "sem essa sorte", ofereço esta solução, com base nas soluções de user60069 e Dennis W:

ssh -t you@host  /bin/bash --noprofile  --norc

Dennis W ofereceu a opção --norc, que alguém disse que não funcionava para eles.

Execute "man bash" ou "man (your shell)" para obter opções para desativar os arquivos de inicialização. Você só precisa usar um shell repugnante durante o tempo necessário para corrigir o problema.


0

Outra maneira de acessar o servidor é sem perfil, por favor, encontre o comando abaixo
ssh -t user@host bash --noprofile

Para AWS usando arquivo pem e nenhum outro usuário
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Espero que isto ajude!


-1

Pelas sugestões e respostas dadas acima, eu diria que não são os arquivos .bashrc ou .bash_profile. Também a página de manual do ssh diz que, se você especificar um comando a ser executado, seus arquivos de perfil não serão lidos.

Eu sugiro tentar executar um shell de logon diferente (ksh? Csh? Sh?) Do caminho absoluto; Além disso, lembre-se de que pode haver um problema totalmente diferente (cota? permissão de execução e leitura no diretório inicial?); portanto, uma abordagem lateral seria melhor. Você pode pedir para outro usuário fazer um ls -la $YOUR_HOME_DIRe enviar o resultado por email?

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.