Créer le shell par défaut de zsh sans accès root

52

J'utilise les ordinateurs de mon école et j'aimerais utiliser zshau lieu de bash. J'aimerais en faire le shell par défaut, mais je ne peux pas exécuter une commande telle que, $ chsh -s $(which zsh)car je ne dispose pas de privilèges d'administrateur.

Existe-t-il un moyen de mettre quelque chose dans mon .bashrcou quelque chose qui appelle automatiquement zshquand il ouvre une solution de contournement?

Pour clarifier, zshest déjà installé.

Goodcow
la source
2
Oui, ajoutez simplement zshle .bashrcfichier. Déconnectez-vous et connectez-vous et c'est fait!
fedorqui
Désolé pour ça. Mais pour finir la question, je viens de mettre zshsur la première ligne?
3
Placer zsh dans .bashrc le ferait toujours exécuter même quand bashest appelé explicitement. Mieux vaut le placer à la .bash_profileplace.
konsolebox
Vous pouvez définir zsh comme shell par défaut dans les préférences du terminal (créer un nouveau profil).
lmaooooo

Réponses:

68

Créez .bash_profiledans votre répertoire personnel et ajoutez ces lignes:

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

Mise à jour: .profilepeut fonctionner comme une solution générale lorsque le shell par défaut n'est pas bash. Je ne sais pas si .profileZsh peut également appeler cela, mais nous pouvons le faire en toute sécurité avec un simple contrôle:

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

Nous pouvons également utiliser whichpour obtenir le chemin dynamique zshdont dépend la valeur de $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
Konsolebox
la source
Que se passe-t-il si un administrateur Linux (racine) modifie votre shell par défaut en un élément autre que bash (mais pas zsh), par exemple ksh? Alors .bash_profilene sera pas référencé. Que diriez-vous de mettre cela à la .profileplace
Joshua Huber
@JoshuaHuber Le dernier test que j'ai fait .profilen'a pas fonctionné. Aussi ne serait pas .profileappelé par Zsh? Cela pourrait devenir redondant. Je n'ai pas encore vérifié. (Mise à jour: cela fonctionnait maintenant, je ne savais pas quelle erreur j'avais commise auparavant.) Avez-vous des idées sur les inconvénients possibles de l'utilisation .profile?
konsolebox
1
@konsolebox Bash ne contient que des sources .profiles'il .bash_profilen'existe pas (à moins que vous ne le sourceiez manuellement .bash_profile, bien sûr). Plus précisément, les sources de bash le premier des fichiers [ .bash_profile> .bash_login> .profile] il trouve. Il recherche uniquement .profileune fonctionnalité de compatibilité POSIX (Bourne Shell).
pyrocrasty
@pyrocrasty En effet. Comme indiqué dans le manuel: "Après avoir lu ce fichier, il recherche ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre, puis lit et exécute les commandes du premier fichier existant et lisible. . "
konsolebox
Cela a fonctionné pour configurer un nouveau profil de terminal avec une commande personnalisée Exécuter au lieu de mon shell modifié zsh. .bash_profileet .profilen'a pas fonctionné (les fichiers n'ont même pas été exécutés, Fedora 26 sur un ordinateur d'université).
lmaooooo
12

Normalement, vous pouvez utiliser en chshtant qu'utilisateur non root. Mais il est parfois désactivé, généralement sur les sites utilisant une forme de base de données d'utilisateurs en réseau, telle que NIS et LDAP. Il pourrait y avoir un ypchsh(NIS) ou chsh.ldap(LDAP) à la place.

chshn'autorisera généralement que quelques coquilles approuvées , généralement celles énumérées dans /etc/shells.

Si vous ne pouvez pas utiliser chshni ses variantes sur votre site, organisez votre shell de connexion sur execvotre shell favori et définissez la SHELLvariable de manière à pointer sur votre shell favori.

  • Si votre shell de connexion est sh, dashou ksh: le fichier que vous devez modifier est ~/.profile. Veillez à ce que ce fichier soit lu au début d’une session interactive ainsi que par certains scripts de démarrage de session non interactifs (par exemple, pour les sessions X11), vous devez donc faire attention: seul appel exec(qui remplace le processus en cours) lorsque le processus en cours est activé. shell est interactif. À l'exception du shell Bourne (version /bin/shde Solaris 10 et antérieure), vous pouvez savoir qu'un shell est interactif en raison de la présence de idans la liste d'options ( $-).

    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 vous voulez que zsh vous lise .zprofile, passez l' -loption.

  • Si votre shell de connexion est bash, vous pouvez procéder comme ci-dessus. Alternativement, vous pouvez mettre ces commandes dans ~/.bash_profile. La plupart des scripts de démarrage de session ne font que lire ~/.profileet pas ~/.bash_profile, mais j'en ai vu qui fonctionnent sous bash et en lecture .bash_profile, aussi, même là, vous devriez faire attention à ne pas appeler execun shell non interactif.

  • Si votre shell de connexion est csh ou tcsh, voir un exemple dans Modification du shell par défaut sans privilèges chsh ou administrateur.

Gilles, arrête de faire le mal
la source
1

Je crois que la commande chshest dans ce but précis. Bien que, je ne suis pas sûr que chaque distribution Linux / Unix le supporte. Consultez la page de manuel de chsh.

Cinsk
la source
Certains systèmes l’ont aussi passwd -s.
Stéphane Chazelas
1

Si vous ne pouvez pas courir chshparce que vous n'avez pas les privilèges d'administrateur, parlez à quelqu'un qui en a .

Très probablement, vous ne pouvez pas utiliser en chshtant que non-root car le système que vous utilisez est configuré pour chshne pas fonctionner, par exemple parce que le système utilise NIS ou LDAP plutôt que simplement le /etc/passwdfichier. Ou peut-être l'administrateur de votre système veut-il simplement garder un certain contrôle.

La procédure de modification de votre shell dépend des stratégies de votre organisation. Il peut y avoir une commande locale qui fait ce que fait chshnormalement. Ou vous devrez peut-être soumettre un ticket de support demandant un changement de shell.

La plupart des autres réponses sont bonnes, mais si vos administrateurs sont raisonnablement réactifs, vous ne voudrez peut-être pas déranger vos scripts de démarrage. J'appellerais probablement juste zsh -lmanuellement après la connexion, jusqu'à ce que l'administrateur se mette à jour pour mettre à jour mon compte.

Une autre chose à garder à l’esprit: Parfois, différents shells peuvent utiliser les mêmes fichiers de démarrage. Par exemple, shet bashpeut à la fois exécuter $HOME/.profile, et cshet tcshpeut à la fois exécuter $HOME/.loginet $HOME/.cshrc(bien que des fichiers de démarrage spécifiques à un shell .bashrc, tels que .bash_profile, et .tcshrcpuissent les remplacer). Si votre shell par défaut est /bin/cshet que vous souhaitez l'utiliser /bin/tcsh, la mise .loginà jour de votre appel à /bin/tcsh -lcréer peut créer une boucle infinie. zshn'arrive pas à exécuter des bashfichiers de démarrage spécifiques, ce n'est donc pas un problème pour vous.

La plupart des shells définir des variables qui identifient shell que vous êtes en cours d' exécution ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Si vous envisagez d'écrire du code de démarrage pour appeler votre shell préféré, ce n'est pas une mauvaise idée de l'inclure dans un iffichier pour qu'il ne soit exécuté que si vous n'exécutez pas déjà ce shell. En utilisant le code de la réponse de konsolebox :

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

(La complication ajoutée de la vérification au "${ZSH_VERSION:-unset}"lieu de simplement "$ZSH_VERSION"permettre la possibilité que vous avez faite set -o unset, une option qui fait qu'une référence à une variable non définie est une erreur.)

Keith Thompson
la source
1

Je peux penser à quelques scénarios.

  1. zshn'est pas /etc/shellsprésent et l'OP souhaite l'utiliser sans avoir à taper zshà l'invite de commande. Solutions possibles.

    a) utilise des astuces de profil pour l'exécuter à la connexion. C’est aussi efficace que de changer de coque.

    b) prie l'admin d'ajouter zshafin /etc/shellsque vous puissiez le chshfaire

    c) prie l'administrateur de changer votre shell. ce n’est pas sage, car vous perdrez votre capacité à ftputiliser. Vous ne pouvez l’utiliser que ftpsi vous avez un shell/etc/shells

  2. l'utilisateur souhaite échapper à un shell restreint, le plus probable rbashou rsh.

    Si .profileest éditable, le PATHpeut être développé en le modifiant. Une fois /bindans le chemin, vous pouvez commencer bashde l'intérieur rsh/rbash, en accédant à la chshcommande pour vous permettre de changer de shell. De nombreuses commandes ont des échappements de shell qui peuvent être utilisés pour échapper à un shell restreint et y accéder à nouveau chsh.

  3. chshne fonctionne vraiment pas pour une autre raison. La solution a de la possibilité 1 est une réponse ici aussi.

Le scénario 2 est la seule raison pour changer réellement le shell par défaut (c'est trop restrictif).

Mandrin
la source
-3

Je ne pense pas que la réponse fournie constitue réellement zshle shell par défaut. Cela change simplement le shell en zsh dès que l'utilisateur se connecte à son shell par défaut . L'utilisateur va toujours se connecter à son compte, DEFAULT SHELLmais avec cela, le shell changera pourzsh

Pour changer l'utilisation du shell par défaut:

usermod -s /path/to/shell username 

Vous devriez être root pour le faire.

Sinon, la solution de contournement ci-dessus vous sera utile.

Ajouté du commentaire

chsh -s /path/to/zsh  # considered as standard as compared to usermod

et il peut être invoqué par l'utilisateur pour lui-même.

PradyJord
la source
4
La question indique assez clairement que la modification de la base de données des utilisateurs du système (le bit dont vous avez besoin dans la réponse de la racine) n’est pas une option.
Caleb
3
chsh -s /path/to/zshest plus standard et ne nécessite généralement pas (mais pas toujours) un accès root, contrairement à usermodce qui est toujours le cas. Votre réponse a donc plus de problèmes que ce que la question dit déjà comme ne fonctionnant pas.
Gilles 'SO- arrête d'être méchant'