2011-04-06 127 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