web-dev-qa-db-fra.com

Comment puis-je utiliser Bash comme shell de connexion lorsque mon sysadmin refuse de me laisser changer

Le Sysadmin Unix où je travaille est réticent à me donner accès à la modification de mon shell de connexion de ksh à bash. Il a donné diverses excuses, l'être le plus drôle que puisqu'ils écrivent tous leurs scripts pour ksh ils ne fonctionneront pas si j'essaie de les exécuter. Je ne sais pas où il reçoit ces idées, mais comme je ne peux pas le convaincre, y a-t-il une alternative que j'ai?

(chsh est installé sur ces machines, mais nous utilisons des claviers publics/privés pour vous connecter, et je n'ai aucun mot de passe, alors quand chsh vous invite à un mot de passe que je n'ai rien à faire donne-le. )

38
iconoclast

Lorsque vous vous connectez, le fichier ~/.profile est lu par la coque de connexion (ksh pour vous). Vous pouvez demander à ce que la coquille de connexion se remplace par Bash. Vous devriez prendre des précautions:

  • Remplacez uniquement la coque de connexion si elle est interactive. Ceci est important: sinon, la connexion en mode graphique peut ne pas fonctionner (elle est dépendante du système: certains mais tous les systèmes ne lisent pas ~/.profile Lors de la connexion via XDM ou similaire) et des idiomes tels que ssh foo '. ~/.profile; mycommand' va échouer.
  • Vérifiez que Bash est disponible, de sorte que vous puissiez toujours vous connecter si l'exécutable n'est pas là pour une raison quelconque.

Vous avez le choix d'exécuter Bash comme coquille de connexion ou non. La seule différence majeure dans la fabrication d'un shell de connexion est que cela chargera ~/.bash_profile ou ~/.profile. Donc, si vous exécutez BASH comme Connexion Shell, faites attention à avoir un ~/.bash_profile ou veillez à ne pas exécuter de bash récursivement de ~/.profile. Il n'y a pas d'avantage réel d'avoir ~/.profile exécuté par bash plutôt que ksh, alors je recommanderais de ne pas le faire.

Définissez également la variable d'environnement Shell à baster, de sorte que des programmes tels que des émulateurs de terminaux invoquent ce shell.

Voici le code pour passer à Bash. Mettez-le à la fin 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

C'est légèrement krudgey, mais vous pouvez causer bash comme la coque que vous utilisez lors de la connexion en créant un .profile Fichier dans votre répertoire personnel contenant

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

Cela provoquera la remplacement de la session ksh par une session bash. Vous n'aurez pas à taper exit (ou ^D) deux fois, comme vous le feriez si vous avez démarré manuellement une nouvelle session bash à chaque fois que vous avez connecté. Et en tapant

echo $Shell

retournera même le chemin de bash.

12
iconoclast

La réponse de Giles devrait avoir le drapeau -L ajouté ajouté lors de l'exécution de bash, de sorte que les scripts de profil de connexion seront provenus dans la nouvelle coque Bash. (Par exemple, tout ce qui est dans /etc/profile.d/ sur RHEL). Le script devrait alors être:

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
4
rleelr

Une réponse pour csh/tcsh inspiré du top voté un par @gilles est

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

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif
1
sameers

Solaris:

usermod -s /bin/bash root
0
hienbuithanh88