在Bash中使用su运行多个命令


10

我想用su -c根命令同时运行多个命令。我不想为此使用额外的脚本。

我尝试了以下方法:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"

但它只执行ls第一个。

我尝试了以下方法:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

但它说分号有误;

你知道怎么做吗?

Answers:


14

此命令运行良好:

su root -c "date; ls -lh"

但是在此命令中:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

由于您&之前有过,;因此您会遇到错误。尝试删除&并重新执行命令。

或者,您可以像这样运行命令:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"

当然,没有理由加括号除非OP真的真的真的想键入;之间tcpdumpls命令-只要离开了分号,它会工作。
G-Man说'恢复莫妮卡'

2

正如anubhava所说

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

命令失败,因为不允许您&紧跟在 之后;。您可以通过直接在外壳中键入命令来查看此信息:

  • true & true  作品
  • true & ; true 不起作用

如果您希望tcpdump命令在后台运行,请删除;,如

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ls -lh;"

(并且您也不需要;结尾处的,但这也不会造成伤害)。


1

我认为该nohup命令也将为您提供所需的信息... tcpdump在后台运行(无需使用“&”号):

su root -c "nohup tcpdump -i wlan0 -s 1500 -w CCCCCC ; ls -lh"

嗨,我是这样认为的。即使用户断开连接,NOHUP也会使命令在后台运行。我不记得了。非常感谢。

(1)nohup在后台运行命令时最好使用,但这确实与这个问题无关。(2)这个答案是错误的- nohup本身不会导致命令在后台运行;您仍然必须键入&(这使我们回到了开始的位置,但命令中出现语法错误)。
G-Man说'恢复莫妮卡'

0

只是为了补充Anubhava的出色答案

您也可以这样使用{}

su root -c "{ tcpdump -i wlan0 -s 1500 -w CCCCCC & }; ls -lh"

{}()它比不创建子外壳要有效得多。{}确实需要经过空间{;之前}除非我们有一个&已经。


当然,我们没有理由在所有加括号或小括号,除非用户真的真的真的想键入;之间tcpdumpls命令-只要离开了分号,它会工作。
G-Man说'Resstate Monica''Feb

-1

使用&&来分隔命令,如下所示:

$ su -c "ls && ls"

嗯..那是我的错误。我想在后台运行该进程,但是我不知道用&&分隔命令。Thx

3
&&表示“如果第一个成功,则仅执行第二个命令”。如果您的第一个命令出错,则第二个命令将不会运行。通常这很好,但是我会毫不犹豫地将&&描述为一个分隔符。
狮子座

而且,如果您想tcpdump在后台运行该进程,&&那么您也没有任何好处。
G-Man说'恢复莫妮卡'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.