Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在sudo中运行两个命令?_Bash_Sudo - Fatal编程技术网

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

Bash 如何在sudo中运行两个命令?,bash,sudo,Bash,Sudo,有没有办法从命令行运行两个Db2命令?(它们将从PHPexec命令调用。) db2connecttottt(注意,对于第二个命令,我们需要使连接处于活动状态 db2更新联系人集电子邮件地址=”mytestaccount@gmail.com“ 我试过这个: sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com' 第一个命令正确完成,但第二个命令失败

有没有办法从命令行运行两个Db2命令?(它们将从PHP
exec
命令调用。)

  • db2connecttottt
    (注意,对于第二个命令,我们需要使连接处于活动状态
  • db2更新联系人集电子邮件地址=”mytestaccount@gmail.com“
  • 我试过这个:

    sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'
    
    第一个命令正确完成,但第二个命令失败,错误消息为
    SQL1024N数据库连接不存在。SQLSTATE=08003


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

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

    $ sudo -s -- 'whoami; whoami' root root $sudo-s--'whoami;whoami' 根 根 您的命令类似于:

    sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'" sudo-u db2inst1-s--“db2连接到ttt;db2更新联系人集电子邮件地址=”mytestaccount@gmail.com'" 如果您的sudo版本无法使用带-s的分号(显然,如果使用某些选项编译,则无法使用分号),则可以使用

    sudo -- sh -c 'whoami; whoami' sudo--sh-c'whoami;whoami'
    相反,它基本上做相同的事情,但使您显式地命名shell。

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


    sudo sh-c'whoami;whoami'

    以上答案不允许您在引号内引用。此解决方案将:

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

    umask命令和mkdir命令都与“nobody”用户一起运行。

    如果要处理引号:

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

    sudo-s--这个
    -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;'
    
    我通常会:

    sudo bash -c 'whoami; whoami'
    

    另一种选择是使用
    eval
    ,以避免使用子shell:

    sudo -s eval 'whoami; whoami'
    
    注意:使用
    sudo-s
    的其他答案失败,因为引号被传递到bash并作为单个命令运行,因此需要使用eval去除引号。
    eval
    更好地解释了这一点

    在命令中引用也更容易:

    $ sudo -s eval 'whoami; whoami; echo "end;"'
    root
    root
    end;
    
    如果命令在失败时需要停止运行,请使用双符号And而不是分号:

    $ sudo -s eval 'whoami && whoamit && echo "end;"'
    root
    /bin/bash: whoamit: command not found
    
    在终端上,键入:

    $ sudo bash
    
    然后编写任意数量的命令。完成后键入
    exit

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

    $ sudo ./script.sh
    

    关于一个稍微相关的主题,我想通过SSH执行相同的多命令sudo,但上述操作都不起作用

    比如在Ubuntu上

    $ ssh host.name sudo sh -c "whoami; whoami"
    [sudo] password for ubuntu:
    root
    ubuntu
    
    诀窍是双引号的命令

    $ 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的客户端外壳会剥离最外层的一组引号。但是,如果远程命令很复杂,请使用引号。在这种情况下,像Ansible这样的工具会做出更好的选择。

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

    su -c "<command1> ; <command2>"  
    
    su-c”
    
    请留下您为什么要关闭此问题的评论。谢谢。关闭投票是为了迁移到serverfault,因为这是一个系统管理问题,而不是编程问题。我发现这是一个更可靠的替代方案。您可以使用单引号和双引号并对其进行转义。好吧,那么,为什么现在不管我在c中设置了什么umaskOmand,它没有效果?这在最新的debian stable(squeeze)bash上不起作用:
    sudo-s--'/usr/bin/whoami;/usr/bin/whoami'/bin/bash:/usr/bin/whoami;/usr/bin/whoami:没有这样的文件或目录
    @Valor您可以使用
    sudo--sh-c'whoami;whoami;
    作为“sudo-s”时的变通方法是坏的。我也更新了答案。编辑后的版本显示“--sh-c”示例为+1。谢谢!你能解释一下为什么需要“--”?@VicSeedoubleyew
    --
    表示
    sudo
    的参数结束,因此其他所有参数都是命令的一部分;没有它,像
    -c
    这样的参数可以解释为
    sudo
    的参数。这适用于大多数(但不是所有)命令行程序。对于另一个(非
    sudo
    )例如,要删除名为
    -f
    的文件,您不能只运行
    rm-f
    ,对吧?!但您可以运行
    rm--f
    删除名为
    -f
    的文件。这是最清晰的答案,谢谢。也许可以添加注释“您不能从
    sudo
    运行多个命令-您始终需要诱使它执行一个shell,该shell可以接受多个命令作为参数运行。”“如果您不知道根密码,请使用
    sudo su-c”;”