在shell脚本中运行sudo -s

时间:2016-08-22 21:42:36

标签: linux bash shell

我试图创建一个shell脚本来安装和配置一个名为logentries的日志集中程序。他们在他们的网站上有说明,将一些行复制并粘贴到命令行中,从而完成此过程。我尝试将这些确切的bash命令复制并粘贴到shell脚本中,这样我就可以运行一个脚本,而不是复制和粘贴所有指令。

这是我脚本的内容:

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脚本中执行这些命令行指令?

4 个答案:

答案 0 :(得分:4)

我通常检查EUID,如果它不是零,那么就像:

if [ $EUID -ne 0 ]; then
    exec sudo $0
done

(基本上强制脚本以root身份运行,如果它还没有。&#34; exec&#34;位确保控件不会返回到非root脚本。)

答案 1 :(得分:4)

shell脚本中的每个命令都是独立运行的。该脚本是父进程,它将命令作为子进程调用。因此,sudo -s创建一个打开root shell的新进程。但是,此进程以后无法执行命令。

如果从root shell执行exit,您还可以看到正在打印的echo输出。发生这种情况是因为,当您退出时,root shell的进程将被终止。

您可以在shell脚本中编写除sudo -s之外的所有命令。使其可由chmod +x install_logentries.sh执行。并通过sudo install_logentries.sh

执行

另一种方法是使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; (如下所示):

#!/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 :(得分:2)

删除sudo行并以Dim c As Range, v As String, arr, x As Long, e Dim d As Range Set d = WorkSheets("Sheet1").Range("F1") '<<results start here For Each c In ActiveSheet.Range("D1:D10") v = Trim(c.Value) If Len(v) > 0 Then 'normalize other separators to spaces v = Replace(v, vbLf, " ") 'remove double spaces Do While InStr(v, " ") > 0 v = Replace(v, " ", " ") Loop 'split to array arr = Split(v, " ") For x = LBound(arr) To UBound(arr) e = arr(x) 'see if array element is a word of interest If Not IsError(Application.Match(LCase(e), Array("(hello hey)"), 0)) Then If x > LBound(arr) Then d.Value = arr(x - 1) & " " & e 'prepend previous word Else d.Value = "??? " & e 'no previous word End If Set d = d.Offset(1, 0) End If Next x End If Next c End Sub​ 调用它应该可以为您提供所需的内容。

或者,可以在脚本中使用sudo作为前缀单个命令(sudo ./scriptsudo tee)。

答案 3 :(得分:1)

尝试添加&#39; shebang&#39;要调用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输入密码时,系统可能会提示您。