Запуск декількох команд з 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"

Звичайно, немає ніяких причин додавати круглі дужки, якщо ОП дійсно дуже не хоче вводити ;між командами 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;"

;в кінці вам теж не потрібен , але це не зашкодить).


1

Я думаю, що nohupкоманда отримає тобі і те, що ти хочеш ...

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"

{}трохи ефективніше, ніж ()у тому, що він не створює підзагін. {}Вам потрібен пробіл після {і ;до, }якщо у нас &вже немає.


Звичайно, немає ніяких причин , щоб додати фігурні дужки або дужки взагалі , якщо користувач дійсно на самому ділі дійсно не хоче , щоб надрукувати ;між tcpdumpі lsкомандами - просто залишити з точки з коми , і він буде працювати.
G-Man каже: "Відновіть Моніку"

-1

Використовуйте &&для розділення ваших команд так:

$ su -c "ls && ls"

Ах..це моя помилка. Я хотів запустити процес у фоновому режимі, але мені не було відомо про це &&, щоб розділити команди. Thx

3
&& означає "Виконати другу команду лише в тому випадку, коли перша вдалася". Якщо ваша перша команда помилиться, друга не запуститься. Зазвичай це добре, але я б не вагаючись описав && як суто роздільник.
Лев

І якщо ви хочете запустити tcpdumpпроцес у фоновому режимі, &&вам нічого хорошого.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.