在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 
+2

错字。我认为你的意思是sudo -s,而不是sudo - s。 –

尝试添加“家当”线(第一行)打电话给你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)。