我使用一个程序(yay
在 archlinux 中)用于sudo
提升权限。但是,如果它没有找到sudo
,它将切换到su
,这就是我想要它做的,因为我的用户不是 sudoer,但我确实已经安装了(因为即使运行时还有sudo
另一个程序需要安装) sudo
root,我知道这很愚蠢)。
现在的问题是,我怎样才能运行这个程序(yay
),同时让它认为sudo
不存在?
请注意,它yay
是一个包管理器(AUR 帮助程序),它还从源代码构建和安装包,出于安全原因,您不能以 root 身份进行这些构建,这很公平。
另请注意,我已经提出了一个问题这里onyay
的存储库,但在修复该问题的同时,我希望有一个替代解决方案。
答案1
我能想到的唯一不修改yay
自身的解决方法是使用一个包装脚本,您将以 root 身份启动该脚本,并sudo
在启动之前暂时删除该脚本yay
:
#!/bin/sh
su -c "mv /sbin/sudo /sbin/sudo.old" && yay "$@"
su -c "mv /sbin/sudo.old /sbin/sudo"
不过,这会要求您输入两次 root 密码。另一种选择是以 root 身份运行脚本,然后在脚本中使用su
切换到另一个用户:
#!/bin/sh
normalUser="$1"
shift
mv /sbin/sudo /sbin/sudo.old &&
su -c "yay $@" $normalUser
mv /sbin/sudo.old /sbin/sudo
然后您可以将其运行为:
su -c "/path/to/yay.wrapper.sh adrin $yayArguments"
对于您的情况来说,这应该是安全的,因为您实际上并未使用sudo
,但我仍然会制作一份副本,/sbin/sudo
以便在出现问题时您可以轻松取回它,以防万一。
答案2
绕过此问题的最简单方法是使用该--sudo=su
选项。
太长了;博士- 运行yay --sudo=su -Syu
即可达到预期效果。
下面解释了为什么yay --sudo=su
没有按照您的预期进行。
yay
该问题是由于处理 CLI 参数的方式造成的。来自文档:
If no arguments are provided 'yay -Syu' will be performed.
If no operation is selected -Y will be assumed.
如果未提供参数,yay -Syu
则执行(完整系统更新),但--sudo=su
计为参数,因此 yay 选择操作-Y
(列出与查询匹配的包,在本例中为空,因此命令立即退出)。
这是负责的代码段:https://github.com/Jguer/yay/blob/next/pkg/settings/parser/parser.go#L618