comment puis-je utiliser bash comme shell de connexion lorsque mon administrateur système refuse de me laisser changer


38

Le sysadmin unix où je travaille est peu disposé à me donner accès à changer ma coquille de connexion à partir kshde bash. Il a donné diverses excuses, la plus drôle étant que, puisqu'elles écrivent tous leurs scripts, kshelles ne fonctionneront pas si j'essaie de les exécuter. Je ne sais pas où il a eu ces idées, mais comme je n'arrive pas à le convaincre, y a-t-il une alternative à moi?

( chshest installé sur ces machines, mais nous utilisons des paires de clés publiques / privées pour la connexion, et je n'ai pas de mot de passe. Par conséquent, quand il chshme demande un mot de passe, je n'ai rien à lui donner.)

Réponses:


69

Lorsque vous vous connectez, le fichier ~/.profileest lu par le shell de connexion (ksh pour vous). Vous pouvez demander à ce shell de se remplacer par bash. Vous devriez prendre quelques précautions:

  • Ne remplacez le shell de connexion que s'il est interactif. Ceci est important: sinon, la connexion en mode graphique risque de ne pas fonctionner (cela dépend du système: certains systèmes, mais pas tous, sont lus ~/.profilelors de la connexion via xdm ou similaire) et des idiomes tels que ssh foo '. ~/.profile; mycommand'échouent.
  • Vérifiez que bash est disponible, de sorte que vous puissiez toujours vous connecter si l'exécutable n'existe pas pour une raison quelconque.

Vous avez le choix d’exécuter ou non bash en tant que shell de connexion. La seule différence majeure en faisant un shell de connexion est que ça va charger ~/.bash_profileou ~/.profile. Donc, si vous utilisez bash en tant que shell de connexion, veillez à ~/.bash_profilene pas exécuter bash ou veillez à ne pas l'exécuter de manière récursive ~/.profile. Il n'y a pas de réel avantage à avoir ~/.profileexécuté par bash plutôt que par ksh, je vous recommande donc de ne pas le faire.

Définissez également la SHELLvariable d'environnement sur bash, de sorte que des programmes tels que des émulateurs de terminal 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

17
Excellente réponse! stackexchange a besoin d'un bouton Send A Beer : ce serait le moment de l'utiliser.
iconoclast

Merci d'abord et. .profilene fonctionne que pour le shell de connexion (selon le besoin de l'OP). J'utilise Remote Desktop Connection de Windows 10 pour connecter un poste de travail Linux, puis ouvre Terminal dans gnome. Je veux zshpendant que mon administrateur système me donne bash. Dans ce cas, je dois ajouter l'extrait au .bashrclieu de .profile.
Week

12

Ceci est légèrement correct, mais vous pouvez faire bashen sorte que ce soit le shell que vous utilisez lors de la connexion en créant un .profilefichier dans votre répertoire personnel, contenant

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

Cela entraînera le kshremplacement de la bashsession par une session. Vous n'aurez pas à taper exit(ou ^D) deux fois, comme si vous démarriez manuellement une nouvelle bashsession à chaque fois que vous vous êtes connecté. Et en tapant

echo $SHELL

retournera même le chemin à bash.


3
vous pouvez bien sûr changer assez facilement SHELL en ajoutant une ligne à faire avant l'exécutif.
derobert

2
Si vous voulez que le nouveau shell soit aussi un shell de connexion, vous devriez probablement exec bash -l.
jw013

1
Un dernier commentaire: typeest recommandé ci- dessus which.
jw013

1
Je ne comprends pas! Ne bashlirons pas aussi .profilegénérant ainsi une boucle infinie? Je conviens que quelque chose dans le sens de exec bashest ce que vous voulez, mais vous devez vous assurer de ne le faire que pour votre login ksh, donc certaines if-statement sont obligatoires!
Bananguin

1
@ user1129682 pas s'il y a ~/.bash_profileou~/.bash_login
Ulrich Dangel

4

L'attribut -l doit être ajouté lors de l'exécution de bash dans la réponse de Giles, de sorte que tous les scripts de profil de connexion soient générés dans le nouveau shell bash. (Par exemple, tout ce qui se trouve 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

Pouvez-vous expliquer pourquoi vous dites d'ajouter l' -loption? Je l'utilise depuis des mois sans cela, sans aucun problème.
Cokedude

1

Une réponse csh/tcshinspirée par le plus haut élu de @Gilles est

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

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

0

Solaris:

usermod -s /bin/bash root

1
Usermod ne nécessite-t-il pas de droits d'administrateur et la question est "... lorsque mon administrateur refuse ..."?
Heureux Geek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.