Menjalankan banyak perintah dengan su di Bash

10

Saya ingin menggunakan su -cuntuk menjalankan sebagai root beberapa perintah sekaligus. Saya tidak ingin menggunakan skrip tambahan untuk ini.

Saya mencoba yang berikut ini:

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

tetapi hanya mengeksekusi lsbukan yang pertama.

Saya mencoba yang berikut ini:

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

tetapi dikatakan bahwa ada kesalahan dengan titik koma ;.

Apakah Anda tahu bagaimana melakukan hal itu?

Abruzzo Forte e Gentile
sumber

Jawaban:

14

Perintah ini berjalan dengan baik:

su root -c "date; ls -lh"

Tetapi dalam perintah ini:

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

Karena Anda memiliki &sebelum ;itu, Anda mendapatkan kesalahan. Coba hapus &dan jalankan kembali perintah.

Atau Anda dapat menjalankan perintah Anda seperti ini:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"
anubhava
sumber
Tentu saja, tidak ada alasan untuk menambahkan tanda kurung kecuali OP benar- benar benar- benar benar - benar ingin mengetik ;antara tcpdumpdan lsperintah - tinggalkan saja tanda koma dan itu akan berfungsi.
G-Man Mengatakan 'Reinstate Monica'
2

Seperti kata anubhava , milikmu

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

perintah gagal karena Anda tidak diizinkan untuk &segera diikuti oleh ;. Anda dapat melihat ini hanya dengan mengetikkan perintah langsung ke shell:

  • true & true  bekerja
  • true & ; true tidak bekerja

Jika Anda ingin tcpdumpperintah dijalankan di latar belakang, hapus ;, seperti pada

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

(dan Anda tidak perlu ;pada akhirnya, juga, tetapi tidak sakit).

G-Man Mengatakan 'Reinstate Monica'
sumber
1

Saya pikir nohupperintah itu akan memberi Anda apa yang Anda inginkan juga ... tcpdump berjalan di latar belakang (tidak diperlukan ampersand):

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

sumber
Hai, saya kira begitu. NOHUP membuat perintah berjalan di latar belakang bahkan ketika pengguna memutuskan sambungan. Saya tidak ingat itu. Terima kasih banyak.
(1) Baik untuk digunakan nohupketika Anda menjalankan perintah di latar belakang, tetapi itu benar-benar tidak ada hubungannya dengan pertanyaan ini. (2) Jawaban ini salah - nohupdengan sendirinya tidak menyebabkan perintah dijalankan di latar belakang; Anda masih harus mengetik &(yang membuat kami kembali ke tempat kami mulai, dengan kesalahan sintaks pada perintah).
G-Man Mengatakan 'Reinstate Monica'
0

Hanya untuk menambah jawaban Anubhava yang sangat baik :

Anda dapat menggunakan {}juga, seperti ini:

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

{}sedikit lebih efisien daripada ()tidak membuat sub shell. {}memang membutuhkan ruang setelah {dan ;sebelum }kecuali kita &sudah punya.

codeforester
sumber
Tentu saja, tidak ada alasan untuk menambahkan kurung kurung atau kurung sama sekali kecuali jika pengguna benar - benar benar- benar ingin mengetik ;antara tcpdumpdan lsperintah - tinggalkan saja tanda koma dan itu akan bekerja.
G-Man Mengatakan 'Reinstate Monica'
-1

Gunakan &&untuk memisahkan perintah Anda seperti:

$ su -c "ls && ls"

sumber
Auch..that itu salah saya. Saya ingin menjalankan proses di latar belakang tetapi saya tidak mengetahui ini && untuk memisahkan perintah. Thx
3
&& berarti "Hanya jalankan perintah kedua jika yang pertama berhasil". Jika perintah pertama Anda salah, perintah kedua tidak akan berjalan. Ini biasanya baik, tetapi saya akan ragu untuk menggambarkan && sebagai pemisah murni.
Leo
Dan, jika Anda ingin menjalankan tcpdumpproses di latar belakang, &&apakah Anda tidak baik sama sekali.
G-Man Mengatakan 'Reinstate Monica'