Chạy nhiều lệnh với su trong Bash


10

Tôi muốn sử dụng su -cđể chạy như nhiều lệnh gốc hoàn toàn. Tôi không muốn sử dụng một kịch bản bổ sung cho việc này.

Tôi đã thử như sau:

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

nhưng nó chỉ thực hiện lscái đầu tiên

Tôi đã thử như sau:

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

nhưng nó nói rằng có một lỗi với dấu chấm phẩy ;.

Bạn có biết làm thế nào để làm điều đó?

Câu trả lời:


14

Lệnh này chạy tốt:

su root -c "date; ls -lh"

Nhưng trong lệnh này:

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

Vì bạn có &trước ;nên bạn đang nhận được lỗi. Hãy thử loại bỏ &và thực hiện lại lệnh.

Hoặc bạn có thể chạy lệnh của bạn như thế này:

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

Tất nhiên, không có lý do để thêm dấu ngoặc đơn trừ khi OP thực sự thực sự muốn gõ một dấu ;giữa tcpdumplscác lệnh - chỉ cần bỏ dấu chấm phẩy và nó sẽ hoạt động.
G-Man nói 'Phục hồi Monica'

2

Như anubhava nói , của bạn

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

lệnh không thành công vì bạn không được phép thực hiện &theo ngay lập tức ;. Bạn có thể thấy điều này chỉ bằng cách gõ các lệnh trực tiếp vào shell:

  • true & true  làm
  • true & ; true không làm việc

Nếu bạn muốn tcpdumplệnh chạy trong nền, hãy xóa ;, như trong

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

(và bạn cũng không cần ;đến cuối cùng, nhưng điều đó không gây hại gì).


1

Tôi nghĩ rằng nohuplệnh sẽ giúp bạn có được những gì bạn muốn ... tcpdump đang chạy trong nền (không cần ampersand):

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

Xin chào tôi nghĩ vậy. NOHUP để các lệnh chạy trong nền ngay cả khi người dùng ngắt kết nối. Tôi đã không nhớ điều đó. Cảm ơn rất nhiều.

(1) Rất tốt để sử dụng nohupkhi bạn chạy các lệnh trong nền, nhưng điều đó thực sự không liên quan gì đến câu hỏi này. (2) Câu trả lời này là sai - nohupbản thân nó không gây ra lệnh chạy trong nền; bạn vẫn phải gõ &(khiến chúng tôi quay lại nơi chúng tôi đã bắt đầu, với một lỗi cú pháp trong lệnh).
G-Man nói 'Phục hồi Monica'

0

Chỉ để thêm vào câu trả lời tuyệt vời của Anubhava :

Bạn cũng có thể sử dụng {}, như thế này:

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

{}hiệu quả hơn một chút so với ()việc nó không tạo ra một lớp vỏ phụ. {}không cần một không gian sau {;trước }trừ khi chúng ta đã có &.


Tất nhiên, không có lý do nào để thêm dấu ngoặc hoặc dấu ngoặc đơn trừ khi người dùng thực sự thực sự thực sự muốn gõ một dấu ;giữa tcpdumplscác lệnh - chỉ cần bỏ dấu chấm phẩy và nó sẽ hoạt động.
G-Man nói 'Phục hồi Monica'

-1

Sử dụng &&để phân tách các lệnh của bạn như vậy:

$ su -c "ls && ls"

Auch .. đó là lỗi của tôi. Tôi muốn chạy tiến trình ở chế độ nền nhưng tôi không biết điều này && để tách các lệnh. Thx

3
&& có nghĩa là "Chỉ thực hiện lệnh thứ hai nếu lệnh đầu tiên thành công". Nếu lệnh đầu tiên của bạn bị lỗi, lệnh thứ hai sẽ không chạy. Điều này thường tốt, nhưng tôi sẽ ngần ngại mô tả && hoàn toàn là một dấu phân cách.
Leo

Và, nếu bạn muốn chạy tcpdumptiến trình trong nền, &&bạn không có gì hay.
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.