Запуск нескольких команд с помощью su в Bash

10

Я хотел бы использовать su -cдля запуска в качестве root несколько команд в целом. Я не хочу использовать дополнительный сценарий для этого.

Я попробовал следующее:

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;"

но это говорит о том, что есть ошибка с точкой с запятой ;.

Ты знаешь как это сделать?

Абруццо Форте и Джентиле
источник

Ответы:

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 действительно действительно действительно не хочет , чтобы напечатать ;между tcpdumpи lsкомандами - просто оставить вне и точки с запятой он будет работать.
G-Man говорит: «Восстановите Монику»
2

Как говорит Анубхава , ваш

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;"

(и вам не нужно ;в конце, но это не больно).

G-Man говорит: «Восстанови Монику»
источник
1

Я думаю, что nohupкоманда тоже даст вам то, что вы хотите ... tcpdump работает в фоновом режиме (без амперсанда):

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

источник
Привет, я так думаю. NOHUP оставляет команды запущенными в фоновом режиме, даже когда пользователь отключается. Я этого не помнил. Большое спасибо.
(1) Это хорошо использовать, nohupкогда вы запускаете команды в фоновом режиме, но это действительно не имеет никакого отношения к этому вопросу. (2) Этот ответ неверен - nohupсам по себе не запускает команду в фоновом режиме; вам все равно придется печатать &(что оставляет нас там, где мы начали, с синтаксической ошибкой в ​​команде).
G-Man говорит: «Восстановите Монику»
0

Просто добавлю к превосходному ответу Анубхавы :

Вы также можете использовать {}, как это:

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

{}немного эффективнее, чем ()в том, что он не создает вложенную оболочку. {}действительно нужно пробел после {и ;до, }если у нас &уже нет.

codeforester
источник
Конечно, нет никаких причин , чтобы добавить фигурные скобки или скобки вообще , если пользователь действительно на самом деле действительно не хочет , чтобы напечатать ;между tcpdumpи lsкомандами - просто оставить из точки с запятой , и он будет работать.
G-Man говорит: «Восстановите Монику»
-1

Используйте &&для разделения ваших команд следующим образом:

$ su -c "ls && ls"

источник
Ой .. это моя ошибка. Я хотел запустить процесс в фоновом режиме, но я не знал об этом && для разделения команд. Спасибо
3
&& означает «Выполняйте вторую команду, только если первая была успешной». Если ваша первая команда выдает ошибку, вторая не запустится. Обычно это хорошо, но я бы не стал описывать && как чисто разделитель.
Лев
И, если вы хотите запустить tcpdumpпроцесс в фоновом режиме, &&ничего хорошего не получится.
G-Man говорит: «Восстановите Монику»