Changer le shell sudo su


13

Chaque fois que je cours sudo sudepuis mon normal zsh(qui utilise le framework oh-my-zsh ), je suis obligé d'utiliser l'ancien shell Bourne ( sh) par défaut (évidemment; c'est un comportement standard sur la plupart des systèmes * nix). Si je cours zshde l'intérieur shaprès avoir exécuté sudo su, j'obtiens le shell Z, mais sans les améliorations de oh-my-zsh.

Existe-t-il un moyen de modifier les sudo sulancements de shell en zsh? Si oui, est-il possible d'avoir également cette instance de zshlancement en utilisant oh-my-zsh?

J'utilise OS X 10.8.4.

Réponses:


21

Une autre façon d'exécuter un shell interactif en tant que superutilisateur est sudo -s, qui l'utilise $SHELLcomme shell.

Comme les commentaires dans l'autre réponse mentionnés, su -s /path/to/zshne fonctionne pas sous OS X.

OS X ne prend pas en charge la modification des shells de connexion /etc/passwdnon plus, mais vous pouvez utiliser dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shn'est plus un shell Bourne sur la plupart des plateformes. Il s'agit d'une version compatible POSIX de bash sous OS X et dash dans Ubuntu.


C'est ce que je pense que la question voulait. C'est définitivement ce qui a fonctionné pour moi; Merci beaucoup! modifier je vois ce qu'il voulait maintenant - je ne pense pas que c'est ce qu'il voulait, donc je ne peux pas le voter assez pour cette question, mais je pense que vous méritez une médaille de toute façon. Vous aviez la réponse à ma question!
Wyatt8740

4

À partir de la supage de manuel, vous pouvez procéder de deux manières.


La première méthode consiste à simplement utiliser l' indicateur -sou --shell(en supposant que vous utilisez un système d'exploitation basé sur * NIX avec une version suqui prend en charge cet argument), suivi du chemin d'accès au shell de votre choix. Si le shell passé est introuvable, surevient à la méthode suivante et, à défaut, tentera de l'invoquer /bin/sh.

Par exemple, vous pouvez forcer sule lancement zsh(en supposant qu'il existe en /bin/zsh) en tant que:

sudo su --shell /bin/zsh

La deuxième méthode consiste à modifier le shell par défaut spécifié pour l' rootutilisateur ( attention! ). Cela peut être fait en modifiant le fichier /etc/passwdet en changeant le shell spécifié pour l' rootutilisateur. Pour voir quel shell est spécifié par défaut, vous pouvez exécuter la commande suivante (en supposant que le superutilisateur est root):

sudo grep root /etc/passwd 

La commande devrait produire quelque chose comme root:x:0:0:root:/root:/bin/bash. Vous pouvez simplement changer le /bin/bash(ou tout ce qui est défini dans votre système) pour pointer à la zshplace.


3
Comme toujours, faites attention à ne pas changer le shell de root. Vous ne voulez pas être en mode mono-utilisateur et avoir un shell racine qui a besoin de / usr quand il est cassé. Au bail, assurez-vous que votre nouveau shell n'a pas plus de dépendances du système de fichiers que celui que vous remplacez
Rich Homolka

Exécuter sudo su -s /bin/zsh(ou utiliser --shell) des retours su: illegal option -- s. Je suis sur OS X 10.8.4; OS X prend-il une commande différente?
Jules

@JulesMazur quelle est la sortie de cat /etc/shells? Techniquement, seuls les shells autorisés dans ce fichier seront lancés, bien que la supage de manuel indique que cela ne devrait pas avoir d'importance si elle suest appelée par root: S
Breakthrough

cat /etc/shellsrenvoie /bin/zshcomme un shell acceptable.
Jules

2
@JulesMazur, n'oubliez pas de toujours inclure votre système d'exploitation pour éviter ce genre de confusion.
terdon

1

Une manière plus propre qui protégera également votre système au cas où votre shell personnalisé serait fait exploser est de créer un .profile dans le répertoire personnel de root avec:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

Changez simplement le chemin vers le shell que vous voulez au lieu de bash.


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.