有什么办法可以从命令行运行两个Db2命令吗? (它们将从PHP exec
命令调用。)
db2 connect to ttt
(请注意,我们需要为第二个命令提供连接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
给了我正确的输出。
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。
对于您的命令,您还可以参考以下示例:
sudo sh -c "whoami; whoami"
我经常这样做:
sudo bash -c 'whoami; whoami'
如果您想处理报价:
sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
使用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
-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
然后根据需要编写任意数量的命令。你完成后输入exit
。
如果您需要自动化它,请创建一个script.sh
文件并运行它:
$ sudo ./script.sh
上面的答案不会让你在引号内引用。该解决方案将:
sudo -su nobody umask 0000 \; mkdir -p "$targetdir"
umask命令和mkdir-command都与'nobody'用户一起运行。