有什么办法可以从命令行运行两个Db2命令吗? (它们将从PHP exec
命令调用。)
db2 connect to ttt
(请注意,我们需要为第二个命令启用连接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用户身份运行它。作为 php 用户的命令sudo -u db2inst1 id
为我提供了正确的输出。
答案 0 :(得分:164)
对于您的命令,您还可以参考以下示例:
sudo sh -c "whoami; whoami"
答案 1 :(得分:145)
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。
答案 2 :(得分:42)
我通常会这样做:
sudo bash -c 'whoami; whoami'
答案 3 :(得分:38)
如果您想处理报价:
sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
答案 4 :(得分:7)
使用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
如果一个失败的命令需要停止运行,请使用双括号而不是分号:
Function RemoveLeadingDigits(str As String) As String
Dim i As Long
Dim chr As String
' Loop through string
For i = 1 To Len(str)
' Get character i
chr = Mid(str, i, 1)
' Keep looping until character is not a number or space
If Not IsNumeric(chr) And Not chr = " " Then
' If it is a number or space, strip checked characters
' from str (because they'll be numeric or space)
str = Right(str, Len(str) - i + 1)
' Stop looping as non-numeric characters encountered
Exit For
End If
Next i
' Return the value of str
RemoveLeadingDigits = str
End Function
答案 5 :(得分: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;'
答案 6 :(得分:1)
在终端上,输入:
$ sudo bash
然后根据需要编写任意数量的命令。完成后输入exit
。
如果您需要自动化它,请创建一个script.sh
文件并运行它:
$ sudo ./script.sh
答案 7 :(得分:0)
以上答案不会让你在引号内引用。该解决方案将:
sudo -su nobody umask 0000 \; mkdir -p "$targetdir"
umask命令和mkdir命令都运行在&#39; nobody&#39;用户。
答案 8 :(得分:0)
在一个稍微相关的主题上,我想通过SSH执行相同的多命令sudo,但以上方法均无效。
例如在Ubuntu上,
$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu
discovered here的诀窍是将命令双引号。
$ 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的客户端外壳会去除最外层的引号。混合使用引号并将其与您的需求匹配(例如,需要传入变量)。但是YMMV带有引号,尤其是在远程命令很复杂的情况下。在这种情况下,像Ansible这样的工具将是更好的选择。
答案 9 :(得分:0)
如果您知道root密码,则可以尝试
su -c "<command1> ; <command2>"