Shell-Tab-Vervollständigung für Servicebefehl als root gebrochen

7

Auf den meisten unserer Server funktioniert die Tab-Vervollständigung von Dienstnamen nach Eingabe des Dienstbefehls nicht mehr als Root. Es funktioniert gut als Nicht-Root. Dies ist unter Ubuntu 12.04. Ich bin mir nicht sicher, wie ich bei der Fehlerbehebung vorgehen soll.

Demonstrieren:

Die Tab-Vervollständigung funktioniert wie der normale Benutzer zachary, der die Tabulatortaste gedrückt hat, um die Vervollständigungen im ersten Bild aufzulisten:

Die Tab-Vervollständigung funktioniert

Als Benutzer rootwerden Dienste jedoch nicht als Vervollständigungen aufgeführt (nur Dateien):

Jetzt tut es nicht

Jede Hilfe wäre sehr dankbar.

Zachary Alex Stern
quelle

Antworten:

4

Dies ist unter Ubuntu standardmäßig deaktiviert.

Lesen Sie Ihre /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

Bash-Vervollständigung ist alle auskommentiert . Anscheinend gibt es einen Grund dafür, den ich nicht kenne (Wiederherstellungs-Einzelbenutzermodus vielleicht?).

Der Grund dafür , warum es funktioniert , wenn Sie tun sudo su, sudo -s, sudo bashist , dass sie nicht wirklich laufen loginSie ganz Wurzel zu machen. Wenn Sie ausgeführt werden sudo su -oder sich sudo -iwirklich vollständig als dieser Benutzer anmelden. Hier am Beispiel der Umgebungsvariablen $HOMEmehr von diesem Unterschied:

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
gertvdijk
quelle
2

Ok, also habe ich es irgendwie herausgefunden.

Dinge, die funktionieren:

  • sudo -i
  • sudo su -


Dinge, die nicht funktionieren:

  • sudo -s
  • sudo su
  • Sudo Bash

Mir scheint also, dass Sie im ersten Fall tatsächlich eine neue Anmeldeshell erstellen, sodass bashrc, profile usw. korrekt geladen werden, entweder von ~ oder von / etc / skel. Im letzteren Fall führen Sie nur "Bash als Root aus" und laden nicht alle diese kritischen Funktionen für die automatische Vervollständigung und dergleichen in die Shell.

Vorsichtsmaßnahme: Meine Erklärung könnte zu 100% falsch sein. Aber die Spitzengruppe funktioniert.

Zachary Alex Stern
quelle
0

Sie können die folgenden Schritte ausführen, um die Fertigstellung sudoin Bash zu erhalten:

  1. Öffne deine .bashrc.
  2. Fügen Sie die folgenden Zeilen ein und speichern Sie die Datei.
    if [ "$PS1" ]; then
    complete -cf sudo
    fi
    Der completeBefehl generiert Listen mit Vervollständigungen für Befehlsnamen ( -c) und Dateinamen ( -f) für sudo.
  3. Öffnen Sie eine neue Bash und geben Sie sudo -sTabeinen anderen Befehl ein, den Sie verwenden möchten.
qbi
quelle
0

Ich hatte das gleiche Problem mit Root, das nicht automatisch vervollständigt wurde. Ich habe erfolglos ein paar andere Möglichkeiten ausprobiert, darunter das Herumspielen mit der .bashrc und die Installation einiger Pakete. Was für mich schließlich funktionierte, war so einfach wie nur Bash laufen zu lassen. Also machst du deine sudo suund tab nur Listen (in /root)

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

echo $SHELLantwortet, /bin/bashalso starte ich Bash, aber es funktioniert nicht. Jetzt renne ich bashund meine Shell sieht immer noch genauso aus.

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

Jetzt geht es. Denken Sie daran, dass Sie doppelt beenden müssen, um die gerade gestartete Bash zu beenden, und dann die sudo suSitzung beenden müssen, damit Sie kein Root-Terminal offen lassen.

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

Ich hatte das gleiche Problem. Was ich versucht habe ist:

  1. Führen Sie /usr/sbin/visudoals Root - Benutzer
  2. Fügen Sie diese Zeile hinzu, speichern Sie sie und beenden Sie sie:

    Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

  3. Öffnen Sie eine neue Sitzung und versuchen Sie, den Befehl jetzt auszuführen

Das ist es; Du hast es getan.

Mitter
quelle
Wie löst dies das Problem? AFAIK diese Pfade sind sowieso schon in den Standardeinstellungen.
David Edwards