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:
Mais en tant qu'utilisateur root
, il ne répertorie pas les services en tant que complétions (fichiers uniquement):
Toute aide serait grandement appréciée.
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
Ok, donc je l'ai compris, en quelque sorte.
Les choses qui fonctionnent:
Des choses qui ne fonctionnent pas:
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.
Vous pouvez suivre les étapes suivantes pour obtenir l'achèvement de Sudo
sous bash:
.bashrc
.if [ "$PS1" ]; then
complete -cf Sudo
fi
complete
génère des listes de complétions pour les noms de commande (-c
) et le nom de fichiers (-f
) pour Sudo.Sudo -s
Tab ou toute autre commande que vous souhaitez utiliser.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