我写了这两个脚本,它们在我的$PATH
:
格苏多:
#! /bin/bash
sudo -n true &> /dev/null
if [ $? -eq 0 ]
then
sudo "$@"
else
upass=$(zenity --password --title "Enter your password" 2> /dev/null)
[[ ! -z "$upass" ]] && echo $upass | sudo -S -p "" "$@"
fi
这个脚本本质上和上面的脚本做同样的事情gksu
。它检查是否sudo
需要密码,并根据检查结果询问是否输入密码。
运行某事:
gsudo command1
gsudo command2
如果我从终端窗口运行第二个脚本,我会得到预期的行为。它只会要求我输入一次密码。但如果我从图形环境(如任务运行器)调用它(我尝试了 i3wm dmenu 和 rofi 启动器),它会要求我输入两次密码。那么为什么会发生这种情况,我该如何解决它?我相信两次都sudo -n true
应该返回相同的内容,因为它是在同一个脚本中调用的,所以sudo
会话应该会持续存在。我没有尝试sudo
在不同的脚本调用之间保存会话,它只在一次调用中持续存在就足够了。
答案1
我做了一些测试。我(目前)还不完全清楚如何sudo
缓存一个人的能力提升。这可能与是否分配伪终端有关。
如果我是你,我会实施你在这个问题中读到的内容:sudo
如何在脚本内运行命令?尤其是来自答案之一:
在脚本内部使用很少是一个好主意
sudo
。相反,从脚本中删除sudo
并运行脚本本身sudo
但你的情况是,gsudo
我们谈论的是你的。此外,$SUDO_USER
如果有必要,我会使用(来自另一个答案)。
例子run-something
:
#!/path/to/my/gsudo /bin/bash
# The shebang ensures the below code is for sure run with gsudo bash;
# gsudo runs sudo, which sets $SUDO_USER (see `man sudo').
command1 # This is run with gsudo because the entire script is.
# Get back to the invoking (possibly regular) user for just one command
sudo -u "$SUDO_USER" command_whatever
# Again as root
command2
command3
# Get back to the invoking user for many commands
sudo -u "$SUDO_USER" bash << EOF
foo
bar
baz
EOF
我的gsudo
答案很简单:
#!/bin/bash
SUDO_ASKPASS='/path/to/my/gsudo_helper' sudo "$@"
和gsudo_helper
:
#!/bin/bash
zenity --password --title "Enter your password" 2> /dev/null
笔记:
- 我故意不在代码
sudo -A
中使用。如果可用,则此方法使用终端,否则。gsudo
gsudo
zenity
- 该语法
sudo "$@"
允许gsudo
将命令行选项(如所提到的-A
)传递给sudo
。这是一个好主意,但如果你不想要它,那么请考虑sudo -- "$@"
。