如何在sudo中运行两个命令?

时间:2011-04-06 01:13:02

标签: bash sudo

有什么办法可以从命令行运行两个Db2命令吗? (它们将从PHP exec命令调用。)

  1. db2 connect to ttt(请注意,我们需要为第二个命令启用连接
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'
  3. 我试过了:

    sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'
    

    第一个命令正确完成但第二个命令失败并显示错误消息SQL1024N A database connection does not exist. SQLSTATE=08003

    请注意,我需要以php用户身份运行它。作为 php 用户的命令sudo -u db2inst1 id为我提供了正确的输出。

10 个答案:

答案 0 :(得分:164)

对于您的命令,您还可以参考以下示例:

sudo sh -c "whoami; whoami"

答案 1 :(得分:145)

sudo可以通过shell运行多个命令,例如:

$ sudo -s -- 'whoami; whoami'
root
root

您的命令将类似于:

sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

如果您的sudo版本不能与分号一起使用-s(显然,如果使用某些选项进行编译则不会),您可以使用

sudo -- sh -c 'whoami; whoami'

相反,它基本上做同样的事情,但让你明确地命名shell。

答案 2 :(得分:42)

我通常会这样做:

sudo bash -c 'whoami; whoami'

答案 3 :(得分:38)

如果您想处理报价:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

答案 4 :(得分:7)

使用eval的替代方法,以避免使用子shell:

sudo -s eval 'whoami; whoami'

注意:使用sudo -s的其他答案失败,因为引号被传递给bash并作为单个命令运行,因此需要使用eval去除引号。 eval

可以更好地解释$ sudo -s eval 'whoami; whoami; echo "end;"' root root end;

在命令中引用也很容易:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

如果一个失败的命令需要停止运行,请使用双括号而不是分号:

Function RemoveLeadingDigits(str As String) As String

    Dim i As Long
    Dim chr As String
    ' Loop through string
    For i = 1 To Len(str)
        ' Get character i
        chr = Mid(str, i, 1)
        ' Keep looping until character is not a number or space
        If Not IsNumeric(chr) And Not chr = " " Then
            ' If it is a number or space, strip checked characters
            ' from str (because they'll be numeric or space)
            str = Right(str, Len(str) - i + 1)
            ' Stop looping as non-numeric characters encountered
            Exit For
        End If
    Next i

    ' Return the value of str
    RemoveLeadingDigits = str

End Function

答案 5 :(得分:3)

-s选项对我不起作用,-i确实如此。

以下是我如何从bash更新日志大小的示例:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'

答案 6 :(得分:1)

在终端上,输入:

$ sudo bash

然后根据需要编写任意数量的命令。完成后输入exit

如果您需要自动化它,请创建一个script.sh文件并运行它:

$ sudo ./script.sh

答案 7 :(得分:0)

以上答案不会让你在引号内引用。该解决方案将:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

umask命令和mkdir命令都运行在&#39; nobody&#39;用户。

答案 8 :(得分:0)

在一个稍微相关的主题上,我想通过SSH执行相同的多命令sudo,但以上方法均无效。

例如在Ubuntu上,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

discovered here的诀窍是将命令双引号。

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

其他可行的选项:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

原则上,需要双引号,因为我认为运行SSH的客户端外壳会去除最外层的引号。混合使用引号并将其与您的需求匹配(例如,需要传入变量)。但是YMMV带有引号,尤其是在远程命令很复杂的情况下。在这种情况下,像Ansible这样的工具将是更好的选择。

答案 9 :(得分:0)

如果您知道root密码,则可以尝试

su -c "<command1> ; <command2>"