2010-03-27 5 views
9

Comment régler le mode taint dans un script Perl avec unComment définir le mode d'altération dans un script perl avec un '#!/Usr/bin/env perl'- shebang?

#!/usr/bin/env perl 

tralala?

+2

Cela aide si vous ne pouvez pas prédire l'emplacement du binaire perl (/ usr/bin ou/usr/local/bin). http://www.perlmonks.org/?node_id=716740 - Je suppose que la question est de savoir si vous pouvez prédire l'emplacement d'env ... –

+3

Sur mon PC j'utilise/usr/local/bin/perl et sur mon netbook/usr/bin/perl. Donc, avec/usr/bin/env perl, je n'ai pas besoin de changer mes scripts perl. Et je suppose qu'ils vont expédier la prochaine version de mon OS avec perl-version 5.10.1, alors peut-être que je vais utiliser sur mon PC à nouveau le onboard-perl avec/usr/bin/perl et là aussi je n'aurai pas à changer mes shebangs. –

+0

Gavin, l'emplacement de 'env' est standardisé. – daxim

Répondre

11

Vous pouvez passer la variable d'environnement PERL5OPT sur la ligne de tralala:

#!/usr/bin/env PERL5OPT=-T perl 

Cela semble tout plutôt à l'envers pour moi.

Une autre option, est de ré-exécuter le script en mode taint si vous détectez c'est pas:

#!/usr/bin/env perl 

warn 'Taint mode is '.(${^TAINT} ? 'on' : 'off'); # For debugging 

exec($^X,'-T',$0,@ARGV) unless ${^TAINT}; 

# do stuff under taint mode here 

De toute évidence, cela est un grand succès de la performance de démarrage.

+3

Vous ne pouvez pas spécifier une variable dans un shebang avec/usr/bin/env. Cela entraînera env à s'exécuter dans une boucle infinie, n'obtenant même pas à la commande demandée. J'ai testé cela contre Linux et FreeBSD. – Zed

+1

Oui - il semble que seul OS-X supporte actuellement la première incantation. –

2

Depuis le mode taint ne peut être activé par le drapeau -T et env n'acceptera aucun drapeaux dans une ligne de tralala, votre meilleure option est d'exécuter le programme via perl -T script.pl plutôt que d'exécuter le script directement.

Si vous devez absolument respecter le mode taint dans le tralala, vous pourriez faire un script taintperl quelque part dans votre PATH (par exemple/usr/local/bin) avec le contenu suivant:

#!/bin/sh 
/usr/bin/env perl -T 

Ensuite, dans votre script Perl, ont

#!/usr/bin/env taintperl 
+0

Sur de nombreux systèmes d'exploitation, vous ne pouvez pas utiliser un script interprété comme interpréteur de script. Vous devez le faire dans un langage compilé, par ex. C –

+2

@GavinBrock Cela est vrai pour le programme mentionné immédiatement après le '#!'. Ici, c'est '/ usr/bin/env', qui est compilé. À son tour, 'env' ne se soucie pas de savoir si' taintperl' est un programme compilé ou non. – maxelost

Questions connexes