Bagaimana cara menambahkan file sebagai sudo?


271

Aku ingin melakukan:

echo "something" >> /etc/config_file

Tapi, karena hanya pengguna root yang menulis izin untuk file ini, saya tidak bisa melakukan itu. Tetapi yang berikut ini juga tidak berhasil.

sudo echo "something" >> /etc/config_file

Apakah ada cara untuk menambahkan file dalam situasi itu tanpa harus membukanya terlebih dahulu dengan sudoeditor dan kemudian menambahkan konten baru dengan tangan?


Saya menggunakan Ubuntu 9.04 dan saya bisa menggunakan sudo untuk setiap perintah yang saya butuhkan sejauh ini. Memunculkan sub-shell berhasil.
Matt Norris

Jawaban:


391

Gunakan tee -a(atau tee --append) dengansudo

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

Jadi perintahmu menjadi

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

Keuntungan dari teemengeksekusi Bash dengan izin administratif adalah

  • Anda tidak mengeksekusi Bash dengan izin administratif
  • Hanya bagian 'tulis ke file' yang berjalan dengan izin tingkat lanjut
  • Mengutip perintah kompleks jauh lebih mudah

2
Pada OS X tee sepertinya hanya memiliki flag -a.
Lri

Debian 8 teememiliki -abendera tambahan.
clay

9
Gunakan echo "output" | sudo tee -a file > /dev/nulljika Anda ingin melewatkan output konsol.
Moshe Bixenshpaner

Berfungsi dengan baik untuk WSL juga.
kayleeFrye_onDeck

50

Pengalihan dijalankan di shell saat ini. Untuk melakukan pengalihan dengan privilege yang ditinggikan, Anda harus menjalankan shell itu sendiri dengan privilege yang ditinggikan:

sudo bash -c "somecommand >> somefile"

26

Minta sudo membuat sub-shell:

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

Dalam contoh ini, sudo menjalankan "sh" dengan sisanya sebagai argumen.

(ini ditampilkan sebagai contoh di halaman sudo man)


8
Alasannya adalah bahwa shell Anda (berjalan seperti Anda) yang melakukan pengalihan, bukan sudo. Karena Anda tidak memiliki izin untuk menulis ke file, Anda mendapatkan galat Izin ditolak. Apa jawaban ini adalah untuk memulai shell baru yang berjalan sebagai root, dan karena itu mampu menulis ke file.
Randy Orrison

Ini bukan jawaban yang tepat. Ini jawaban yang tepat. Akira punya yang lebih baik, karena logika yang disediakan dalam jawaban itu.
TOOGAM

6

Saya biasanya menggunakan dokumen shell DI SINI dengan sudo tee -a . Sesuatu di sepanjang garis:

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

Menurut pendapat saya, yang terbaik dalam hal ini adalah dd:

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

3

Mungkin ada masalah dengan sudo di sini dan pengarahan ulang. Gunakan tekseditor pilihan Anda sebagai gantinya untuk menambahkan baris.

sudo nano /etc/profile

Atau, Anda bisa mencoba su sebagai gantinya

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

Sayangnya, ini menghasilkan hasil yang sama.
Matt Norris

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'harus bekerja. karena tidak ada shell yang dapat berkembang secara keliru dalam arg untuk echo, kutip-tunggal perintah keseluruhan.
quack quixote

Itu luar biasa. Sekarang lakukan ini sebagai bagian dari naskah.
Ernie Dunbar

0

Ini tidak akan berhasil jika Anda mencoba mengarahkan (menggunakan >>) output sudo. Apa yang benar-benar ingin Anda lakukan adalah mengarahkan ulang output dari echo. Saya sarankan Anda cukup menggunakan editor favorit Anda dan menambahkan baris itu secara manual /etc/profile. Ini memiliki manfaat tambahan yang dapat Anda periksa apakah /etc/profilesudah disetel JAVA_HOME.


0

Gunakan ex -way:

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

dan ganti FOOdengan variabel Anda untuk ditambahkan.

Di beberapa sistem (seperti OS X), /etc/profilefile memiliki 444 izin, jadi jika Anda masih mendapatkan izin , periksa dan perbaiki izin terlebih dahulu:

sudo chmod 644 /etc/profile

lalu coba lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.