Perintah Anda tidak berfungsi karena pengalihan dilakukan oleh shell Anda yang tidak memiliki izin untuk menulis ke /root/test.out
. Pengalihan keluaran tidak dilakukan oleh sudo.
Ada beberapa solusi:
-
Jalankan shell dengan sudo dan berikan perintah dengan menggunakan
-c
opsi:sudo sh -c 'ls -hal /root/ > /root/test.out'
-
Buat skrip dengan perintah Anda dan jalankan skrip itu dengan sudo:
#!/bin/sh ls -hal /root/ > /root/test.out
Jalankan
sudo ls.sh
. Lihat jawaban Steve Bennett jika Anda tidak ingin membuat file sementara. -
Luncurkan shell dengan
sudo -s
lalu jalankan perintah Anda:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
Gunakan
sudo tee
(jika Anda harus banyak melarikan diri saat menggunakan-c
pilihan):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Pengalihan ke
/dev/null
diperlukan untuk menghentikan tee dari keluaran ke layar. Untuk menambahkan alih-alih menimpa file keluaran (>>
), gunakantee -a
atautee --append
(yang terakhir khusus untuk GNU coreutils).
Terima kasih kepada Jd, Adam J. Forster, dan Johnathan untuk solusi kedua, ketiga, dan keempat.
Seseorang di sini baru saja menyarankan sudoing tee:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Ini juga dapat digunakan untuk mengalihkan perintah apa pun, ke direktori yang tidak dapat Anda akses. Ini berfungsi karena program tee secara efektif merupakan program "echo to a file", dan redirect ke /dev/null adalah untuk menghentikannya juga menampilkan ke layar agar tetap sama seperti contoh buatan asli di atas.
Trik yang saya temukan sendiri adalah
sudo ls -hal /root/ | sudo dd of=/root/test.out