Bagaimana menjalankan perintah yang melibatkan pengalihan atau pemipaan dengan sudo?

60

Saya mencoba mengikuti apa yang saya anggap praktik terbaik menggunakan sudo bukan akun root.

Saya menjalankan operasi file concat sederhana seperti:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Ini gagal seperti di sebelah kanan ">>" itu berjalan sebagai pengguna normal. Menambahkan sudo tambahan juga gagal (perilaku yang diharapkan sejak pemipaan ke perintah sudo dan bukan ke file).

Contohnya hanya itu tetapi sudah diverifikasi dan diuji di bawah akun root.

DarkSheep
sumber

Jawaban:

75

Anda dapat memanggil shell baru sebagai root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Anda juga bisa meningkatkan proses menulis ke file:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
Chris Down
sumber
8
Secara umum opsi kedua lebih aman karena hanya teeperintah berjalan sebagai root, bukan perintah utama yang bisa rumit dan rentan terhadap perilaku buruk. (tidak demikian halnya echo)
pabouk
19

Pilihan lain, sama-sama aman, adalah dengan menggunakan sudo's -iberalih ke login sebagai root:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Ini masih mengikuti aturan praktik terbaik karena akun root sebenarnya tidak diaktifkan, tetapi memungkinkan Anda melakukan hal-hal sebagai root dengan aman. Dari man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 
terdon
sumber
Alternatif lain adalahsudo bash
starbeamrainbowlabs
11

Jika Anda mengekspresikan perintah Anda tanpa tanda kutip tunggal, Anda bisa memasukkannya ke dalam tanda kutip tunggal dan menjalankannya melalui shell perantara.

Untuk menjalankan ini sebagai root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Tulis perintah dengan cara berbeda yang tidak digunakan ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Kemudian panggil sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Atau, untuk menulis output ke file yang hanya dapat ditulisi oleh root, panggil sudo tee. Berikan -aopsi untuk teemenambahkan ke file tujuan, jika tidak file akan terpotong.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Untuk modifikasi file yang lebih kompleks, Anda dapat menghubungi sudo sed, sudo ed, sudo perl, ...

Atau, gunakan editor yang layak dan buat panggilan sudo. Di Emacs, buka /sudo:/etc/conf.d/hwclock. Di Vim, panggil :w !sudo tee %untuk menulis ke file yang dibuka sebagai root, atau gunakan plugin sudo.vim . Atau pergi dari ujung sudo dan panggil sudoedit /etc/conf.d/hwclock.

Atau Anda bisa menyerah pada sisi gelap dan menjalankan shell sebagai root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Perintah gagal karena izin pada file yang dialihkan ke. Pengalihan terjadi bahkan sebelum sudoperintah dipanggil.

Anda harus memastikan bahwa itu root yang benar-benar membuka file untuk ditulis.

Cara paling sederhana untuk melakukan itu:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

The echodapat dijalankan sebagai Anda pengguna biasa karena hanya menghasilkan string teks. The teeutilitas harus dijalankan sebagai root meskipun, dan tee -aakan menambahkan data. Kami mengarahkan output ke /dev/nullkarena tee, secara default, akan menduplikasi data inputnya ke output standar selain menulis ke file yang ditunjukkan.

Dengan bashatau semua shell yang mengerti "di sini-string":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Ini identik dengan efek di atas. Hanya cara kami menghasilkan string yang diubah.


Cara lain yang sedikit berbelit-belit untuk melakukannya:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Di sini, pengalihan terjadi di dalam sh -cshell anak yang berjalan sebagai root.

Kusalananda
sumber
4

sudo dd of=

Untuk menambahkan seperti yang Anda inginkan:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

atau untuk membuat ulang file dari awal:

echo inbytes | sudo dd of=outfile

Keuntungan:

  • lebih bagus daripada teesejak tidak ada /dev/nullredirection
  • lebih bagus daripada shkarena tidak ada subkulit
  • ddmemiliki banyak opsi hebat, misalnya status=progressuntuk melihat kemajuan transfer

Bekerja karena sudo meneruskan stdin ke perintah.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber