На большинстве наших серверов заполнение клавишей Tab сервисных названий после ввода в сервисной команде больше не работает как корень. Это работает просто великолепно как некорневое. Это находится на Ubuntu 12.04. Я не уверен, как приблизиться к поиску и устранению неисправностей этого.
Демонстрация:
Заполнение клавишей Tab работает обычным пользователем zachary
, кто нажал вкладку для списка завершений в первом изображении:
Но как пользователь root
, это не перечисляет сервисы как завершения (только файлы):
Любая справка значительно ценилась бы.
Это отключено по умолчанию в 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
Хорошо, я понял это, вроде как.
Что работает:
Вещи, которые не работают:
Так мне кажется, что в первом случае вы на самом деле создаете новую оболочку входа в систему, поэтому bashrc, profile и т. д. загружаются правильно, либо из ~, либо из / etc / skel. В последнем случае вы просто «выполняете bash от имени пользователя root» и фактически не загружаете все эти критические функции в оболочку для автозаполнения и т. П.
Предостережение: моё объяснение может быть на 100% неверным. Но верхняя группа работает.
У меня была та же проблема с корнем, не автозаполнением. Я безуспешно пробовал пару других способов, включая возиться с .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
У меня была такая же проблема. Я попытался:
/usr/sbin/visudo
от имени пользователя root Добавить эту строку в нее, затем сохранить и выйти:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
[ 118]
Откройте новый сеанс и попробуйте запустить команду сейчас
Вот и все; Вы сделали это.
Вы можете сделать следующие шаги, чтобы получить завершение для sudo
в bash:
.bashrc
. if [ "$PS1" ]; then
complete -cf sudo
fi
complete
создает списки дополнений для имен команд (-c
) и имен файлов (-f
) для sudo. sudo -s
Tab kbd> или любую другую команду, которую вы хотите использовать.