【问题标题】:Bash script opening new gnome-terminal with sudo password as variableBash 脚本以 sudo 密码作为变量打开新的 gnome 终端
【发布时间】:2023-10-11 18:35:02
【问题描述】:

我正在编写一个脚本来使我的系统保持最新。在脚本中,我打开一个新的 gnome-terminal 以在那里执行代码,因为我确实想要输出,但不是在我的主终端窗口中。但是,我似乎无法使用 sudo 密码。这是我的脚本:

echo "Please provide me with your SUDO password"
#make password variable for later use. 
read password 

echo "Updating your package information.."
gnome-terminal --quiet --wait -- echo "$password" | sudo -S apt-get update
echo "Command executed."

echo -e "Upgrading packages.."
#etc..

当我在“新”终端中回显密码时,它确实有效,我可以看到密码(或任何变量)就好了。然而,上面的结果总是 sudo: no password was provided.

我不想禁用我的 sudo 密码,并且执行的命令必须在新窗口中。

【问题讨论】:

  • 我没有测试,但是看起来像这个命令:| sudo -S apt-get update是在运行脚本的窗口中执行的,而不是在新终端中。为什么不直接输入gnome-terminal --quiet --wait -- sudo apt-get update 并将密码输入新终端?
  • 另请注意echo "$password" | sudo -S apt-get update 是高度不安全的,因为您可以在进程列表中看到密码,并且某些恶意软件可以检测到该密码并且使用 sudo 密码...它可以对您的计算机执行任何操作。跨度>
  • @MichalH 是否会在全新安装后直接执行一次脚本?
  • 不那么安全,但仍然是不好的做法。这应该是安全的:sudo -S apt-get update <<< "$password".
  • @MichalH 不幸的是,这不起作用,因为它仍然在新的终端窗口中提示我输入密码。我不想输入密码的原因是因为我的脚本会打开多个窗口,其中一些(大约 10 个窗口)需要 sudo 密码。

标签: bash variables sudo


【解决方案1】:

我不使用 gnome,而且它显然没有官方手册页。 Debian 或 Ubuntu 添加的 man page 不是最新的。似乎建议您需要将命令作为带有-e 的单个字符串提供,askubuntu 上的示例显示它显然在 2010 年有效。

最近,可以使用-x,然后它会占用该行的其余部分,但由于您的命令中有一个管道|,您可能需要改为:

... -x bash -c "printf '%s\n' '$password' | sudo -S apt-get update"

假设' 不在您的密码中。 (如果密码中有特殊字符,printf 优先于 echo)。

您可能更喜欢在环境中传递密码:

PW="$password" gnome-terminal ... -x bash -c 'printf "%s\n" "$PW" | sudo -S apt-get update'

正如您所评论的,-e-x 现在已弃用,该命令应在 -- 之后传递,如下所示:

PW="$password" gnome-terminal ... -- bash -c 'printf "%s\n" "$PW" | sudo -S apt-get update'

【讨论】:

  • 也许更好-e 'printf %s '"$password"' | sudo ....',以免引用麻烦?
  • 你说得对,printf 更可取,我已经更新了,但遗憾的是它对包含引号的密码没有帮助,因为你仍然需要引用 $password。最好将密码放在环境中,然后它将是一个变量而不是字符串。我假设字符串被传递给bash -c ... 或类似的。
  • 使用环境确实会有所帮助。也许您可以将此添加到您的答案中?
  • 当使用上述任何一种时,我得到以下错误:There was an error creating the child process for this terminalFailed to execute child process “printf "%s\n" "$PW" | sudo -S apt-get update” (No such file or directory)任何想法?
  • 重新阅读手册页,没有提供任何示例,也许应该是-x 而不是-e。如果失败,请尝试-x bash -c 'printf....'。抱歉,我目前没有 gnome 访问权限。
最近更新 更多