Заполнение клавишей Tab Shell для сервисной команды, поврежденной как корень

На большинстве наших серверов заполнение клавишей Tab сервисных названий после ввода в сервисной команде больше не работает как корень. Это работает просто великолепно как некорневое. Это находится на Ubuntu 12.04. Я не уверен, как приблизиться к поиску и устранению неисправностей этого.

Демонстрация:

Заполнение клавишей Tab работает обычным пользователем zachary, кто нажал вкладку для списка завершений в первом изображении:

Tab completion works

Но как пользователь root, это не перечисляет сервисы как завершения (только файлы):

Now it does not

Любая справка значительно ценилась бы.

7
задан 26 April 2016 в 09:02

5 ответов

Это отключено по умолчанию в Ubuntu.

Прочитайте ваши /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 - , все закомментировано . Видимо, есть причина, о которой я не знаю (возможно, восстановление в однопользовательском режиме?).

Причина, по которой он работает, когда вы делаете sudo su, sudo -s, sudo bash, заключается в том, что он на самом деле не запускает login, чтобы сделать вас полностью root. При запуске sudo su - или sudo -i он действительно полностью регистрирует вас как этого пользователя. Здесь, на примере переменной среды $HOME, больше этой разницы:

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
0
ответ дан 26 April 2016 в 09:02

Хорошо, я понял это, вроде как.

Что работает:

  • sudo -i
  • sudo su -


  • [ 1113]

    Вещи, которые не работают:

    • sudo -s
    • sudo su
    • sudo bash

    Так мне кажется, что в первом случае вы на самом деле создаете новую оболочку входа в систему, поэтому bashrc, profile и т. д. загружаются правильно, либо из ~, либо из / etc / skel. В последнем случае вы просто «выполняете bash от имени пользователя root» и фактически не загружаете все эти критические функции в оболочку для автозаполнения и т. П.

    Предостережение: моё объяснение может быть на 100% неверным. Но верхняя группа работает.

0
ответ дан 26 April 2016 в 09:02

У меня была та же проблема с корнем, не автозаполнением. Я безуспешно пробовал пару других способов, включая возиться с .bashrc и установить пару пакетов. То, что в итоге сработало для меня, было так же просто, как просто запустить bash Итак, вы делаете свои sudo su и вкладки просто списки (в /root)

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

echo $SHELL ответы /bin/bash, так что я запускаю bash, но это не работает. Теперь я запускаю bash и моя оболочка выглядит так же.

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

Теперь это работает. Просто имейте в виду, что вам придется дважды выйти, чтобы выйти из только что запущенного bash, а затем выйти из сеанса sudo su, чтобы не оставить корневой терминал открытым.

root@xxxxxxxx:~# uname -mrs
Linux 3.8.0-33-generic x86_64  
root@xxxxxxxx:~# lsb_release -d
Description:    Ubuntu 12.04.3 LTS
0
ответ дан 26 April 2016 в 09:02

У меня была такая же проблема. Я попытался:

  1. Запустить /usr/sbin/visudo от имени пользователя root
  2. Добавить эту строку в нее, затем сохранить и выйти:

    Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin [ 118]

  3. Откройте новый сеанс и попробуйте запустить команду сейчас

Вот и все; Вы сделали это.

0
ответ дан 26 April 2016 в 09:02

Вы можете сделать следующие шаги, чтобы получить завершение для sudo в bash:

  1. Откройте .bashrc.
  2. Вставьте следующие строки и сохраните файл
    if [ "$PS1" ]; then
    complete -cf sudo
    fi
    Команда complete создает списки дополнений для имен команд (-c) и имен файлов (-f) для sudo.
  3. Откройте новый bash и введите sudo -s Tab или любую другую команду, которую вы хотите использовать.
0
ответ дан 26 April 2016 в 09:02

Другие вопросы по тегам:

Похожие вопросы: