Bash'te su ile birden fazla komut çalıştırma


10

su -cBirden çok komut kök olarak çalıştırmak için kullanmak istiyorum . Bunun için fazladan bir komut dosyası kullanmak istemiyorum.

Aşağıdakileri denedim:

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

ama sadece lsilki değil.

Aşağıdakileri denedim:

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

ancak noktalı virgülle ilgili bir hata olduğunu söylüyor ;.

Bunu nasıl yapacağınızı biliyor musunuz?

Yanıtlar:


14

Bu komut sorunsuz çalışır:

su root -c "date; ls -lh"

Ancak bu komutta:

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

Daha &önce sahip ;olduğunuz için hata alıyorsunuz. &Komutu kaldırmayı ve yeniden çalıştırmayı deneyin .

Veya komutunuzu şu şekilde çalıştırabilirsiniz:

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

Tabii ki, OP gerçekten sürece parantez eklemek için hiçbir neden yok gerçekten gerçekten bir yazın istiyor ;arasında tcpdumpve lssadece noktalı virgül dışarıda bırakın ve işe yarayacak - komutları.
G-Man 'Eski Monica'yı Geri Getir' diyor

2

Gibi anubhava diyor sayfanı

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

komutunu &hemen izlemenize izin verilmediği için başarısız oluyor ;. Komutları doğrudan kabuğa yazarak bunu görebilirsiniz:

  • true & true  İşler
  • true & ; true çalışmıyor

İsterseniz tcpdumparka planda çalışmasına komutunu kaldırmak ;gibi

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

(ve ;sonunda da ihtiyacınız yok , ama acıtmıyor).


1

Bence nohupkomut da size ne istediğinizi alır ... tcpdump arka planda çalışan (ve işareti gerekli değildir):

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

Merhaba bence. NOHUP, bir kullanıcı bağlantıyı kestiğinde bile komutların arka planda çalışmasını sağlar. Bunu hatırlamadım. Çok teşekkürler.

(1) nohupArka planda komutlar çalıştırdığınızda kullanmak iyidir , ancak bunun gerçekten bu soru ile ilgisi yoktur. (2) Bu cevap yanlıştır - nohuptek başına bir komutun arka planda çalışmasına neden olmaz; hala yazmanız gerekiyor &(bu da bizi başladığımız yere geri getiriyor, komutta bir sözdizimi hatasıyla).
G-Man 'Eski Monica'yı Geri Al' dedi.

0

Anubhava'nın mükemmel cevabına eklemek için :

Siz de kullanabilirsiniz, {}şöyle:

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

{}()bir alt kabuk oluşturmadığından biraz daha verimlidir . Zaten sahip olmadıkça önce ve {}sonra bir alana ihtiyaç duyar .{;}&


Tabii ki, kullanıcı gerçekten sürece hiç parantez veya parantez eklemek için hiçbir neden yok gerçekten gerçekten bir yazın istiyor ;arasında tcpdumpve lskomutlar - sadece noktalı virgül dışarıda bırakın ve işe yarayacak.
G-Man

-1

&&Aşağıdaki gibi komutlarınızı ayırmak için kullanın :

$ su -c "ls && ls"

Auch ... bu benim hatam. Süreci arka planda çalıştırmak istedim ama komutları ayırmak için bu && farkında değildim. Teşekkürler

3
&&, "İkinci komutu yalnızca ilk başarılı olursa çalıştır" anlamına gelir. İlk komutunuz hata verirse, ikincisi çalışmaz. Bu genellikle iyidir, ancak && 'yi tamamen bir ayırıcı olarak tanımlamaktan çekinmeyin.
Leo

Ve tcpdumpişlemi arka planda çalıştırmak istiyorsanız , &&hiç iyi olmaz.
G-Man 'Eski Monica'yı Geri Al' dedi.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.