我有一个 shell 脚本,它需要非 root 用户帐户来运行某些命令,然后将用户更改为 root 以运行脚本的其余部分。我正在使用 SUSE11。 我已经使用 expect 来自动提示密码。但是当我使用 产卵苏 - 并且命令被执行,提示以 root 返回,脚本的其余部分不执行。
例如
< non-root commands>
spawn su -
<root commands>
但是在 su 之后 - 提示以 root 用户返回。 如何执行脚本的其余部分。
sudo -S 选项没有帮助,因为它不运行 sudo -S ifconfig 命令,我需要找到机器的 IP 地址。
我已经浏览了这些链接,但找不到解决方案: 在 shell 脚本中将脚本目录更改为用户的主目录
sudo
可以在这里工作,但您需要稍微更改一下脚本:
$ cat 1.sh
id
sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF
$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!
您需要在
<<EOF
块中运行您的命令并将块交给sudo
。
如果你愿意,你可以使用
su
,当然。但是您需要使用expect/pexpect
运行它,它将为您输入密码。
但即使您可以设法自动输入密码(或将其关闭),这种结构也不起作用:
user-command
su
root-command
在这种情况下,
root-command
将以用户身份执行,而不是以 root 权限执行,因为它将在 su
完成后执行(su
打开一个新的 shell,而不是更改当前 shell 的 uid)。你当然可以在这里使用相同的技巧:
su -c 'sh -s' <<EOF
# list of root commands
EOF
但是现在你和
sudo
一样了。
有一种无需第二个脚本即可轻松完成的方法。只需将其放在文件的开头:
if [ "$(whoami)" != "root" ]
then
sudo su -s "$0"
exit
fi
然后它会自动以root身份运行。当然,这假设您可以
sudo su
而无需提供密码 - 但这超出了本答案的范围;请参阅有关在 shell 脚本中使用 sudo 的其他问题之一以了解如何执行此操作。
简短版本:创建一个块来包含所有要以 root 身份运行的命令。
例如,我创建了一个脚本来从根子目录运行命令,该段是这样的:
sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
另外,请注意,如果您在如下所示的 shell 脚本中更改为“root”用户,很少有 Linux 实用程序(例如 awk 用于数据提取或定义一个简单的 shell 变量等)会表现得很奇怪。
要解决此问题,只需使用 <<'EOF' in place of EOF.
引用整个文档sudo -i <<'EOF'
ls
echo "I am root now"
EOF
最简单的方法是创建至少两个脚本。
第一个应该以 root 权限调用第二个。因此,您在第二个脚本中执行的每个命令都将以 root 身份执行。
例如:
runasroot.sh
sudo su-c'./scriptname.sh'
脚本名称.sh
apt-get install mysql-server-5.5
或任何你需要的。
您可以使用此函数以 root 身份再次调用脚本,将第一个参数传递给新调用:
A=$1
run_with_sudo() {
local prompt
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
# the current user has sudo and the password is already set
if [ "$(whoami)" != "root" ]; then
# restart script as root
exec sudo su - <<EOF
"$0" "$A"
EOF
exit
fi
elif echo $prompt | grep -q '^sudo:'; then
echo "the current user has sudo but needs the password entered"
return 1
else
echo "the current user has no sudo rights"
return 1
fi
}
注意“$0”可能不是你想的那样]