Kenapa . tidak di jalur secara default?

63

Pada sistem seperti UNIX selama bertahun-tahun (paling relevan bagi saya, Linux), saya perhatikan bahwa .(direktori saat ini) tidak pernah dalam $PATHstandarnya. Kenapa ini?

Saya ingat pernah membaca bertahun-tahun yang lalu bahwa itu adalah masalah keamanan, tetapi artikel yang saya baca tidak menjelaskan apa sebenarnya masalahnya. Apakah itu karena seseorang dapat meninggalkan versi berbahaya lsatau cpdalam direktori, dan akhirnya saya menjalankannya tanpa disadari ada di sana?

dirtside
sumber
6
Bukan untuk perlindungan pengguna interaktif seperti halnya untuk program lain (dan skrip) yang menjalankan program lain. Bahkan beberapa pengguna yang cerdas suka mengetahui bahwa ketika mereka berada di direktori acak yang lsakan /usr/bin/lsdan ./lstidak. Ada juga rintangan jika Anda tahu cara menambahkan .ke ujung jalan Anda, Anda mungkin tahu apa yang Anda lakukan. root seharusnya tidak ada .di path, banyak sistem bahkan tidak membiarkan root login lagi.
msw

Jawaban:

41

Anda menjawab dengan benar pertanyaan Anda sendiri, itulah sebabnya dot tidak ada di jalur:
Untuk melindungi dari virus kekanak-kanakan atau kesalahan jujur.

Tentu saja, ini adalah ukuran anti-virus yang sangat timpang dan tidak berguna, dan tidak ada yang menghentikan Anda untuk menambahkan titik ke jalur sendiri.

harrymc
sumber
13
Ini lucu, meskipun, bahwa Anda dilindungi dari ini tetapi tidak dari satu-satunya file -rfdalam direktori (membuat rm *menarik) ;-)
Joey
Jawaban Unix: mengapa Anda memberi nama file -rfdi tempat pertama? ;)
msw
2
@ msw: Jawaban Unix lain adalah bahwa biasanya titik di jalan disukai untuk akun admin, tetapi ok untuk non-admin.
harrymc
apakah risikonya akan sangat berkurang jika jalur saat ini adalah jalur terakhir , sehingga semua tempat normal untuk program diperiksa terlebih dahulu ?
Jon z
1
@ Jonz: Tidak juga. Tetapi risikonya cukup kecil jika komputer Anda bersih dari virus. Dan jika komputer terinfeksi, maka dengan virus modern jalan adalah yang paling tidak Anda khawatirkan.
harrymc
4

Iya. Jika Anda meletakkan "." di jalur, Anda akhirnya akan mengirim banyak panggilan perintah ke file di direktori Anda saat ini.

Bahkan jika itu yang terakhir, masih ada kesalahan pilot. Sebagai contoh, Solaris 10 tidak memiliki "top". Saya mengetik "top" di sistem saya sepanjang hari, karena saya pikir saya berada di sistem yang memiliki "top".

benc
sumber
1

Maaf, saya ingin menanyakan ini dalam bentuk komentar untuk jawaban yang dipilih, tetapi saya belum memiliki perwakilan tentang pengguna super.

Jawaban keamanan masuk akal, tetapi jika Anda menempatkan "." di PATH Anda sebagai hal terakhir, bukankah shell seharusnya terlihat di direktori saat ini saat ia mencari executable, dan dengan demikian mengurangi risiko keamanan? Jika ia mencari $ PATH secara berurutan, ia akan menemukan / bin / ls sebelum ditemukan ./ls.

Jadi, betapa tidak amannya bagi saya untuk menempatkan "." pada akhir variabel lingkungan $ PATH saya?

Ini berfungsi seperti yang saya sarankan. Inilah cara saya menguji:

Pertama, tambahkan "." hingga AKHIR variabel lingkungan PATH Anda.

Kemudian, letakkan file berikut di beberapa direktori, seperti ~ / dir1 / dir2 / test_which.rb:

#!/your/path/to/ruby

puts "this file is from the current directory"

Dan letakkan file ini di /usr/bin/test_which.rb

#!/your/path/to/ruby

puts "this file is at /usr/bin/test_which.rb"

Pastikan chmod + x file sehingga dapat dieksekusi.

Sekarang, jika Anda mengubah direktori menjadi ~ / dir1 / dir2, dan jalankan test_which.rb, Anda akan mendapatkan hasilnya

this file is at /usr/bin/test_which.rb

Memang, jika Anda menjalankan "yang test_which.rb" dari mana saja, itu harus melaporkan

/usr/bin/test_which.rb

Anda masih dapat menjalankan file di direktori saat ini dengan mengetik:

./test_which.rb
Tyler Collier
sumber
8
Tidak ada yang pernah membuat kesalahan ketik, seperti dcatau slatau sduodi shell, dan diselamatkan oleh "perintah tidak ditemukan". Pernah.
Daniel Beck
1
Setuju dengan Daniel: Anda dapat memiliki skrip berbahaya yang dinamai berdasarkan perintah yang salah eja. Lihat juga jawaban ini .
ignis
@DanielBeck Anda harus mencoba menggunakan alias untuk kesalahan ketik. Saya memiliki konfigurasi pilihan saya ls(keluaran warna dan banyak lagi) alias lyang sepenuhnya dikeluarkan dengan kesalahan ketik.
Karl Damgaard Asmussen
1
@KarlDamgaardAsmussen kl
deworde
Saya pribadi tidak menambahkan '.' ke jalanku. Tidak sulit untuk mengetik ./run atau apa pun yang ingin saya lakukan di direktori lokal. Ini telah menyelamatkan saya beberapa kali dari mengambil hal-hal yang tidak terduga. Tomat tomahto.
Michael Mathews
1

Lebih dari risiko keamanan, memiliki '.' di PATH membuat hampir tidak mungkin untuk memastikan bahwa eksekusi perintah apa pun bertindak sebagaimana dimaksud. Pikirkan tentang menjalankan perintah seperti 'zip' di direktori besar yang berisi ribuan file dengan nama acak. Kemungkinan salah satu dari mereka sebenarnya bernama 'zip' tidak dapat diabaikan dan akan menyebabkan kesalahan yang sangat sulit untuk dipahami (sebenarnya file tersebut harus dapat dieksekusi, yang, bagaimanapun, mungkin terjadi).

Khususnya ini benar ketika menulis skrip yang menjaga variabel PATH pengguna. Skrip tertulis yang baik harus menangani semua kasus sudut (seperti nama file dengan spasi di dalamnya atau dimulai dengan '-'). Tetapi tidak praktis untuk mencegah file dalam direktori saat ini dieksekusi daripada perintah sistem ...

Emanuele Paolini
sumber