如何在sudo中运行两个命令?

Rad*_*dek 146 bash sudo

有什么办法可以从命令行运行两个Db2命令吗?(它们将从PHP exec命令调用.)

  1. db2 connect to ttt (请注意,我们需要为第二个命令实时连接
  2. 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'
Run Code Online (Sandbox Code Playgroud)

第一个命令正确完成但第二个命令失败并显示错误消息 SQL1024N A database connection does not exist. SQLSTATE=08003

请注意,我需要以php用户身份运行它.sudo -u db2inst1 id作为php用户的命令给了我正确的输出.

Jas*_*son 168

对于您的命令,您还可以参考以下示例:

sudo sh -c "whoami; whoami"

  • 我发现这是一个更可靠的选择. (14认同)
  • 还有一个:" - - - "对我来说不起作用,但这个方法确实如此. (10认同)

wjl*_*wjl 149

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.

  • 这不适用于最新的debian stable(squeeze)bash:`sudo -s - '/ usr/bin/whoami;/usr/bin/whoami'/ bin/bash:/ usr/bin/whoami;/usr/bin/whoami:没有这样的文件或目录` (12认同)
  • @Valor你可以使用`sudo - sh -c'whoami; whoami;`作为"sudo -s"被打破时的解决方法.我也更新了答案. (11认同)
  • 编辑版本的+1表示" - sh -c"示例.谢谢! (6认同)
  • @VicSeedoubleyew`--`表示`sudo`的参数结束,所以其他一切都是命令的一部分; 没有它,像`-c`这样的参数可以解释为`sudo`的参数.这适用于大多数(但不是全部)命令行程序.对于另一个(非``sudo`)示例,要删除一个名为`-f`的文件,你不能只运行`rm -f`,对吧?!但是你可以运行`rm - -f`删除名为`-f`的文件. (6认同)
  • 你能解释一下你为什么需要" - "吗? (4认同)
  • 它给了我`/ bin/bash:db2:command not found/bin/bash:db2:command not found`如果以php用户身份运行 (2认同)
  • 这个答案缺少一些解释(尽管其他解释更糟),特别是关于`--`(解释隐藏在评论中),以及`sh` 不是`sudo` 选项的事实。这可能看起来很明显,但评论证明它并不适合所有人。@wjl,请考虑更新您的答案。 (2认同)

Sam*_*ani 42

我经常这样做:

sudo bash -c 'whoami; whoami'
Run Code Online (Sandbox Code Playgroud)


小智 40

如果您想处理报价:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
Run Code Online (Sandbox Code Playgroud)

  • 这是最干净的答案,谢谢.也许添加一个注释"你不能从`sudo`运行多个命令 - 你总是需要欺骗它来执行一个shell,它可以接受多个命令作为参数运行" (4认同)

Cas*_*Cas 8

使用eval避免使用子shell 的替代方法:

sudo -s eval 'whoami; whoami'
Run Code Online (Sandbox Code Playgroud)

注意:其他答案使用sudo -s失败,因为引号被传递给bash并作为单个命令运行,因此需要使用eval去除引号.eval更好的解释是这个SO答案

在命令中引用也更容易:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;
Run Code Online (Sandbox Code Playgroud)

如果一个命令失败,如果命令需要停止运行,请使用双括号而不是分号:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
Run Code Online (Sandbox Code Playgroud)