web-dev-qa-db-fra.com

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

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

Existe-t-il un moyen de mettre quelque chose dans mon .bashrc ou quelque chose qui appelle automatiquement zsh lorsqu'il s'ouvre comme solution de contournement?

Pour clarifier, zsh est déjà installé.

56
goodcow

Créer .bash_profile dans votre répertoire personnel et ajoutez ces lignes:

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

Mise à jour: .profile peut fonctionner comme une solution générale lorsque Shell par défaut n'est pas bash. Je ne sais pas si .profile peut aussi être appelé par Zsh pour qu'il devienne redondant mais nous pouvons le faire en toute sécurité avec une simple vérification:

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

Nous pouvons également utiliser which pour obtenir le chemin dynamique de zsh qui repose sur la valeur de $PATH:

export Shell=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$Shell" -l
73
konsolebox

Normalement, vous pouvez utiliser chsh en tant qu'utilisateur non root. Mais il est parfois désactivé, généralement dans les sites qui utilisent une certaine forme de base de données d'utilisateurs en réseau comme NIS et LDAP. Il peut y avoir un ypchsh (NIS) ou chsh.ldap (LDAP) à la place.

chsh n'autorise généralement que certains shells approuvés , généralement ceux répertoriés dans /etc/shells.

Si vous ne pouvez pas utiliser chsh ou ses variantes sur votre site, organisez votre shell de connexion sur exec votre shell préféré et définissez la variable Shell pour pointer vers votre Shell préféré.

  • Si votre shell de connexion est sh, dash ou ksh: le fichier que vous devez modifier est ~/.profile. Attention, ce fichier est 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), donc vous devez faire attention: appelez uniquement exec (qui remplace le processus en cours) lorsque le shell actuel est interactif. À l'exception du Bourne Shell (le /bin/sh de Solaris 10 et versions antérieures), vous pouvez dire qu'un shell est interactif par la présence de i dans 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 lise votre .zprofile, passe le -l option.

  • 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 lisent que ~/.profile et pas ~/.bash_profile, mais j'en ai vu certains qui tournent sous bash et lisent .bash_profile, donc même là, vous devez faire attention de ne pas appeler exec dans un shell non interactif.

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

Si vous ne pouvez pas exécuter chsh parce que vous n'avez pas de privilèges d'administrateur, parlez à quelqu'un qui en a .

Il est très probable que vous ne puissiez pas utiliser chsh en tant que non root car le système que vous utilisez est configuré de sorte que chsh ne fonctionnerait pas, par exemple parce que le système utilise NIS ou LDAP plutôt que seulement le /etc/passwd fichier. Ou peut-être que l'administrateur de votre système souhaite 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 chsh fait normalement. Ou vous devrez peut-être soumettre un ticket d'assistance demandant une modification 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 le piratage de vos scripts de démarrage. J'invoquerais probablement zsh -l manuellement après la connexion jusqu'à ce que l'administrateur se mette à jour pour mettre à jour mon compte.

Une autre chose à garder à l'esprit: Parfois, des shells différents peuvent utiliser les mêmes fichiers de démarrage. Par exemple, sh et bash peuvent tous deux exécuter $HOME/.profile et csh et tcsh peuvent tous deux exécuter $HOME/.login et $HOME/.cshrc (bien que les fichiers de démarrage spécifiques à Shell comme .bashrc, .bash_profile, et .tcshrc peut les remplacer). Si votre shell par défaut est /bin/csh et vous souhaitez utiliser /bin/tcsh, mise à jour de votre .login invoquer /bin/tcsh -l pourrait créer une boucle infinie. zsh n'exécute pas les fichiers de démarrage spécifiques à bash, ce n'est donc pas un problème pour vous.

La plupart des shells définissent des variables qui identifient le shell que vous exécutez ($BASH_VERSION, $tcsh, $ZSH_VERSION). Si vous allez écrire du code de démarrage pour appeler votre Shell préféré, ce n'est pas une mauvaise idée de le mettre dans un if donc il n'est exécuté que si vous n'exécutez pas déjà ce Shell. En utilisant le code de réponse de konsolebox :

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

(La complication supplémentaire de vérifier "${ZSH_VERSION:-unset}" plutôt que simplement "$ZSH_VERSION" permet la possibilité que vous ayez fait set -o unset, une option qui fait qu'une référence à une variable non définie est une erreur.)

2
Keith Thompson

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

1
cinsk

Je peux penser à quelques scénarios.

  1. zsh n'est pas dans /etc/shells, et l'OP souhaite l'utiliser sans avoir à taper zsh à l'invite de commande. Solutions possibles.

    a) utilisez des astuces de profil pour l'exécuter à la connexion. C'est tout aussi efficace que de réellement changer le Shell.

    b) supplie l'administrateur d'ajouter zsh à /etc/shells pour que vous puissiez chsh

    c) suppliez l'administrateur de changer votre Shell. ce n'est pas judicieux, car cela vous perdra la capacité de ftp dans. vous ne pouvez utiliser ftp que si vous avez un Shell dans /etc/shells

  2. l'utilisateur souhaite échapper à un shell restreint, très probablement rbash ou rsh.

    Si .profile est modifiable, le PATH peut être développé en le modifiant. Une fois que /bin est dans le chemin d'accès, vous pouvez alors démarrer bash depuis l'intérieur rsh/rbash, en accédant à la commande chsh pour vous permettre de changer de shell. De nombreuses commandes ont des échappements Shell qui peuvent être utilisés pour échapper à un Shell restreint et retrouver l'accès à chsh.

  3. chsh ne fonctionne vraiment pas pour une autre raison. la solution a de la possibilité 1 est également une réponse ici.

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

1
Chuck