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

问题描述 投票:140回答:8

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

  1. db2 connect to ttt(请注意,我们需要为第二个命令提供连接
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

我试过这个:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

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

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

bash sudo
8个回答
145
投票

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

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

你的命令是这样的:

sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'"

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

sudo -- sh -c 'whoami; whoami'

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


164
投票

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

sudo sh -c "whoami; whoami"


42
投票

我经常这样做:

sudo bash -c 'whoami; whoami'

38
投票

如果您想处理报价:

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

7
投票

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

sudo -s eval 'whoami; whoami'

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

在命令中引用也更容易:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

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

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

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

1
投票

在终端上,键入:

$ sudo bash

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

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

$ sudo ./script.sh

0
投票

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

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

umask命令和mkdir-command都与'nobody'用户一起运行。

© www.soinside.com 2019 - 2024. All rights reserved.