我正在尝试为我无权查看/输入的文件夹获取自动完成功能,我的第一个想法是使用compgen
并sudo
手动完成完成,但看起来像是compgen
内置的 shell,因此使用 sudo 启动它可能不行。
另外,如果我为文件夹编写了自定义完成功能,如何覆盖每个命令?我不想complete
对一切都发号施令。
或者还有其他替代方法吗?
编辑
这在您授予用户 sudo 权限(运行任意命令)但不希望他们以 root 身份登录 / su 的环境中非常有用,因此当他们需要导航到某些只能由 root 访问的文件夹时,他们可以快速查看没有运行命令的内容,例如sudo ls XX
答案1
我建议使用交互式 sudo 会话作为替代方案;使用任一
sudo -i
或者
sudo -s
获得 root shell。
sudo -s
将保留您当前的环境(因此eg$HOME
仍然是普通用户的主目录),同时sudo -i
将模拟以root身份初始登录,因此eg$HOME
将指向/root
.
调整普通用户的制表符补全以使用 sudo可能有可能,但似乎有问题:如果您在过去 15 分钟内没有使用过 sudo,它会提示您输入密码当您尝试使用制表符完成时,否则它就无法工作,您必须手动运行 sudo 来刷新凭据缓存,然后才能再次工作。另外,我不知道该怎么做,而且对于一个简单的问题来说,这似乎是一个复杂的解决方法:)
答案2
您真正需要的是具有提升权限的受限 shell 运行。问题是用户正在运行的 bash shell 没有允许获取这些目录列表,以便它不能利用自动完成功能。
如果您要为某些具有 sudo 访问权限的人打开整个目录,那么您应该为这些人创建一个组并相应地设置 rX 权限(或使用 facls)。
如果您仅在 sudo 中提供特定命令,那么用户可以执行以下操作:
须藤-l
获得列表。聪明的人也许能够将“sudo -l”的输出转换为 bash 自动完成可以处理的内容,但我还没有看到它。 (同样,只有当您明确指定命令时它才有效。)
如果您确实按照示例中的方式进行操作(仅向人们提供 sudo 至 ls),那么只需继续为这些人创建所有指定的目录 +rx ...