Sudo ile yönlendirme veya borulama içeren bir komut nasıl çalıştırılır?


60

Kök hesap yerine sudo kullanmanın en iyi yöntemleri olduğunu varsaydığım şeyi izlemeye çalışıyorum.

Gibi basit bir concat dosyası işlemi çalıştırıyorum:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Bu normal kullanıcı olarak çalıştığı ">>" nin sağında başarısız olur. Ekstra sudos eklemek de başarısız olur (dosyaya değil sudo komutuna yönelttiğinden beri beklenen davranış).

Örnek sadece bu, ancak kök hesap altında doğrulandı ve test edildi.

Yanıtlar:


75

Yeni bir kabuğu kök olarak çağırabilirsiniz:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Dosyaya yazmak için bir işlemi de yükseltebilirsiniz:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
Genelde, ikinci seçenek daha güvenlidir, çünkü sadece teekomutlar root olarak çalışır, ana komut değil, karmaşık ve hatalı davranışa eğilimli olabilir. (değil echo)
pabouk

19

Eşit derecede güvenli olan bir diğer seçenek, root olarak oturum açmak için sudos -ianahtarını kullanmaktır :

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Bu, hala en iyi uygulama kurallarını izler çünkü kök hesap aslında bu şekilde etkinleştirilmez, ancak kök olarak güvenli bir şekilde işlem yapmanızı sağlar. Kimden man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

Başka bir alternatif isesudo bash
starbeamrainbowlabs 17:15

11

Komutunuzu tek tırnak işaretleri olmadan ifade ederseniz, tek tırnak işaretleri içine koyabilir ve bunu bir ara kabuk aracılığıyla çalıştırabilirsiniz.

Bunu root olarak yürütmek için:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Komutu kullanmayan farklı bir yolla yazın ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Sonra çağırmak sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Alternatif olarak, çıktıyı yalnızca root'un yazabileceği bir dosyaya yazmak için call sudo tee. Geçiş -aseçeneğini teehedef dosyaya eklenecek, aksi takdirde dosya kesilir.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Daha karmaşık dosya değişiklikler için, Arayabileceğin sudo sed, sudo ed, sudo perl, ...

Alternatif olarak, iyi bir editör kullanın ve onu sudo çağırın. Emacs'ta açın /sudo:/etc/conf.d/hwclock. Vim'de:w !sudo tee % , açılan dosyaya root olarak yazmak için çağrı yapın veya sudo.vim eklentisini kullanın . Veya sudo sonundan git ve ara sudoedit /etc/conf.d/hwclock.

Ya da karanlık tarafa geçip bir kabuğu kök olarak çalıştırabilirsiniz.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

Komut, yönlendirilen dosyadaki izinler nedeniyle başarısız oluyor. Yeniden yönlendirme, sudokomut çağrılmadan önce bile gerçekleşir .

Dosyayı gerçekten yazmak için açan kök olduğundan emin olmanız gerekir.

Bunu yapmanın en basit yolu:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Bu echo, yalnızca bir metin dizesi ürettiği için, sıradan bir kullanıcı olarak çalıştırılabilir. Yardımcı teeprogram olsa da root olarak çalışacak ve tee -averi ekleyecektir. Biz çıktısını yönlendirmek /dev/nullçünkü teevarsayılan olarak, belirtilen dosyalara yazmak ek olarak standart çıkışa onun giriş verileri çoğaltmak olacaktır.

bash"Here-string" i anlayan ya da herhangi bir mermi ile :

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Bu, yukarıdakilerle aynıdır. Sadece dizgiyi üretme biçimimiz değişti.


Başka, biraz dolambaçlı bir şekilde yapmanın yolu:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Burada, yeniden yönlendirme sh -c, kök olarak çalışan bir alt kabuğun içinde gerçekleşir .


4

sudo dd of=

İstediğiniz kadar eklemek için:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

veya dosyayı sıfırdan yeniden oluşturmak için:

echo inbytes | sudo dd of=outfile

Avantajları:

  • yönlendirme teeyok beri daha güzel/dev/null
  • shhiçbir denizaltıdan daha güzel
  • ddörneğin status=progresstransferin ilerlemesini görmek için birçok güçlü seçeneğe sahiptir

Sudo komutunu stdinine ilettiği için çalışıyor.

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.