Saya sedang berusaha mengembangkan keterampilan baris perintah saya tadi malam dan mengalami masalah di mana ketika saya menggunakan sudo, saya mendapat pesan kesalahan yang mengatakan 'izin ditolak'. Namun ketika saya menggunakan 'sudo su' dan menjadi root, perintah itu berhasil.
Mengapa sudo tidak berfungsi pada contoh pertama?
Dulu:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
Dari edisi Linux Bible 2010 di bagian pengaturan server LAMP.
command-line
wdypdx22
sumber
sumber
sudo -s
lagisudo su
.Jawaban:
<,> Dan >> digunakan untuk pengalihan input / output untuk perintah - yang merupakan fitur yang disediakan oleh shell (misalnya, bash). Jadi, jika Anda mengetik perintah seperti
sudo cat > /var/www/info.php
maka shell yang menerima ini sebagai input mencoba untuk membuka file/var/www/info.php
dan menyediakan file itu sebagai output standar untuksudo
perintah. Thesudo
perintah bahkan tidak menyadari apakah outputnya akan konsol atau diarahkan ke file, karena ini diasuh oleh shell yang memanggil itu.Jika shell yang Anda ketikkan perintah Anda adalah shell login Anda atau shell lain yang berjalan di terminal dengan id pengguna Anda, maka ia memiliki hak istimewa yang sama dengan id pengguna Anda - bukan milik root.
Jadi dalam kasus Anda, sedangkan perintah cat dieksekusi sebagai root, penyalinan outputnya
/var/www/info.php
diupayakan oleh shell yang berjalan sebagai pengguna normal, yang, seperti yang diharapkan, gagal.Solusi untuk situasi seperti itu adalah menggunakan
tee
perintah:Itu akan memiliki efek yang dimaksudkan menempatkan semua teks yang dimasukkan di konsol hingga ^ D ke dalam file yang ditentukan sebagai parameter.
Salah satu efek samping yang mungkin tidak diinginkan adalah itu
tee
juga akan menggemakan output ke stdout, jadi setelah Anda mengetik setiap baris dan tekan entertee
akan menampilkan salinannya kembali. Untuk menghindari ini, Anda dapat menggunakan varian berikut.Rincian tentang
tee
dapat diperoleh melaluiinfo tee
di terminal.sumber
sudo tidak berfungsi untuk perintah yang memerlukan izin untuk menulis file, seperti:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
Itu menjelaskan di halaman manual sudo.
sumber
sudo
. Sebagaimana dicatat dalam jawaban koushik, perilaku tersebut cukup dapat diprediksi, konsisten, dan "benar" untuk model izin unix.Masalahnya adalah bagian "> foo.txt" ditafsirkan dan dieksekusi oleh penerjemah perintah Anda (shell) jauh sebelum perintah sudo dijalankan. Perintah sudo tidak tahu bahwa Anda ingin mengarahkan outputnya ke file.
Interpreter perintah Anda tidak memiliki otoritas root (tetapi perintah sudo akhirnya akan nanti) sehingga tidak dapat mengarahkan output ke foo.txt.
sumber
Cara lain untuk menyelesaikan ini adalah memulai subkulit dengan sudo dan jalankan perintah itu dalam subkulit itu:
di sini, perintah yang "memiliki sudo" adalah bash, dan apa pun yang dijalankan di dalamnya memiliki izin root.
$ 2c, * -pike
sumber