从bash脚本运行sudo而不能以特权运行脚本的最佳方法是什么?

时间:2017-06-13 22:13:21

标签: linux bash

我需要一些能够编写脚本的命令,这些命令需要使用sudo添加的业务约束,我无法使用权​​限运行脚本本身。我见过使用

echo "$pwd" | sudo <my command>

这是最好的方法吗?有时我得到一个回复​​说bash: line 1: <my pwd redacted>: command not found,我想这是因为linux实际上没有提示输入pwd。我见过有人提到修改/etc/sudoers文件但显然对该文件的更改在注销之前不会生效。

3 个答案:

答案 0 :(得分:1)

考虑使用super命令进行安装,或者在中小心地编写(以避免安全漏洞)自己的setuid可执行文件并正确构建(使用{ ELF可执行文件上的{1}}。请注意,脚本不能是setuid。见execve(2)

答案 1 :(得分:1)

  

什么是从bash脚本运行sudo而不能以特权运行脚本的最佳方式?

我认为最好的方法是提示用户输入密码,并在脚本中需要时应用sudo。例如,以下是build-git.shbuild-ssh.sh。脚本仅在sudo步骤中使用密码make install。 (这些脚本用于旧操作系统,如CentOS 5,它不提供现代工具)。

echo
echo "If you enter a sudo password, then it will be used for installation."
echo "If you don't enter a password, then ensure INSTALL_PREFIX is writable."
echo "To avoid sudo and the password, just press ENTER and they won't be used."
read -s -p "Please enter password for sudo: " SUDO_PASSWWORD
echo
...

# Configure and make without privileges
...

MAKE_FLAGS=(install)
if [[ ! (-z "$SUDO_PASSWWORD") ]]; then
    echo "$SUDO_PASSWWORD" | sudo -S "$MAKE" "${MAKE_FLAGS[@]}"
else
    "$MAKE" "${MAKE_FLAGS[@]}"
fi

可能值得一提的是,我需要(1)没有权限进行配置和构建,以及(2)使用权限进行安装。使密码可选,就像在脚本中一样,满足了我的需求,因此它被认为是最好的&#34;因为它符合我的要求,并以最少的努力工作。你最好的&#34;可能会根据您的要求而有所不同。

如果您使用echo方法,请考虑禁用或清除Bash历史记录以避免记录密码。如果你想获得幻想,你甚至可以temporarily disable history。我运行脚本的机器已经禁用了它们的历史记录,因此我不关心它。

答案 2 :(得分:-1)

首先,真正的问题是你需要什么sudo。由于未指定,我认为你的意思是“sudo to root”。

很多时候人们只想在特定的非系统目录中安装某些东西(例如/ var / www / app)。你不需要root权限,你可以创建一个专门的用户,可以在那里写sudo或登录该用户来执行你需要的任何步骤。

人们陷入的常见陷阱是将sudo使用限制在特定的子命令中,该子命令本身也允许任意代码执行,实际上首先违背了限制使用的目的。经典的例子是make,你可以在makefile中放置你想要的任何东西。 sudo make现在将以root身份运行。

您也没有说明这是否是您需要主动使用的内容,或者是否需要自动执行脚本(即无需人工监督)。

那么,你究竟想做什么以及为什么?