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?

hsribei
sumber
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
akira
sumber
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"
Ignacio Vazquez-Abrams
sumber
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)

Doug Harris
sumber
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
Nicholas Sushkin
sumber
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
pengguna316693
sumber
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
Polisi
sumber
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.

innaM
sumber
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.

kenorb
sumber