Inicie sesión sin ejecutar bash_profile o bashrc

75

Entonces, digamos que uno escribió algo en su interior .bashrcque impide que él (o ella) inicie sesión a través de ssh(es decir, el inicio de sesión ssh se cierra debido al error en el archivo). ¿Hay alguna forma de que esa persona pueda iniciar sesión sin ejecutarla (o .bashrcdado que una ejecuta la otra), o de lo contrario eliminar / renombrar / invalidar el archivo?

Suponga que no tiene acceso físico a la máquina, y esta es la única cuenta de usuario con la capacidad de ingresar.

Para referencia: .bash_profileincluye .bashrc:

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

Editar: Cosas que he intentado:

ssh user@host "rm ~/.bashrc"

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

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

Todos dan el error:

/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
Tom Ritter
fuente
44
Su comando scp no funcionará porque scp también leerá .bashrc cuando se conecte. Para evitar el problema En el futuro, puede agregar algo como [ -z "$PS1" ] && returnal comienzo de ./bashrc. De esta forma, scp dejará de analizar .bashrc después de la primera línea y podrá sobrescribirlo en caso de emergencia.
dalloliogm

Respuestas:

24

Creo que tus únicas opciones son:

  • ssh como otro usuario y su a su cuenta;

  • use algo como ftp o smbclient, si los servicios relevantes están habilitados en el host;

  • encuentra una vulnerabilidad abierta en un servicio de red abierto y explótala :).

  • consigue un administrador para solucionar el problema.

larsks
fuente
44
"Suponga que no tiene acceso físico a la máquina, y esta es la única cuenta de usuario con la capacidad de ingresar".
Dennis Williamson
Estoy yendo por esta ruta. Publicaré la solución después de encontrarla. Afortunadamente, tengo algunas vías de ataque.
Tom Ritter
1
usé Filezilla a SFTP en mi servidor y me arregló. Muchas gracias, me salvaste. Tuve una condición de "salida 1" en mi .bash_profile por accidente y me mangué.
djangofan
117

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

user60069
fuente
Esto funciona bien, es simple y proporciona un shell que puede usar para solucionar el problema.
MT.
1
Intentando hacer esto con la aplicación Secure Shell en Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ) pero no puedo entender cómo / dónde colocar los argumentos de la línea de comandos. ¿Algun consejo?
Benj
2
Esto no funciona para mí (aunque debería de acuerdo con la página del manual). El host local ejecuta ubuntu 14.04.1 y es ubuntu 12.04.5 en el host remoto. No puedo rsync porque mi shell de inicio de sesión es tcsh y en el host remoto imprime basura (tcsh: No existe tal archivo o directorio tcsh: Intento comenzar desde "/ u / levy", que me dijeron que es porque el el directorio está montado en NSF). Pensé que resolvería el problema sin pasar por el shell de inicio de sesión, pero eso no funciona.
Silvio Levy
2
Si su shell predeterminado es csh / tcsh, siempre obtendrá su .cshrc/ .tcshrcincluso para shells no interactivos.
Brian Vandenberg
Estoy sentado aquí riéndome de mi estupidez por haber llegado a este punto. Su solución funcionó muy bien. Muchas gracias por ayudar a este ingeniero a realizar un trabajo
Ijustlovemath
36

Tuve el mismo problema y de alguna manera pude resolverlo. Usé ssh para acceder al sistema y presioné y mantuve presionadas las teclas Ctrl + c tan pronto como inicié sesión en el sistema. Entonces, ~ / .bashrc no se leyó y pude modificarlo.

miyashin
fuente
11
Era escéptico, pero esto realmente funciona ...
rmobis
Esto es genial!
user1747134
En realidad funciona ... gracias! Los otros métodos nunca funcionaron para mí.
Zzzach ...
en mac con solo un .bash_profile, esto funcionó para mí :)
AnneTheAgile
Dios mío, pensé que había buscado en todo Internet, luego decidí probar esto, ¡y esta es la única manera que funciona para mí! ¡Gracias!
Jiahao Cai
21

Utilicé un CVE publicado para ejecutar un comando como root a través de una interfaz web en un software de monitoreo de red que había instalado. rm /RAID/home/tom/.bashrc

Entonces podría iniciar sesión y svn revertir los cambios que hice.

Tom Ritter
fuente
11
Eso es al mismo tiempo asombroso y a prueba de fallas.
MikeyB
1
@TomRitter: Proporcione esa ᴄᴠᴇ referencia.
user2284570
1
Estaba en una versión antigua de cactus, así que a menos que esté ejecutando un software de 8 años, no creo que lo ayude. Y si está ejecutando software de 8 años, no puedo ayudarlo. ;)
Tom Ritter
15

Debe a) iniciar bash sin source'' ~/.bashrco '' ~/.bash_profileyb) ya que dicho shell no sería un shell de inicio de sesión completo / no tiene tty conectado, forzar ssh para adjuntar un tty :

ssh -t user@host bash --norc --noprofile
Christian Krause
fuente
3
Esto funciona, pero tenga en cuenta que no tendrá su mensaje habitual, solo una pantalla vacía. intenta hacer una lspara convencerte de que estás :). También tenga en cuenta que esto usará un dumbtérmino, por lo que para mí nano no funciona
Ciprian Tomoiagă
7

No tienes suerte.

Todos los comandos ssh ejecutan su shell de inicio de sesión. ssh $COMMANDcorre $SHELL -c $COMMAND, scpcorre $SHELL -c /path/to/sftp-server, sshsimplemente ejecuta tu caparazón.

Tobu
fuente
3
Esto también es cierto para sftp: incluso los subsistemas SSH aparentemente se ejecutan desde un shell.
lxgr
Según mi experiencia, tiene razón, aunque la página de manual de ssh dice "Si se especifica el comando, se ejecuta en el host remoto en lugar de un shell de inicio de sesión". Sin embargo, el póster pudo resolver el problema utilizando la respuesta mejor calificada (ssh hostname / bin / sh). ¿Lo que da?
Silvio Levy
@Silvio, la respuesta de OP es que utilizó un exploit no relacionado con SSH.
Tobu
Derecha. Alguien reportó el éxito con la respuesta mejor calificada y rápidamente asumí que era el OP. Desearía que funcionara, tengo una situación similar, aunque es simplemente molesta, no paralizante. (Vea mi comentario en la respuesta más alta de arriba).
Silvio Levy
6

Ninguna de las respuestas anteriores puede omitir el shell de inicio de sesión de ssh. Puede pasar una línea de comando completa, por lo que ejecuta el shell remoto para procesar el comando y establecer el entorno de trabajo para el comando. Para eso están los shells y es la forma de Unix. Tendría todo tipo de problemas de compatibilidad si intentara ejecutar algo sin un shell. Del mismo modo, probar un control-C debería hacer lo mismo que llamar a exit, que es el comportamiento que está tratando de evitar. Si bash continúa es un error. ¿Por qué la gente sigue diciendo que la página de manual dice algo diferente? Hay que citarla porque no dice nada de eso en mi página de manual.

¡Además, en la mayoría de los sistemas Linux, especificar / bin / sh NO HACE NADA ya que esto es solo un enlace simbólico para bash!

¿Quieres probar? Agregue declaraciones "echo" a usted .bashrc y .profile y vea cuál se ejecuta. Yo hice. Aquí están los resultados.

ssh user@hostejecutará .bash_profile ssh user@host /bin/bashejecutará .bashrc, pero cree que no es interactivo (sin solicitud). ssh -t user@host /bin/bashejecuta .bashrc dos veces ... una vez al iniciar sesión, una vez para el comando pasado, por lo que especificar CUALQUIER shell siempre se ejecutará primero. ssh -T user@hostes lo mismo que no especificar -T o -t en absoluto.

Ahora, si te das cuenta, MI sistema no ejecuta ambos archivos, solo uno u otro. Pero el póster original tiene una línea en .bash_profile ejecutando .bashrc, por lo que .bashrc siempre se ejecutará sin importar qué. ¡No debería haber puesto esa línea allí! Si esa línea no existiera, no habría tenido un problema.

Tendrá que encontrar otra forma de entrar o encontrar un administrador. Para eso están los administradores.

Evan Langlois
fuente
Algunos buenos puntos; no ejecutable pasa como un comando puede ayudar, como se explica, sino en un punto un tanto discutible: si /bin/sh lo hizo llegar a ejecutar en primer lugar, que podría ayudar, porque Bash no se carga ~/.bashrccuando se invoca como sh. Esta respuesta es un superconjunto de su otra respuesta, así que elimine la otra.
Mklement
3

Algo como:

ssh host "/bin/bash --norc"

lo que parece funcionar, pero tenga en cuenta que PS1 no está configurado, por lo que escribirá comandos sin un aviso.

Esto tiene la ventaja de no ser destructivo.

Dennis Williamson
fuente
1
Esto no funciona, primero intentó un inicio de sesión exitoso, pero no puede iniciar sesión y, por lo tanto, no puede ejecutar bash --norc
Tom Ritter
2

tratar

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

^ C hay control-v luego c

usuario161180
fuente
1
Es ctrl-v y ctrl-c en mi sistema. ¡Gracias de cualquier manera! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
wytten
fuente
Esto funcionó para mí en un entorno muy restringido cuando nada funcionaría. Tuve que especificar la ruta completa a .bashrc.
zbeekman
1

Mashing ctrl-C funciona siempre que pueda obtener un ctrl-C antes de que el .bashrc salga. Desafortunadamente, esto puede ser difícil de hacer si exites temprano en el .bashrc.

Puede poner un ctrl-C lo antes posible al conectarlo directamente a ssh:

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

Tenga en cuenta que ^Cse escribe como ctrl-V seguido de ctrl-C.

Esto canaliza un solo ctrl-C seguido de una entrada desde el terminal de control, mientras -ttobliga a asignar un psuedo-terminal. En total, esto le proporciona un shell (algo malformado) en la máquina remota mientras omite la mayor cantidad de .bashrc posible.

Chris
fuente
0

Puede intentar sobrescribir el .bash_profilearchivo vacío con el scpcomando. Por lo que busqué en Google, scp usa un inicio de sesión no interactivo que no lee .bash_profile.

Laurent Etiemble
fuente
A menos que (hipotéticamente) recuerde que la estructura del directorio es incorrecta, y no me está dando un error al respecto, esto no funciona: scp también ejecuta los archivos.
Tom Ritter
1
Lo que la gente no se está dando cuenta es que scp no es nada especial; es solo otro comando que se ejecuta sobre ssh, lo que significa que casi todo lo que sucede para una sesión ssh interactiva también sucede con scp.
larsks
que pasa con sftp, afaik es un subsistema ssh.
allo
0

También puede simplemente eliminar el archivo bashrc:

ssh <hostname> rm ~/.bashrc
sybreon
fuente
El problema está en el archivo .bash_profile, no en el bashrc.
Laurent Etiemble
1
Esto no funciona: primero intenta un shell y falla.
Tom Ritter
0

Si su sistema está configurado normalmente, .bash_profile no se ejecutará para un shell no interactivo (como ejecutar un comando).

Como usted indica que el problema está en el archivo .bash_profile, intente quitarlo:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"
Lockie
fuente
No pensé de qué manera los archivos estaban vinculados: .bash_profile incluye .bashrc = (agregué más información.
Tom Ritter,
1
Pero lo que sugiere Lockie, lo que confirma la página de manual de bash, es que un shell no interactivo no ejecutará ni .bashrc ni .bash_profile. Sin embargo, incluso cuando pasa comandos en la línea de comandos ssh (como en este ejemplo), bash todavía se inicia como un shell "interactivo", lo que significa que leerá su archivo .bashrc. Es una buena idea, pero desafortunadamente ssh no cooperará.
larsks
0

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

No corte y corra, cambie usery hostluego edite letmeiny guarde como.bashrc

SpiesInOrbit
fuente
0

Felicitaciones a user60069, funcionó para mí, pero utilizo el archivo de inicio específico de shell .bashrc, por lo que iniciar sesión con / bin / sh funcionó para mí.

Sin embargo, si se encuentra en la situación de "no hay suerte", ofrezco esta solución, basada en las soluciones de user60069 y Dennis W:

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

Dennis W ofreció la opción --norc, que alguien dijo que no funcionaba para ellos.

Ejecute "man bash" o "man (su shell)" para ver las opciones para deshabilitar los archivos de inicio. Solo necesita usar un shell abominable durante el tiempo necesario para solucionar el problema.

Jim
fuente
0

Otra forma de iniciar sesión en el servidor es sin perfil, encuentre el siguiente comando
ssh -t user@host bash --noprofile

Para AWS usando el archivo pem y ningún otro usuario
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

¡Espero que esto ayude!

Krutarth Shah
fuente
-1

De las sugerencias y respuestas dadas anteriormente, diría que no son los archivos .bashrc o .bash_profile. También la página de manual de ssh dice que si especifica un comando para ejecutar, sus archivos de perfil no se leerán.

Sugeriría intentar ejecutar un shell de inicio de sesión diferente (ksh? Csh? Sh?) Desde la ruta absoluta; Además, tenga en cuenta que podría ser un problema totalmente diferente (¿cuota? ¿Ejecutar y leer permiso en su directorio de inicio?), por lo que un enfoque secundario sería mejor. ¿Puedes pedirle a otro usuario que haga un ls -la $YOUR_HOME_DIRcorreo y te envíe el resultado?

lorenzog
fuente