图形环境中的“sudo”会话行为

图形环境中的“sudo”会话行为

我写了这两个脚本,它们在我的$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中使用。如果可用,则此方法使用终端,否则。gsudogsudozenity
  • 该语法sudo "$@"允许gsudo将命令行选项(如所提到的-A)传递给sudo。这是一个好主意,但如果你不想要它,那么请考虑sudo -- "$@"

相关内容