如何使用 sudo 运行两个命令?

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

  1. db2 connect to ttt(注意,我们需要为第二个命令实时连接
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

我试过了:

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用户的身份运行这个命令。

139528 次浏览

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。

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

sudo sh -c 'whoami; whoami'

上面的答案不会让你在引号中引用,这个解决方案会:

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

Umask 命令和 mkdir-命令都与‘ nobody’用户一起运行。

如果你想处理引号:

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

-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;

如果命令失败,需要停止运行,则使用双 & 符号代替分号:

$ 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 的客户机 shell 去掉了最外面的一组引号。混合并匹配您的需要的引号(例如,变量需要传入)。但是 YMMV 带有引号,特别是在远程命令比较复杂的情况下。在这种情况下,像安塞尔这样的工具将是一个更好的选择。

如果您知道 root 用户的密码,可以尝试

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