¿Cómo puedo usar bash como mi shell de inicio de sesión cuando mi administrador de sistemas se niega a permitirme cambiarlo?

38

El administrador de sistemas de Unix donde estoy trabajando es reacio a darme acceso para cambiar mi shell de inicio de sesión ksha bash. Él ha dado varias excusas, la más divertida es que, dado que escriben todos sus guiones ksh, no funcionarán si trato de ejecutarlos. No sé de dónde saca estas ideas, pero como no puedo convencerlo, ¿hay alguna alternativa que tenga?

( chshestá instalado en estas máquinas, pero utilizamos pares de claves públicas / privadas para iniciar sesión, y no tengo ninguna contraseña, así que cuando chshme pide una contraseña no tengo nada que dar).

iconoclasta
fuente

Respuestas:

69

Cuando ~/.profileinicia sesión, el archivo es leído por el shell de inicio de sesión (ksh para usted). Puede indicarle a ese shell de inicio de sesión que se reemplace por bash. Debes tomar algunas precauciones:

  • Solo reemplace el shell de inicio de sesión si es interactivo. Esto es importante: de lo contrario, el inicio de sesión en modo gráfico puede no funcionar (esto depende del sistema: algunos pero no todos los sistemas leen ~/.profileal iniciar sesión a través de xdm o similar), y las expresiones idiomáticas tales como ssh foo '. ~/.profile; mycommand'fallarán.
  • Verifique que bash esté disponible, de modo que aún pueda iniciar sesión si el ejecutable no está allí por alguna razón.

Tiene la opción de ejecutar bash como shell de inicio de sesión o no. La única diferencia importante para convertirlo en un shell de inicio de sesión es que se cargará ~/.bash_profileo ~/.profile. Entonces, si ejecuta bash como shell de inicio de sesión, tenga mucho cuidado de tener ~/.bash_profileo tener cuidado de no ejecutar bash recursivamente desde ~/.profile. No hay una ventaja real de haber ~/.profileejecutado por bash en lugar de ksh, por lo que recomiendo no hacerlo.

Establezca también la SHELLvariable de entorno en bash, para que los programas como los emuladores de terminal invoquen ese shell.

Aquí hay un código para cambiar a bash. Ponlo al final de ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac
Gilles 'SO- deja de ser malvado'
fuente
17
Excelente respuesta! stackexchange necesita un botón Enviar una cerveza : este sería un momento en que lo usaría.
iconoclasta
Gracias primero y. .profilesolo funciona para el shell de inicio de sesión (como OP necesita). Utilizo Remote Desktop Connection de Windows 10 para iniciar sesión en una estación de trabajo Linux, luego abro Terminal en gnome. Quiero zshmientras mi administrador me da bash. En este caso, tengo que agregar el fragmento en .bashrclugar de .profile.
Fin de semana
12

Esto es un poco complicado, pero puede hacer bashque sea el shell que está utilizando al iniciar sesión creando un .profilearchivo en su directorio de inicio que contenga

SHELL=`type -P bash`
exec bash -l

Esto hará que la kshsesión sea reemplazada por una bashsesión. No tendrá que escribir exit(o ^D) dos veces, como lo haría si iniciara manualmente una nueva bashsesión cada vez que inicia sesión. Y escribiendo

echo $SHELL

incluso devolverá el camino a bash.

iconoclasta
fuente
3
por supuesto, puede cambiar $ SHELL con bastante facilidad agregando una línea para hacerlo antes del ejecutivo.
derobert
2
Si desea que el nuevo shell también sea un shell de inicio de sesión, probablemente debería hacerlo exec bash -l.
jw013
1
Un último comentario: typese recomienda más de which.
jw013
1
No lo entiendo! ¿No bashleerá también .profilegenerando así un bucle infinito? Estoy de acuerdo en que algo así exec bashes lo que quieres, pero debes asegurarte de hacerlo solo en tu ksh de inicio de sesión, por lo que se requieren algunas declaraciones if.
Bananguin
1
@ user1129682 no si hay ~/.bash_profileo~/.bash_login
Ulrich Dangel
4

La respuesta de Giles debería tener el indicador -l agregado al ejecutar bash, de modo que cualquier script de perfil de inicio de sesión se obtenga en el nuevo shell de bash. (Por ejemplo, cualquier cosa en /etc/profile.d/ en RHEL). El guión debería ser:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac
rleelr
fuente
¿Puedes explicar por qué dices agregar la -lopción? He usado esto durante meses sin problemas sin problemas.
cokedude
1

Una respuesta para csh/tcshinspirado por el más votado por @Gilles es

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif
Sameers
fuente
0

Solaris:

usermod -s /bin/bash root
hienbuithanh88
fuente
1
¿Usermod no requiere derechos de administrador y la pregunta es "... cuando mi administrador se niega ..."?
Beato Geek