çalıştırılabilir bir dosyayı çalıştırmak için neden ./ gereklidir?


9

Ubuntu kullanıyorum ve temanın önüne geçmedikçe çalıştırılabilir komut dosyalarımın çoğunun çalışmadığını fark ettim ./.

Örneğin, bir perl betiğim varsa: /home/me/script.plve şu anda yazıyorum /home/me, yazmak script.plyapmaz, ama yapar ./script.pl.

Neden?


@ David B: runnable file => executable file?
Lazer

Yanıtlar:


13

Bir komut dosyasını yürütmek için, komut dosyası ortam değişkeninizde listelenen dizinlerden birinde yoksa , komut dosyasının tam yolunu yazmanız gerekir $PATH. Genellikle (ve varsayılan olarak) .(geçerli dizin) sizin içinizde olmadığından$PATH , ./scriptyürütmek için yazmanız gerekir.


21

Çünkü geçerli dizin yolunuzda değil. Bu bir güvenlik özelliğidir. Yolunuzdaysa, birisi ortak bir komutun kötü amaçlı bir kopyasını bırakabilir ve örneğin gerçek sudo'yu çalıştırmak yerine bu dizinde olduğunuzda, sahte olanı çalıştırırsınız. Bu kötü bir şey olurdu.


3
Bu biraz yanıltıcı. Daha .sonra olduğu sürece /usr/bin/, gerçek olanın yerini alamazdı sudo. Yanlışlıkla yolunuza program eklemediğinizden emin olmaktır, ancak esas olarak mevcut olanların yerine geçmemekle ilgili değildir.
Matthew Flaschen

Yerine sudo, ben kullanırım lsve rm. Daha çok çağrılabilir.
Aaron Digulla

@aaron: elbette ama lsşifrenizi sormayacak ve kullanıcı sudoşifreyi kullanabilirse ilginç ...;)
laurent

1
@Matthew. Evet, sömürmek hala zor ama gerçek güvenlik riski. Diyelim slki kötü şeyler yapan bir senaryo koyuyorum , sonra çağırıyor ls, sonra kendini siliyor . Sistem araçlarını geçersiz kılamazsınız, ancak 'yazım hatası' yapabilirsiniz
Rich Homolka

@laurent: Aklımdaki neydi: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Parolayı bilmenize gerek yok.
Aaron Digulla

4
echo $PATH

Bunun çalışması için geçerli dizinin (tek bir nokta) yolunuzda olması gerekir.

Aşağıdaki komutlarla isterseniz yolunuza ekleyebilirsiniz.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


3

kabuk, yürütülebilir dosya yolunu arar ve varsayılan ./olarak yolda değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.