在shell脚本中运行sudo -s
我试图制作一个shell脚本来安装和配置一个名为logentries的日志集中程序。他们在自己的网站上有指示,将一些行复制并粘贴到命令行中,以完成此过程。我试图复制和粘贴这些确切的bash命令到一个shell脚本中,这样我就可以运行这个脚本而不是复制和粘贴他们的所有指令。在shell脚本中运行sudo -s
这里是我的脚本的内容:
sudo -s
echo "sudod"
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
我插入第2行echo语句以测试脚本,甚至让到这一点,但是当我运行该脚本,甚至不会输出。我想这意味着我不能只在命令行中使用脚本内的sudo -s
。
有谁知道我可以如何让这些命令行指令在shell脚本中执行?
shell脚本中的每条命令都是独立运行的。该脚本是父进程,它调用命令作为子进程。因此,sudo -s
创建一个打开root shell的新进程。但是,此过程不能在以后执行这些命令。
如果您从根shell执行exit
,您还可以看到正在打印的回显输出。发生这种情况是因为,当你退出时,root shell的进程终止。
您可以在shell脚本中编写除sudo -s
之外的所有命令。通过chmod +x install_logentries.sh
使其可执行。并经由sudo install_logentries.sh
执行它另一种选择是命令嵌入如使用< <子进程(如下面给出的):在须藤线
#!/bin/bash
sudo -s << SCRIPT
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
SCRIPT
尝试添加“家当”线(第一行)打电话给你bash
,如下例所示:(做which bash
来查看您的bash
所在,因为它可能不是/bin/bash
)
#!/bin/bash
sudo -s
echo "sudod"
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
注意:当您为sudo -s
输入密码时可能会提示您。
我一般检查EUID,如果它不为零,则是这样的:。
if [ $EUID -ne 0 ]; then
exec sudo $0
done
(基本上迫使脚本根,如果它不是已经运行的“执行” bit确保控制呢不会返回到您的非根脚本。)
删除sudo行并将其作为sudo ./script
调用应该会给你你想要的。
或者,可以在脚本中使用sudo作为单个命令的前缀(sudo tee
,sudo yum
)。
错字。我认为你的意思是sudo -s,而不是sudo - s。 –