web-dev-qa-db-fra.com

La fin de tabulation de Shell pour la commande de service cassée en tant que root

Sur la plupart de nos serveurs, la complétion par tabulation des noms de service après la saisie de la commande de service ne fonctionne plus en tant que root. Cela fonctionne très bien comme non-root. Ceci est sur Ubuntu 12.04. Je ne sais pas comment aborder le problème.

Démonstration:

La complétion par tabulation fonctionne comme l'utilisateur normal zachary, qui a appuyé sur tab pour répertorier les complétions dans la première image:

Tab completion works

Mais en tant qu'utilisateur root, il ne répertorie pas les services en tant que complétions (fichiers uniquement):

Now it does not

Toute aide serait grandement appréciée.

7
Zachary Alex Stern

Ceci est désactivé par défaut sur Ubuntu.

Lisez votre /root/.bashrc:

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
#    . /etc/bash_completion
#fi

La complétion de Bash est tous commentés. Apparemment, il y a une raison à cela que je ne connais pas (mode de récupération mono-utilisateur peut-être?).

La raison pour laquelle cela fonctionne lorsque vous faites Sudo su, Sudo -s, Sudo bash est qu’il n’exécute pas vraiment login pour vous rendre complètement root. Lorsque vous exécutez Sudo su - ou Sudo -i, il vous connecte complètement en tant qu'utilisateur. Ici, à titre d'exemple de la variable d'environnement $HOME, plus de cette différence:

gert@gert-laptop:~$ id
uid=1000(gert) gid=1000(gert) groups=1000(gert),4(adm),7(lp),24(cdrom),27(Sudo),[...]
gert@gert-laptop:~$ echo $HOME
/home/gert
gert@gert-laptop:~$ Sudo -s
root@gert-laptop:~# id
uid=0(root) gid=0(root) groups=0(root)
root@gert-laptop:~# echo $HOME
/home/gert
root@gert-laptop:~# exit
gert@gert-laptop:~$ Sudo su -
root@gert-laptop:~# id
uid=0(root) gid=0(root) groups=0(root)
root@gert-laptop:~# echo $HOME
/root
4
gertvdijk

Ok, donc je l'ai compris, en quelque sorte.

Les choses qui fonctionnent:

  • Sudo -i
  • Sudo su -


Des choses qui ne fonctionnent pas:

  • Sudo -s
  • Sudo su
  • Sudo bash

Ainsi, il me semble que dans le premier cas, vous créez en fait un nouveau shell de connexion. Ainsi, bashrc, profile, etc. sont chargés correctement, à partir de ~ ou de/etc/skel. Dans ce dernier cas, vous "exécutez simplement bash en tant que root" et ne chargez pas toutes ces fonctions critiques dans le shell pour la saisie semi-automatique, etc.

Avertissement: mon explication est peut-être fausse à 100%. Mais le groupe supérieur fonctionne.

2
Zachary Alex Stern

Vous pouvez suivre les étapes suivantes pour obtenir l'achèvement de Sudo sous bash:

  1. Ouvrez votre .bashrc.
  2. Insérer les lignes suivantes et sauvegarder le fichier
    if [ "$PS1" ]; then
    complete -cf Sudo
    fi
    La commande complete génère des listes de complétions pour les noms de commande (-c) et le nom de fichiers (-f) pour Sudo.
  3. Ouvrez une nouvelle bash et tapez Sudo -sTab ou toute autre commande que vous souhaitez utiliser.
0
qbi

J'ai eu le même problème avec la racine ne complétant pas automatiquement. J'ai essayé sans succès plusieurs autres moyens, notamment de jouer avec le fichier .bashrc et d'installer quelques paquets. Ce qui a finalement fonctionné pour moi était aussi simple que de lancer bash. Donc, vous faites votre Sudo su et vos listes d'onglets (dans /root)

root@xxxxxxxx:~# service<tab>
root@xxxxxxxx:~# service .<tab><tab>
./             .aptitude/     .bashrc        .viminfo  
../            .bash_history  .profile  

echo $Shell répond /bin/bash donc je suis en cours d'exécution bash, mais cela ne fonctionne pas. Maintenant, je lance bash et mon shell a toujours la même apparence.

root@xxxxxxxx:~# bash
root@xxxxxxxx:~# service <tab><tab>
acpid                        plymouth-upstart-bridge  
Apache2                      portmap  
apparmor                     portmap-wait  

Maintenant ça marche. Gardez simplement à l'esprit que vous devrez double exit pour quitter la bash que vous venez de lancer, puis quitter la session Sudo su afin de ne pas laisser un terminal root ouvert.

root@xxxxxxxx:~# uname -mrs
Linux 3.8.0-33-generic x86_64  
root@xxxxxxxx:~# lsb_release -d
Description:    Ubuntu 12.04.3 LTS
0
Mattie