Saat menggunakan sudo untuk memungkinkan pengeditan ke file, saya secara teratur mendapatkan 'izin ditolak'.
Misalnya, mouse saya gelisah dan lamban, jadi saya ingin menonaktifkan polling:
sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf
Saya diminta kata sandi, dan kemudian mendapatkan:
bash: /etc/modprobe.d/local.conf: Permission denied
Jadi saya mencoba melakukan perubahan sementara untuk menonaktifkan polling dengan menggunakan:
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
Sekali lagi sistem merespons dengan:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
Ada ide?
command-line
bash
sudo
Mendongkrak
sumber
sumber
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
sebagai sudo, kecuali jika Anda melakukan sesuatu sepertisudo bash -c 'echo …'
; Namun, sistem POSIX biasanya menyediakanecho
perintah eksternal seperti/bin/echo
pada OS X, yang dapat dijalankan sudo tanpa kesulitan. Dengan demikian,echo
perintah yang biasanya Anda jalankan danecho
perintah yang Anda jalankan dengan sudo mungkin adalah dua perintah yang berbeda, tetapi serupa.Pengalihan output dilakukan oleh shell dari mana perintah telah dipanggil . Jadi, memecah semuanya menjadi bit, di sini apa yang terjadi *:
shell invokes
sudo echo "options drm_kms_helper poll=N"
, yang mengeksekusisudo
perintah denganecho "options drm_kms_helper poll=N"
command linesudo meminta kata sandi, membuka shell superuser dan memanggil
echo "options drm_kms_helper poll=N"
, yang menjalankanecho
perintah yang melewatinya"options drm_kms_helper poll=N"
gema, berjalan dengan
root
hak istimewa, mencetak string ke output standarnya.echo
perintah berakhir, shell pengguna super keluar,sudo
berakhirshell dari mana perintah telah dipanggil mengumpulkan output dan mencoba mengarahkannya
/etc/modprobe.d/local.conf
, yang hanya dapat ditulisi oleh root. Itu mendapat kesalahan "izin ditolak".Untuk cara memperbaikinya lihat jawaban @shantanu.
(*) - sementara urutan di atas membantu untuk memahami mengapa perintah gagal, pada kenyataannya hal-hal terjadi agak rusak: shell asli memperhatikan pengalihan dan mencoba membuka file untuk menulis sebelum menjalankan
sudo ...
perintah. Ketika membuka file gagal, shell bahkan tidak memanggil perintah yang seharusnya menulis ke file (terima kasih kepada @PanosRontogiannis untuk menunjukkan ini).Inilah tes cepat:
Dalam tes di atas
whoami | tee who.txt
akan membuat file bernamawho.txt
mengandung kata "root". Namun, ketika pengalihan output gagal dalam shell panggilan, file "who.txt" juga hilang karena perintah itu tidak dipanggil.sumber
Menambahkan ke jawaban Shantanu:
... Atau Anda dapat menggunakan
tee
perintah seperti ini:atau jika itu output perintah:
sumber
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
jika Anda tidak ingin mencetakstdout
juga.Suatu pendekatan yang belum saya lihat disebutkan di sini adalah dengan hanya menjalankan seluruh commandline di shell-nya sendiri. Halaman
sudo
manual itu sendiri memberikan contoh pendekatan ini:sumber
Pilihan lain adalah menggunakan file sementara. Ini berguna dalam skrip bash.
sumber
sudo dd of=
Untuk menambahkan seperti yang Anda inginkan:
atau untuk membuat ulang file dari awal:
Keuntungan:
tee
sejak tidak ada/dev/null
redirectionsh
karena tidak ada subkulit eksplisit (tapi yang tersirat untuk pengalihan)dd
memiliki banyak opsi hebat, misalnyastatus=progress
untuk melihat kemajuan transferBekerja karena sudo meneruskan stdin ke perintah.
sumber
dd
bagaimana kami menimpa sistem file kami yang dulu bagus, dan tidak menyadari itu untuk tugas-tugas biasa juga - dan bahwa perintah lain sebagai root juga menyebabkan kerusakan besar jika digunakan pada file / perangkat yang salah. Sepertisudo tee
,sudo dd
tentu saja juga akan bekerja dengan string di sini , misalnyasudo dd of=outfile <<<'hello world'
,. [Terima kasih telah mengedit. NB dengansh -c 'cmd'
,sh
adalah subproses yang merupakan shell, tetapi tidak benar-benar subkulit kecuali dalam arti semua perintah eksternal dimulai sebagai satu.]