Bash 如何在sudo中运行两个命令?
有没有办法从命令行运行两个Db2命令?(它们将从PHPBash 如何在sudo中运行两个命令?,bash,sudo,Bash,Sudo,有没有办法从命令行运行两个Db2命令?(它们将从PHPexec命令调用。) db2connecttottt(注意,对于第二个命令,我们需要使连接处于活动状态 db2更新联系人集电子邮件地址=”mytestaccount@gmail.com“ 我试过这个: sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com' 第一个命令正确完成,但第二个命令失败
exec
命令调用。)
db2connecttottt
(注意,对于第二个命令,我们需要使连接处于活动状态db2更新联系人集电子邮件地址=”mytestaccount@gmail.com“
sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'
第一个命令正确完成,但第二个命令失败,错误消息为SQL1024N数据库连接不存在。SQLSTATE=08003
请注意,我需要以php用户的身份运行此命令。命令
sudo-u db2inst1 id
asphpuser为我提供了正确的输出。sudo可以通过一个shell运行多个命令,例如:
$ sudo -s -- 'whoami; whoami'
root
root
$sudo-s--'whoami;whoami'
根
根
您的命令类似于:
sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'"
sudo-u db2inst1-s--“db2连接到ttt;db2更新联系人集电子邮件地址=”mytestaccount@gmail.com'"
如果您的sudo版本无法使用带-s的分号(显然,如果使用某些选项编译,则无法使用分号),则可以使用
sudo -- sh -c 'whoami; whoami'
sudo--sh-c'whoami;whoami'
相反,它基本上做相同的事情,但使您显式地命名shell。对于您的命令,您还可以参考以下示例:
sudo sh-c'whoami;whoami'
以上答案不允许您在引号内引用。此解决方案将:
sudo -su nobody umask 0000 \; mkdir -p "$targetdir"
umask命令和mkdir命令都与“nobody”用户一起运行。如果要处理引号:
sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
sudo-s--这个-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 -c 'whoami; whoami'
另一种选择是使用eval
,以避免使用子shell:
sudo -s eval 'whoami; whoami'
注意:使用sudo-s
的其他答案失败,因为引号被传递到bash并作为单个命令运行,因此需要使用eval去除引号。eval
更好地解释了这一点
在命令中引用也更容易:
$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;
如果命令在失败时需要停止运行,请使用双符号And而不是分号:
$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
在终端上,键入:
$ sudo bash
然后编写任意数量的命令。完成后键入exit
如果需要自动执行,请创建一个script.sh
文件并运行它:
$ sudo ./script.sh
关于一个稍微相关的主题,我想通过SSH执行相同的多命令sudo,但上述操作都不起作用
比如在Ubuntu上
$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu
诀窍是双引号的命令
$ 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的客户端外壳会剥离最外层的一组引号。但是,如果远程命令很复杂,请使用引号。在这种情况下,像Ansible这样的工具会做出更好的选择。如果您知道根密码,可以尝试
su -c "<command1> ; <command2>"
su-c”
请留下您为什么要关闭此问题的评论。谢谢。关闭投票是为了迁移到serverfault,因为这是一个系统管理问题,而不是编程问题。我发现这是一个更可靠的替代方案。您可以使用单引号和双引号并对其进行转义。好吧,那么,为什么现在不管我在c中设置了什么umaskOmand,它没有效果?这在最新的debian stable(squeeze)bash上不起作用:sudo-s--'/usr/bin/whoami;/usr/bin/whoami'/bin/bash:/usr/bin/whoami;/usr/bin/whoami:没有这样的文件或目录
@Valor您可以使用sudo--sh-c'whoami;whoami;
作为“sudo-s”时的变通方法是坏的。我也更新了答案。编辑后的版本显示“--sh-c”示例为+1。谢谢!你能解释一下为什么需要“--”?@VicSeedoubleyew--
表示sudo
的参数结束,因此其他所有参数都是命令的一部分;没有它,像-c
这样的参数可以解释为sudo
的参数。这适用于大多数(但不是所有)命令行程序。对于另一个(非sudo
)例如,要删除名为-f
的文件,您不能只运行rm-f
,对吧?!但您可以运行rm--f
删除名为-f
的文件。这是最清晰的答案,谢谢。也许可以添加注释“您不能从sudo
运行多个命令-您始终需要诱使它执行一个shell,该shell可以接受多个命令作为参数运行。”“如果您不知道根密码,请使用sudo su-c”;”
。