desarrollo-web-br-bd.com

Hacer el shell predeterminado de zsh sin acceso de root

Estoy usando las computadoras de mi escuela y me gustaría usar zsh en lugar 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 .bashrc o algo que llama automáticamente zsh cuando se abre como una solución alternativa?

Para aclarar, zsh ya está instalado.

56
goodcow

Crear .bash_profile en su directorio de inicio y agregue estas líneas:

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

Actualización: .profile puede funcionar como una solución general cuando Shell predeterminado no es bash. No estoy seguro si .profile también puede ser llamado por Zsh para que sea redundante, pero podemos hacerlo de forma segura con una simple comprobación:

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

También podemos usar which para obtener la ruta dinámica de zsh que se basa en el valor de $PATH:

export Shell=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$Shell" -l
73
konsolebox

Normalmente puede usar chsh como 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.

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

Si no puede usar chsh o sus variantes en su sitio, organice su Shell de inicio de sesión en exec su Shell favorito y configure la variable Shell para que apunte a su Shell favorito.

  • Si su Shell de inicio de sesión es sh, dash o 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 a exec (que reemplaza el proceso actual) cuando el Shell actual es interactivo. Excepto por el Bourne Shell (el /bin/sh de Solaris 10 y anteriores), puede decir que un Shell es interactivo por la presencia de i en 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 el -l opció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 ~/.profile y no ~/.bash_profile, pero he visto algunos que funcionan bajo bash y leen .bash_profile, por lo que incluso allí debe tener cuidado de no llamar a exec en un Shell no interactivo.

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

Si no puede ejecutar chsh porque no tiene privilegios de administrador, hable con alguien que sí .

Lo más probable es que no pueda usar chsh como no root porque el sistema que está usando está configurado para que chsh no funcione, por ejemplo porque el sistema usa NIS o LDAP en lugar de solo el /etc/passwd archivo. O quizás 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 chsh hace normalmente. O puede que necesite 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 invocaría zsh -l manualmente 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, sh y bash ambos pueden ejecutar $HOME/.profile y csh y tcsh ambos pueden ejecutar $HOME/.login y $HOME/.cshrc (aunque los archivos de inicio específicos de Shell como .bashrc, .bash_profile y .tcshrc puede anular esos). Si su Shell predeterminado es /bin/csh y quieres usar /bin/tcsh, actualizando su .login invocar /bin/tcsh -l podría crear un bucle infinito. zsh no se ejecuta para ejecutar bash- archivos de inicio específicos, por lo que no es un problema para usted.

La mayoría de los shells establecen variables que identifican qué Shell está ejecutando ($BASH_VERSION, $tcsh, $ZSH_VERSION). Si va a escribir código de inicio para invocar su Shell preferido, no es una mala idea encerrarlo en un if por lo que se ejecuta solo si aún no está ejecutando ese Shell. Usando el código de respuesta de konsolebox :

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

(La complicación adicional de verificar "${ZSH_VERSION:-unset}" en lugar de solo "$ZSH_VERSION" permite la posibilidad de que hayas hecho set -o unset, una opción que hace que una referencia a una variable indefinida sea un error).

2
Keith Thompson

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

1
cinsk

Puedo pensar en algunos escenarios.

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

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

    b) rogue al administrador que agregue zsh a /etc/shells para que puedas chsh a ella

    c) rogarle al administrador que cambie su Shell. esto no es sabio, ya que te perderá la capacidad de ftp. solo puedes usar ftp si tienes un Shell en /etc/shells

  2. el usuario desea escapar de un Shell restringido, muy probablemente rbash o rsh.

    Si .profile es editable, el PATH puede expandirse editándolo. Una vez /bin está en la ruta, luego puede iniciar bash desde adentro rsh/rbash, obteniendo acceso al comando chsh para permitirle cambiar shells. Muchos comandos tienen escapes de Shell que se pueden usar para escapar de un Shell restringido y recuperar el acceso a chsh.

  3. chsh realmente 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).

1
Chuck