sudo'da iki komut nasıl çalıştırılır?


152

Bir komut satırından iki Db2 komutunu çalıştırabilmemin bir yolu var mı? (Bir PHP execkomutundan çağrılırlar .)

  1. db2 connect to ttt (ikinci komut için bağlantının canlı olması gerektiğini unutmayın
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

Bunu denedim:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

İlk komut doğru şekilde bitiyor ancak ikincisi hata mesajıyla başarısız oluyor SQL1024N A database connection does not exist. SQLSTATE=08003

Bu php kullanıcı olarak çalıştırmak gerektiğini unutmayın. Php kullanıcısı sudo -u db2inst1 idolarak komut bana doğru çıktı verir.


lütfen bu soruyu neden kapatmak istediğinize bir yorum bırakın. Teşekkür ederim.
Radek

1
Yakın oylama sunucu hatasına geçiş içindir, çünkü bu programlama değil sistem yönetimi sorusudur.
bdonlan

Yanıtlar:


157

sudo bir kabuk üzerinden birden fazla komut çalıştırabilir, örneğin:

$ sudo -s - 'whoami; ben kimim'
kök
kök

Komutunuz şöyle bir şey olurdu:

sudo -u db2inst1 -s - "db2 ttt'ye bağlan; db2 GÜNCELLEME İLETİŞİM SETİ EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

Sudo sürümünüz -s içeren noktalı virgüllerle çalışmıyorsa (görünüşe göre, belirli seçeneklerle derlenmişse işe yaramaz),

sudo - sh -c 'whoami; ben kimim'

bunun yerine, temelde aynı şeyi yapar ancak kabuğu açıkça adlandırır.


12
Bu son debian kararlı (sıkmak) bash üzerinde çalışmaz:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Valor

11
@Valor sudo -- sh -c 'whoami; whoami;, "sudo -s" bozulduğunda geçici bir çözüm olarak kullanabilirsiniz . Cevabı da güncelledim.
wjl

6
"- sh -c" örneğini gösteren düzenlenmiş sürüm için +1. Teşekkürler!
JD.

4
Neden "-" ihtiyacınız olduğunu açıklar mısınız?
Vic Seedoubleyew

7
@VicSeedoubleyew Bu --, parametrelerin sonunu gösterir sudo, bu nedenle diğer her şey komutun bir parçasıdır; onsuz, gibi argümanlar-c argümanlar bir argüman olarak yorumlanabilir sudo. Bu, çoğu (ancak hepsi değil) komut satırı programı için geçerlidir. Başka ( sudoörnek olmayan ) bir örnek olarak, adlı dosyayı kaldırmak -fsadece çalışamaz rm -f, değil mi ?! Ancak rm -- -fadlı dosyayı silmek için çalıştırabilirsiniz -f.
wjl

176

Komutunuz için aşağıdaki örneğe de başvurabilirsiniz:

sudo sh -c 'whoami; whoami'


14
Bunu daha güvenilir bir alternatif olarak buldum.
Nick


42

Alıntılarla ilgilenmek istiyorsanız:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

4
Buradaki en temiz cevap, teşekkürler. Belki bir not ekleyin "Birden fazla komut çalıştıramazsınız sudo- her zaman parametre olarak çalışmak için birden fazla komut kabul edebilen bir kabuk yürütmek için kandırmanız gerekir"
trs

8

evalAlt kabuğun kullanımından kaçınarak kullanan bir alternatif :

sudo -s eval 'whoami; whoami'

Not: sudo -sTırnaklar bash'a iletildiğinden ve tek bir komut olarak çalıştırıldığından, diğer yanıtlar başarısız olur, bu nedenle eval ile tırnak işaretlemeniz gerekir. evaldaha iyi açıklanmıştır bu SO cevap

Komutlar içinde alıntı yapmak da daha kolaydır:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

Ve eğer başarısız olursa komutların çalışmayı durdurması gerekiyorsa, noktalı virgül yerine çift ve işareti kullanın:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

3

-sSeçenek benim için işe yaramadı -iyaptı.

Günlük boyutumu bash'ımdan nasıl güncelleyebileceğime bir örnek:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'

1

Terminalde şunu yazın:

$ sudo bash

Sonra istediğiniz kadar komut yazın. İşiniz exitbittiğinde yazın.

Otomatikleştirmeniz gerekiyorsa, bir script.shdosya oluşturun ve çalıştırın:

$ sudo ./script.sh

1

Biraz ilgili bir konuda, SSH aracılığıyla aynı çok komutlu sudo yapmak istedim, ancak yukarıdakilerin hiçbiri işe yaramadı.

Örneğin Ubuntu'da,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

Burada keşfedilen hile komutu iki kez alıntılamaktır.

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

Aynı zamanda çalışan diğer seçenekler:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

Prensip olarak, çift tırnak gereklidir çünkü bence SSH'nin çalıştığı istemci kabuğu en dıştaki tırnak setini kaldırır. Alıntıları ihtiyaçlarınıza göre karıştırın ve eşleştirin (örneğin değişkenlerin aktarılması gerekir) Ancak YMMV tırnak işareti özellikle uzak komutlar karmaşıksa. Bu durumda, Ansible gibi bir araç daha iyi bir seçim yapacaktır.


1

Kök parolasını biliyorsanız, deneyebilirsiniz

su -c "<command1> ; <command2>"  

Kök şifresini bilmiyorsanız, tuşunu kullanın sudo su -c "<command1> ; <command2>" .
Dag Høidahl

0

Yukarıdaki yanıtlar tırnak içinde alıntı yapmanıza izin vermez. Bu çözüm:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

Hem umask komutu hem de mkdir-komutu 'kimse' kullanıcısıyla birlikte çalışır.


Tek ve çift tırnakları kullanabilir ve bunlardan kaçabilirsiniz.
Radek

Peki, nasıl olur da, şimdi bu komutta umask'ı neye ayarladığım önemli değil, hiçbir etkisi yok?
Michael
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.