2011-04-06 55 views
116

有什么办法可以从命令行运行两个Db2命令? (他们会从PHP exec命令来调用。)如何在sudo中运行两个命令?

  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用户。命令sudo -u db2inst1 idphp用户给我正确的输出。

+0

为什么要关闭这个问题,请发表评论。谢谢。 – Radek 2011-04-06 01:19:57

+1

近距离投票是为了迁移到serverfault,因为这是一个系统管理问题,而不是编程。 – bdonlan 2011-04-06 01:23:14

回答

120

须藤可以通过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' 

而不是在做同样的事情,但让你明确命名外壳。

+2

它给了我'/ bin/bash:db2:命令未找到 /bin/bash:db2:命令未找到' 如果以php用户身份运行 – Radek 2011-04-06 01:29:38

+0

'sudo -u db2inst1 -s - 'whoami; whoami''从php帐号 – Radek 2011-04-06 01:33:35

+1

中运行正常,请添加/ full/path/to/db2;也许根目录没有它的$ PATH – ggiroux 2011-04-06 01:34:45

146

对于您的命令,你也可以参考下面的例子:

sudo sh -c "whoami; whoami"

+11

我发现这是一个更可靠的选择。 – Nick 2012-06-14 14:58:59

+8

还有一个:“-s - ”对我不起作用,但是这个方法做到了。 – 2012-09-03 21:44:48

0

以上的回答不会让你的引号内引用。此解决方案将:

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

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

+0

您可以使用单引号和双引号并转义它们。 – Radek 2012-09-14 23:34:39

+0

好的,那么怎么来,现在我在这个命令中设置了umask的事情,它没有效果? – Michael 2013-09-15 23:51:54

29

如果你想处理报价:

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

你怎么能做到这一点从PHP? – Radek 2013-01-24 22:14:07

+0

非常清晰可读。谢谢! – Benny 2016-12-19 17:08:31

+1

这是这里最干净的答案,谢谢。 也许加个备注“你不能从'sudo'运行多个命令 - 你总是需要欺骗它来执行一个可能接受多个命令来作为参数运行的shell” – trs 2017-12-03 20:47:32

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

我通常做的:

sudo bash -c 'whoami; whoami' 
3

使用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 
1

在终端,类型:

$ sudo bash 

然后根据需要编写尽可能多的命令。完成后输入exit

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

$ sudo ./script.sh