Hacer el shell predeterminado de zsh sin acceso de root

52

Estoy usando las computadoras de mi escuela y me gustaría usarlas en zshlugar de bash. Me gustaría convertirlo en el shell predeterminado, pero no puedo ejecutar un comando, como $ chsh -s $(which zsh)porque no tengo privilegios de administrador.

¿Hay alguna manera de poner algo en mi .bashrco algo que llame automáticamente zshcuando se abre como una solución?

Para aclarar, zshya está instalado.

goodcow
fuente
2
Sí, solo agregue zshel .bashrcarchivo. Cerrar sesión e iniciar sesión y listo!
fedorqui
Lo siento por eso. Pero para terminar la pregunta, ¿acabo de poner zshen la primera línea?
3
Colocar zsh en .bashrc haría que siempre se ejecute incluso cuando bashse llama explícitamente. Mejor colóquelo en su .bash_profilelugar.
konsolebox
Puede establecer zsh como su shell predeterminado en las preferencias del terminal (crear un nuevo perfil).
lmaooooo

Respuestas:

68

Cree .bash_profileen su directorio personal y agregue estas líneas:

export SHELL=/bin/zsh
exec /bin/zsh -l

Actualización: .profilepuede funcionar como una solución general cuando el shell predeterminado no es bash. No estoy seguro de si .profileZsh también puede llamarlo para que sea redundante, pero podemos hacerlo de forma segura con una simple verificación:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

También podemos usar whichpara obtener la ruta dinámica zshque se basa en el valor de $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
konsolebox
fuente
¿Qué sucede si un administrador de Linux (root) cambia su shell predeterminado a algo distinto de bash (pero no zsh), por ejemplo ksh? Entonces .bash_profileno será referenciado. ¿Qué tal poner esto en su .profilelugar?
Joshua Huber
@JoshuaHuber La última prueba que .profilehice no funcionó. ¿También no .profilesería llamado por Zsh? Podría ser redundante. Sin embargo, todavía no lo he comprobado. (Actualización: funcionó ahora, no estoy seguro de qué error cometí antes). ¿Alguna idea sobre posibles inconvenientes con el uso .profile?
konsolebox
1
@konsolebox Bash solo genera fuentes .profilesi .bash_profileno existe (a menos que lo obtenga manualmente .bash_profile, por supuesto). En concreto, las fuentes de bash el primero de los archivos [ .bash_profile> .bash_login> .profile] que encuentra. Solo se busca .profilecomo una característica de compatibilidad POSIX (Bourne shell).
Pyrocrasty
@pyrocrasty De hecho. Tal como se dice en el manual: "Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos del primero que existe y es legible ".
konsolebox
Funcionó para configurar un nuevo perfil de terminal con el comando Ejecutar personalizado en lugar de cambiar mi shell a zsh. .bash_profiley .profileno funcionó (los archivos ni siquiera fueron ejecutados, Fedora 26 en una computadora de la universidad).
lmaooooo
12

Normalmente puede usarlo chshcomo usuario no root. Pero ocasionalmente está deshabilitado, generalmente en sitios que usan alguna forma de base de datos de usuarios en red como NIS y LDAP. Puede haber un ypchsh(NIS) o chsh.ldap(LDAP) en su lugar.

chshPor lo general, también permitirá solo algunos shells aprobados , generalmente los que se enumeran en /etc/shells.

Si no puede usar chsho sus variantes en su sitio, organice su shell de inicio de sesión en execsu shell favorito y configure la SHELLvariable para que apunte a su shell favorito.

  • Si su shell de inicio de sesión es sh, dasho ksh: el archivo que necesita editar es ~/.profile. Tenga en cuenta que este archivo se lee al comienzo de una sesión interactiva, así como por algunos scripts de inicio de sesión no interactivos (por ejemplo, para sesiones X11), por lo que debe tener cuidado: solo llame exec(que reemplaza el proceso actual) cuando el actual Shell es interactivo. Excepto por el shell Bourne (el /bin/shde Solaris 10 y anteriores), puede decir que un shell es interactivo por la presencia de ien la lista de opciones ( $-).

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi
    

    Si quieres que zsh lea tu .zprofile, pasa la -lopción.

  • Si su shell de inicio de sesión es bash, puede continuar como se indicó anteriormente. Alternativamente, puede poner estos comandos en ~/.bash_profile. La mayoría de los scripts de inicio de sesión solo leen ~/.profiley no ~/.bash_profile, pero he visto algunos que se ejecutan en bash y read .bash_profile, por lo que incluso allí debe tener cuidado de no llamar execa un shell no interactivo.

  • Si su shell de inicio de sesión es csh o tcsh, consulte un ejemplo en Cambio del shell predeterminado sin chsh o privilegios de administrador

Gilles 'SO- deja de ser malvado'
fuente
1

Creo que el comando chshes para este mismo propósito. Aunque, no estoy seguro de que todas las distribuciones de Linux / Unix lo admitan. Consulte la página del manual de chsh.

cinsk
fuente
Algunos sistemas también lo tienen como passwd -s.
Stéphane Chazelas
1

Si no puede ejecutar chshporque no tiene privilegios de administrador, hable con alguien que sí lo tenga .

Lo más probable es que no pueda usarlo chshcomo no root porque el sistema que está usando está configurado para que chshno funcione, por ejemplo, porque el sistema usa NIS o LDAP en lugar de solo el /etc/passwdarchivo. O tal vez el administrador de su sistema solo quiere mantener algo de control.

El procedimiento para cambiar su shell depende de las políticas de su organización. Puede haber un comando local que haga lo que chshnormalmente hace. O puede que tenga que enviar un ticket de soporte solicitando un cambio de shell.

La mayoría de las otras respuestas son buenas, pero si sus administradores responden razonablemente, es posible que no quiera molestarse en hackear sus scripts de inicio. Probablemente solo invoque zsh -lmanualmente después de iniciar sesión hasta que el administrador pueda actualizar mi cuenta.

Otra cosa a tener en cuenta: a veces, diferentes shells pueden usar los mismos archivos de inicio. Por ejemplo, shy bashpuede tanto ejecutar $HOME/.profile, y cshy tcshambos pueden ejecutar $HOME/.loginy $HOME/.cshrc(aunque los archivos de inicio de caparazón específicos como .bashrc, .bash_profiley .tcshrcpuede anular los). Si su shell predeterminado es /bin/cshy desea utilizarlo /bin/tcsh, actualizar su .logininvocación /bin/tcsh -lpodría crear un bucle infinito. zshno ejecuta basharchivos de inicio específicos, por lo que no es un problema para usted.

La mayoría de las conchas establecen variables que identifican qué shell se está ejecutando ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Si va a escribir un código de inicio para invocar su shell preferido, no es una mala idea encerrarlo de ifmanera que se ejecute solo si aún no está ejecutando ese shell. Usando el código de la respuesta de konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(La complicación añadida de comprobación "${ZSH_VERSION:-unset}"en lugar de sólo "$ZSH_VERSION"admite la posibilidad de que usted ha hecho set -o unset, una opción que hace que una referencia a una variable no definida para ser un error).

Keith Thompson
fuente
1

Puedo pensar en algunos escenarios.

  1. zshno está en /etc/shells, y el OP desea usarlo sin tener que escribir zshen el símbolo del sistema. Soluciones posibles.

    a) use trucos de perfil para ejecutarlo al iniciar sesión. Esto es tan efectivo como cambiar el caparazón.

    b) pedir al administrador añadir zsha /etc/shellslo que puede chsha ella

    c) rogarle al administrador que cambie su shell. esto no es sabio, porque te perderá la capacidad de entrar ftp. Solo puedes usarlo ftpsi tienes un caparazón en/etc/shells

  2. el usuario desea escapar de un shell restringido, muy probablemente rbasho rsh.

    Si .profilees editable, PATHse puede ampliar editándolo. Una vez que /binestá en el camino, puede comenzar bashdesde adentro rsh/rbash, obteniendo acceso al chshcomando que le permite cambiar los shells. Muchos comandos tienen escapes de shell que se pueden usar para escapar de un shell restringido y recuperar el acceso chsh.

  3. chshRealmente no funciona por alguna otra razón. La solución de la posibilidad 1 es una respuesta aquí también.

El escenario 2 es la única razón para cambiar realmente el shell predeterminado (es demasiado restrictivo).

Arrojar
fuente
-3

No creo que la respuesta proporcionada realmente haga zshel shell predeterminado. Simplemente cambia el shell a zsh tan pronto como el usuario inicia sesión en su shell predeterminado . El usuario todavía iniciará sesión en su DEFAULT SHELLpero con esto, el shell cambiará azsh

Para cambiar el uso predeterminado del shell:

usermod -s /path/to/shell username 

Deberías ser root para hacer eso.

De lo contrario, la solución anterior será útil.

Agregado del comentario

chsh -s /path/to/zsh  # considered as standard as compared to usermod

y puede ser invocado por el usuario por sí mismo.

PradyJord
fuente
44
La pregunta establece claramente que modificar la base de datos de usuarios del sistema (el bit que necesita hacer en esta respuesta) no es una opción.
Caleb
3
chsh -s /path/to/zshes más estándar y generalmente (pero no siempre) no requiere acceso de root, a diferencia de lo usermodque siempre hace. Por lo tanto, su respuesta tiene más problemas de lo que la pregunta ya dice que no funciona.
Gilles 'SO- deja de ser malvado'