perché ./ è necessario per eseguire un file eseguibile?


9

Sto usando Ubuntu e noto che molti dei miei script eseguibili non verranno eseguiti a meno che non preceda il tema ./.

Ad esempio, se ho uno script perl: /home/me/script.ple attualmente mi trovo /home/me, digitare script.plnon lo farà, ma lo ./script.plfarà.

Perché?


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

Risposte:


13

Per eseguire uno script, è necessario digitare il percorso completo dello script a meno che lo script non sia presente in una delle directory elencate nella $PATHvariabile di ambiente. Generalmente (e per impostazione predefinita) .(la directory corrente) non è nella tua $PATH, quindi è necessario digitare ./scriptper eseguirla.


21

Perché la directory corrente non è nel tuo percorso. Questa è una funzione di sicurezza. Se fosse sul tuo percorso, qualcuno potrebbe potenzialmente rilasciare una copia dannosa di un comando comune e quando ti trovi in ​​quella directory invece di eseguire il vero sudo, ad esempio, eseguiresti quello falso. Sarebbe una brutta cosa.


3
Questo è in qualche modo fuorviante. Fino a .quando /usr/bin/lo sarebbero stati , non avrebbe sostituito il reale sudo. È per assicurarsi di non aggiungere accidentalmente programmi al proprio percorso, ma non si tratta principalmente di sostituire quelli esistenti.
Matthew Flaschen,

Invece di sudo, userei lse rm. Molto più probabile che venga chiamato.
Aaron Digulla,

@aaron: certo ma lsnon ti chiederà la tua password e se l'utente può usare sudola password è interessante ...;)
laurent

1
@Matteo. Sì, è ancora difficile da sfruttare ma reale rischio per la sicurezza. Diciamo che ho inserito una sceneggiatura slche fa cose cattive, quindi invoca ls, quindi si cancella. Non puoi sovrascrivere gli strumenti di sistema, ma puoi 'typosquat'
Rich Homolka

@laurent: Quello che avevo in mente era: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Non è necessario conoscere la password.
Aaron Digulla,

4
echo $PATH

Devi avere la directory corrente (un singolo punto) nel tuo percorso per farlo funzionare.

Puoi aggiungerlo al tuo percorso se lo desideri con i seguenti comandi.

sh / bash: export PATH=$PATH:.

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


3

la shell cerca i file eseguibili nel percorso e, per impostazione predefinita, ./non si trova nel percorso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.