以 root 身份执行服务命令的 Shell tab 补全失败

以 root 身份执行服务命令的 Shell tab 补全失败

在我们的大多数服务器上,以 root 身份输入服务命令后,服务名称的制表符补全功能不再起作用。以非 root 身份运行则一切正常。这是在 Ubuntu 12.04 上。我不确定如何解决此问题。

演示:

Tab 键补全的工作方式与普通用户相同zachary,普通用户按下 Tab 键即可在第一张图片中列出补全:

Tab 补全功能

但作为用户root,它没有将服务列为完成(仅列出文件):

现在却没有

任何帮助将不胜感激。

答案1

在 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 susudo -ssudo 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

答案2

好的,我已经明白了,差不多。

有用的方法:

  • sudo-i
  • 须藤苏-


不起作用的事情:

  • sudo -s
  • 须藤苏
  • sudo bash

因此在我看来,在前一种情况下,您实际上是在创建一个新的登录 shell,因此 bashrc、profile 等都可以从 ~ 或 /etc/skel 正确加载。在后一种情况下,您只是“以 root 身份执行 bash”,而实际上并没有将所有这些关键功能加载到 shell 中以实现自动完成等功能。

警告:我的解释可能完全错误。但上面的组确实有效。

答案3

sudo您可以按照以下步骤在 bash 中完成:

  1. 打开你的.bashrc
  2. 插入以下行并保存文件
    if [ "$PS1" ]; then
    complete -cf sudo
    fi
    complete命令为 sudo 生成命令名称 ( -c) 和文件名称 ( -f) 的补全列表。
  3. 打开一个新的 bash 并输入sudo -sTab或您想要使用的任何其他命令。

答案4

我也遇到了同样的问题。我尝试了以下方法:

  1. /usr/sbin/visudo以 root 用户身份运行
  2. 添加此行然后保存并退出:

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

  3. 打开新会话并尝试立即运行命令

就是这样,你已经做到了。

相关内容