Accedi senza eseguire bash_profile o bashrc


75

Quindi diciamo che uno ha digitato qualcosa nel loro .bashrcche gli impedisce di accedere tramite ssh(cioè il login ssh esce a causa dell'errore nel file). C'è un modo in cui quella persona potrebbe accedere senza eseguirlo (o .bashrcpoiché l'uno esegue l'altro) o altrimenti eliminare / rinominare / invalidare il file?

Supponiamo di non avere accesso fisico alla macchina, e questo è l'unico account utente con la possibilità di accedere.

Per riferimento: .bash_profileinclude .bashrc:

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

Modifica: cose che ho provato:

ssh user@host "rm ~/.bashrc"

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

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

Tutti danno l'errore:

/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
Il comando scp non funzionerà perché scp leggerà anche .bashrc durante la connessione. Per evitare il problema In futuro, potresti aggiungere qualcosa come [ -z "$PS1" ] && returnall'inizio di ./bashrc. In questo modo scp smetterà di analizzare .bashrc dopo la prima riga e sarai in grado di sovrascriverlo in caso di emergenza.
dalloliogm,

Risposte:


24

Penso che le tue uniche opzioni siano:

  • ssh come altro utente e su al tuo account;

  • utilizzare qualcosa come ftp o smbclient, se i servizi pertinenti sono abilitati sull'host;

  • trova una vulnerabilità aperta in un servizio di rete aperto e sfruttalo :).

  • ottenere un amministratore per risolvere il problema.


4
"Supponi di non avere accesso fisico alla macchina, e questo è l'unico account utente con la possibilità di accedere."
Dennis Williamson,

Sto percorrendo questa strada. Pubblicherò la soluzione dopo averla trovata. Fortunatamente, ho alcune strade di attacco.
Tom Ritter,

1
usato Filezilla su SFTP nel mio server e mi ha risolto. Grazie mille, mi hai salvato. Ho avuto una condizione di "uscita 1" nel mio .bash_profile per caso e mi ha colmato.
Djangofan,

117

ssh -t username@hostname /bin/sh per me va bene.


Funziona bene - semplice e fornisce una shell che puoi usare per risolvere il problema.
MT.

1
Prova a farlo con l'app Secure Shell in Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ) ma non riesco a capire come / dove inserire gli argomenti della riga di comando. Qualche consiglio?
Benj,

2
Questo non funziona per me (anche se dovrebbe secondo la pagina man). L'host locale esegue Ubuntu 14.04.1 ed è Ubuntu 12.04.5 sull'host remoto. Non riesco a sincronizzare perché la mia shell di accesso è tcsh e sull'host remoto stampa garbage la directory è montata su NSF). Ho pensato di risolvere il problema bypassando la shell di accesso, ma non funziona.
Silvio Levy,

2
Se la tua shell predefinita è csh / tcsh, sarà sempre fonte di .cshrc/ .tcshrcanche per shell non interattive.
Brian Vandenberg,

Sono seduto qui a ridere a crepapelle per la mia stessa stupidità per essere arrivato a questo punto. La tua soluzione ha funzionato alla grande. Grazie mille per aver aiutato questo armeggiatore a fare un po 'di lavoro
ijustlovemath,

36

Ho avuto lo stesso problema e in qualche modo sono stato in grado di risolverlo. Ho usato ssh per accedere al sistema e ho premuto e tenuto premuto Ctrl + c non appena ho effettuato l'accesso al sistema. Quindi, ~ / .bashrc non è stato letto e sono stato in grado di modificarlo.


11
Ero scettico, ma in realtà funziona ...
rmobis

Questo è geniale!
user1747134

In realtà funziona ... grazie! Gli altri metodi non hanno mai funzionato per me.
Zzzach ...

su Mac con solo un .bash_profile, questo ha funzionato per me :)
AnneTheAgile

OMG, pensavo di aver cercato su Internet, quindi ho deciso di provare questo, e questo è l'unico modo che funziona per me! Grazie!
Jiahao Cai,

21

Ho usato un CVE pubblicato per eseguire un comando come root tramite un'interfaccia Web in un software di monitoraggio della rete che avevo installato. rm /RAID/home/tom/.bashrc

Quindi potrei accedere e svn ripristinare le modifiche che ho fatto.


11
È allo stesso tempo fantastico e fallimentare.
MikeyB,

1
@ TomRitter: si prega di fornire quel riferimento ᴄᴠᴇ.
user2284570,

1
Era in una versione oooold di cactus, quindi a meno che tu non stia eseguendo un software di 8 anni non penso che ti aiuterà. E se stai utilizzando un software di 8 anni, non posso aiutarti. ;)
Tom Ritter,

15

È necessario a) avviare bash senza source'ing sia ~/.bashrco ~/.bash_profilee b) in quanto tale shell non sarebbe una shell di login completo / non hanno alcun tty allegato, la forza ssh di allegare una tty :

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

3
Funziona, ma nota che non avrai il tuo solito prompt, solo uno schermo vuoto. prova a farlo lsper convincerti che sei dentro :). Nota anche che questo userà un dumbtermine, quindi per me nano non funziona
Ciprian Tomoiagă

7

Sei sfortunato.

Tutti i comandi ssh eseguono la shell di accesso. ssh $COMMANDcorre $SHELL -c $COMMAND, scpcorre $SHELL -c /path/to/sftp-server, pianifica sshsolo il tuo guscio.


3
Questo vale anche per sftp: anche i sottosistemi SSH sono apparentemente eseguiti all'interno di una shell.
lxgr

Nella mia esperienza hai ragione, anche se la pagina man di ssh dice "Se il comando è specificato, viene eseguito sull'host remoto invece che su una shell di login". Tuttavia, il poster è stato in grado di risolvere il problema utilizzando la risposta più votata (nome host ssh / bin / sh). Cosa dà?
Silvio Levy,

@Silvio, la risposta di OP è che ha usato un exploit non correlato a SSH.
Tobu,

Giusto. Qualcuno ha riportato il successo con la risposta più votata e ho pensato in fretta che fosse l'OP. Vorrei che funzionasse - ho una situazione simile, anche se è semplicemente fastidioso non paralizzante. (Vedi il mio commento sotto la risposta più votata sopra.)
Silvio Levy

6

Nessuna delle risposte sopra può bypassare la shell di accesso di ssh. È possibile passare una riga di comando completa e quindi esegue la shell remota per elaborare il comando e impostare l'ambiente di lavoro per il comando. Ecco a cosa servono le shell ed è il modo Unix. Avresti tutti i tipi di problemi di compatibilità se provassi a eseguire qualcosa senza una shell. Allo stesso modo, provare un control-C dovrebbe fare come chiamare exit, che è il comportamento che stai cercando di evitare. Se bash continua è un bug. Perché la gente continua a dire che la pagina man dice qualcosa di diverso, è necessario citarla perché non dice nulla del genere nella mia pagina man.

Inoltre, sulla maggior parte dei sistemi Linux, specificare / bin / sh non fa NIENTE poiché si tratta solo di un link simbolico a bash!

Vuoi fare un test? Aggiungi istruzioni "echo" a te .bashrc e .profile e vedi quale viene eseguito. L'ho fatto. Ecco i risultati

ssh user@hosteseguirà .bash_profile ssh user@host /bin/basheseguirà .bashrc, ma pensa che non sia interattivo (nessun prompt). ssh -t user@host /bin/bashesegue .bashrc due volte ... una volta al login, una volta per il comando passato, quindi specificando QUALSIASI shell verrà sempre eseguito il primo. ssh -T user@hostequivale a non specificare affatto -T o -t.

Ora, se noti, il mio sistema non esegue entrambi i file, solo l'uno o l'altro. Ma il poster originale ha una linea in .bash_profile che esegue .bashrc, quindi .bashrc verrà sempre eseguito, qualunque cosa accada. Non avrei dovuto mettere quella linea lì! Se quella linea non esistesse, non avresti avuto problemi.

Dovrai trovare un altro modo o trovare un amministratore. Ecco a cosa servono gli amministratori.


Alcuni punti positivi; nessun eseguibile passato come comando può aiutare, come spiegato, ma su un punto un po 'controverso: se /bin/sh fosse eseguito prima, sarebbe utile, perché Bash non si carica ~/.bashrcquando viene invocato come sh. Questa risposta è un superset dell'altra tua risposta, quindi per favore cancella l'altra.
mklement

3

Qualcosa di simile a:

ssh host "/bin/bash --norc"

che sembra funzionare, ma nota che PS1 non è impostato, quindi digiterai i comandi senza un prompt.

Questo ha il vantaggio di essere non distruttivo.


1
Questo non funziona, ha tentato prima di accedere con successo, ma non è possibile accedere e quindi non può eseguire bash --norc
Tom Ritter il

2

provare

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

^ C c'è control-v quindi c


1
È ctrl-v e ctrl-c sul mio sistema. Grazie comunque! :)
mzuther,

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

Questo ha funzionato per me in un ambiente molto limitato quando nulla avrebbe funzionato. Ho dovuto specificare il percorso completo di .bashrc.
zbeekman,

1

Mashing ctrl-C funziona fintanto che puoi ottenere un ctrl-C prima che il .bashrc esca. Sfortunatamente, questo può essere difficile da fare se exitè all'inizio del .bashrc.

Puoi inserire un ctrl-C il prima possibile eseguendo il piping su ssh direttamente:

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

Si noti che ^Cviene digitato come ctrl-V seguito da ctrl-C.

Questo convoglia un singolo ctrl-C seguito dall'input dal terminale di controllo, mentre -ttimpone l'allocazione di un psuedo-terminale. Tutto ciò ti dà una shell (alquanto malformata) sulla macchina remota, bypassando il più possibile di .bashrc.


0

Puoi provare a sovrascrivere .bash_profilecon un file vuoto usando il scpcomando. Da quello che ho cercato su google, scp usa un login non interattivo che non legge .bash_profile.


A meno che non stia (ipoteticamente) ricordando la struttura della directory in modo errato, e non mi dia un errore a riguardo, questo non funziona - scp esegue anche i file.
Tom Ritter,

1
La cosa che la gente non sta realizzando è che SCP non è niente di speciale; è solo un altro comando eseguito su ssh - che significa quasi tutto ciò che accade per una sessione ssh interattiva che accade anche con scp.
Larsks,

che dire di sftp, afaik è un sottosistema ssh.
allo

0

Puoi anche eliminare il file bashrc:

ssh <hostname> rm ~/.bashrc

Il problema si trova nel file .bash_profile, non nel bashrc.
Laurent Etiemble,

1
Questo non funziona - cerca prima una shell e fallisce.
Tom Ritter,

0

Se il sistema è configurato normalmente, .bash_profile non verrà eseguito per una shell non interattiva (come l'esecuzione di un comando).

Poiché affermi che il problema si trova nel file .bash_profile, prova a spostarlo di mezzo:

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

Non pensavo in che modo fossero importanti i file collegati - .bash_profile include .bashrc = (ho aggiunto ulteriori informazioni.
Tom Ritter,

1
Ma ciò che Lockie sta suggerendo - come confermato dalla pagina man di bash - è che una shell non interattiva non eseguirà né .bashrc né .bash_profile. Tuttavia, anche quando si passano i comandi sulla riga di comando ssh (come in questo esempio), bash viene comunque avviato come una shell "interattiva", il che significa che leggerà il file .bashrc. Quindi una buona idea, ma sfortunatamente ssh non collaborerà.
Larsks,

0

UH = 'user @ host'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Si prega di non tagliare ed eseguire, cambiare usere host, quindi modificare letmeine salvare come.bashrc


0

Complimenti a user60069, ha funzionato per me, ma io uso il file di avvio specifico della shell .bashrc, quindi il login con / bin / sh ha funzionato per me.

Tuttavia, se ti trovi in ​​una situazione "senza fortuna", offro questa soluzione, basata sulle soluzioni di user60069 e Dennis W:

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

Dennis W ha offerto l'opzione --norc, che qualcuno ha detto che non funzionava per loro.

Esegui "man bash" o "man (la tua shell)" per le opzioni per disabilitare i file di avvio. Hai solo bisogno di usare una shell disgustosa per il tempo necessario per risolvere il problema.


0

Un altro modo per accedere al server è senza profilo, si prega di trovare sotto il comando
ssh -t user@host bash --noprofile

Per AWS utilizzando il file pem e nessun altro utente
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Spero che sia di aiuto!


-1

Dai suggerimenti e dalle risposte di cui sopra, direi che non sono i file .bashrc o .bash_profile. Inoltre la manpage ssh dice che se si specifica un comando da eseguire, i file del profilo non verranno letti.

Suggerirei di provare a eseguire una shell di login diversa (ksh? Csh? Sh?) Dal percorso assoluto; inoltre, fai attenzione che potrebbe trattarsi di un problema completamente diverso (quota? Esegui e leggi i permessi sulla tua home directory?), quindi un approccio laterale sarebbe meglio. Puoi chiedere a un altro utente di fare una ls -la $YOUR_HOME_DIRe-mail il risultato?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.