Ini adalah pertanyaan yang cukup sederhana, setidaknya seperti seharusnya, tentang izin sudo di Linux.
Ada banyak waktu ketika saya hanya ingin menambahkan sesuatu ke /etc/hosts
atau file yang serupa tetapi akhirnya tidak bisa karena keduanya >
dan >>
tidak diperbolehkan, bahkan dengan root.
Apakah ada cara untuk membuat pekerjaan ini tanpa harus su
atau sudo su
menjadi root?
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
akan dilakukantee -a
bukantee --append
.-a
--append
flag ( ) perintah akan menimpa seluruh file dengan string yang diberikan alih-alih menambahkannya sampai akhir.Masalahnya adalah shell tidak melakukan redirection, bukan sudo atau echo, jadi ini dilakukan sebagai pengguna reguler Anda.
Coba cuplikan kode berikut:
sumber
sh
, gema dapat menafsirkan urutan pelarian seperti\t
di dalam tanda kutip tunggal. Anda bisa menggunakannyaprintf %s 'something'
sebagai gantinya.sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
misalnya.Masalahnya adalah bahwa shell Anda yang menangani pengalihan; itu mencoba untuk membuka file dengan izin Anda bukan dari proses yang Anda jalankan di bawah sudo.
Gunakan sesuatu seperti ini, mungkin:
sumber
sudo
(karena alasan keamanan) tidak menyebarkan lingkungan ke subproses. Anda dapat menggunakansudo -E
untuk melewati batasan ini.sudo sh -c "echo 'something' >> $FILENAME"
, dengan tanda kutip ganda, ini akan berhasil - substitusi variabel dilakukan oleh kulit terluar, bukan kulit sudoed.sumber
Perbuatan
harus bekerja. Masalahnya adalah bahwa> dan >> ditangani oleh shell Anda, bukan oleh perintah "sudoed", jadi izinnya adalah izin Anda, bukan yang Anda gunakan untuk "sudoing".
sumber
Saya ingin mencatat, bagi yang penasaran, bahwa Anda juga dapat mengutip heredoc (untuk balok besar):
sumber
"
tetapi tidak menyebabkan perintah gagal.)Dalam bash Anda dapat menggunakan
tee
kombinasi dengan> /dev/null
untuk menjaga stdout tetap bersih.sumber
Menggunakan jawaban Yoo , letakkan ini di
~/.bashrc
:Sekarang kamu bisa lari
sudoe 'deb blah # blah' /etc/apt/sources.list
Edit:
Versi yang lebih lengkap yang memungkinkan Anda untuk memasukkan atau mengalihkan input dari file dan menyertakan
-a
sakelar untuk mematikan penambahan (yang diaktifkan secara default):sumber
Anda juga dapat menggunakan
sponge
darimoreutils
paket dan tidak perlu mengarahkan ulang output (yaitu, tidak adatee
suara untuk disembunyikan):sumber
Dengan menggunakan sed -i dengan $ a , Anda dapat menambahkan teks, yang berisi variabel dan karakter khusus, setelah baris terakhir.
Misalnya, menambahkan $ NEW_HOST dengan $ NEW_IP ke / etc / hosts:
Opsi sed menjelaskan:
sumber
gema 'Hello World' | (sudo tee -a /etc/apt/sources.list)
sumber
Bagaimana dengan:
echo text | sudo dd status = none of = privilegedfile
Saya ingin mengubah / proc / sys / net / ipv4 / tcp_rmem.
Saya lakukan:
sudo dd status = tidak ada = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
menghilangkan gema dengan dokumen baris tunggal
sumber
Ini bekerja untuk saya: perintah asli
Perintah kerja
sumber
tee -a
. Hanyatee
akan menimpa file!Bisakah Anda mengubah kepemilikan file kemudian mengubahnya kembali setelah digunakan
cat >>
untuk menambahkan?Sesuatu seperti ini cocok untukmu?
sumber