Sudo olarak bir dosyaya nasıl eklenir?


271

Ben yapmak istiyorum:

echo "something" >> /etc/config_file

Ancak, yalnızca kök kullanıcı bu dosyaya yazma iznine sahip olduğundan, bunu yapamam. Ancak aşağıdakiler de çalışmıyor.

sudo echo "something" >> /etc/config_file

Bu durumda bir dosyayı önce sudo'd' düzenleyicisiyle açmadan ve ardından yeni içeriği el ile eklemeden bir dosyaya eklemenin bir yolu var mı ?


Ubuntu 9.04 kullanıyorum ve şu ana dek ihtiyaç duyduğum her komut için sudo kullanabiliyorum. Bir alt kabuk yumurtlama işe yaradı.
Matt Norris,

Yanıtlar:


391

Kullanın tee -a(veya tee --append) ilesudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

Böylece emriniz olur

echo "something" | sudo tee -a /etc/config_file

teeBash'in idari izinlerle yerine getirilmesinin avantajları :

  • Bash'i yönetici izinleriyle çalıştırmıyorsunuz
  • Yalnızca 'dosyaya yaz' bölümü gelişmiş izinlerle çalışır
  • Karmaşık bir komuttan alıntı yapmak çok daha kolaydır

2
OS X’te sadece tee bir bayrak işaretine sahip.
Lri

Debian 8 teesahiptir -aekleme bayrağı.
Kil

9
echo "output" | sudo tee -a file > /dev/nullKonsol çıktısını atlamak istiyorsanız kullanın .
Moshe Bixenshpaner

WSL için de iyi çalışıyor.
kayleeFrye_onDeck

50

Yönlendirme mevcut kabukta yürütülür. Yeniden yönlendirmeyi yükseltilmiş ayrıcalıklarla yapmak için, kabuğun kendisini yükseltilmiş ayrıcalıklarla çalıştırmalısınız:

sudo bash -c "somecommand >> somefile"

26

Sudo'nun bir alt kabuk üretmesini sağlayın:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

Bu örnekte, sudo gerisi ile argüman olarak "sh" ile çalışır.

(bu sudo man sayfasında bir örnek olarak gösterilmiştir)


8
Sebebi sudo değil, yönlendirme yapan kabuğun (senin gibi çalışan) olmasıdır. Dosyaya yazma izniniz olmadığından, İzin Verilmeyen hatayla karşılaşırsınız. Bu cevabın yaptığı şey root olarak çalışan ve dolayısıyla dosyaya yazabilen yeni bir kabuk başlatmak.
Randy Orrison

Bu doğru cevap değil. Bu doğru bir cevap. Akira, bu cevabın sağladığı mantık için daha iyisini yaptı.
TOOGAM

6

Sudo tee -a ile genellikle HERE HERE belgesini kullanırım . Çizgileri boyunca bir şey:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4

Bence bu durumda en iyisi dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

Burada sudo ve yönlendirme ile ilgili bir sorun olabilir. Satır eklemek yerine, seçtiğiniz bir texteditor kullanın.

sudo nano /etc/profile

Veya yerine su deneyebilirsiniz

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

Ne yazık ki, bu aynı sonucu verdi.
Matt Norris,

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'çalışmalı. kabuk argümanda yankılanacak şekilde genişleyebileceği bir şey olmadığı için genel komuttan tek alıntı yapın.
quack quixote

Bu harika. Şimdi bunu bir betiğin parçası olarak yapın.
Ernie Dunbar

0

Bu >>sudo çıkışını yönlendirmeye (kullanmaya ) çalıştığınız işe yaramaz . Gerçekten yapmak istediğiniz şey çıktısını yönlendirmektir echo. En sevdiğiniz düzenleyiciyi kullanmanızı ve bu satırı manuel olarak eklemenizi öneririm /etc/profile. Bu, /etc/profileönceden ayarlanmış olup olmadığını kontrol edebileceğiniz ek bir avantaja sahiptir JAVA_HOME.


0

Eski yolu kullan :

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

ve FOOeklemek için değişkenle değiştirin .

Bazı sistemlerde (OS X gibi), /etc/profiledosyada 444 izin vardır, bu nedenle hala izin verilmediyse , önce iznini kontrol edip düzeltin:

sudo chmod 644 /etc/profile

sonra tekrar dene.

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.