0
votes

Perl - ouvert avec chemin relatif Apache

Nous avons récemment hérité d'une application Perl quelque peu héritée et nous travaillons à migrer vers un nouveau serveur, ainsi que de configurer un environnement Sandbox afin que nous puissions commencer à trier l'application. Le problème que nous ayons est que le code utilise actuellement certains chemins relatifs de la méthode Ouvrir . Et travaille actuellement dans leur environnement d'hébergement partagé (nous avons peu d'accès à) xxx

Nous avons tiré tout le code, les chemins, etc. sur et pour la plupart disposent de l'application jusqu'à ce que Nous rencontrons l'un des scripts qui fait ce qui précède, ouvre un fichier avec un chemin relatif. Puis il échoue.

Si nous exécutons le code via la ligne de commande, les chemins relatifs fonctionnent. Si nous modifions le chemin d'accès au chemin complet, il fonctionne à la fois via la ligne de commande et via Apache (navigation sur la page dans le navigateur).

Cela me fait penser qu'il existe un module ou une option de configuration dont nous avons besoin de Définissez Apache pour permettre aux scripts Perl d'accéder ou d'utiliser la commande Ouvrir avec des chemins relatifs?


6 commentaires

Quelle erreur jette-t-elle? N'est-ce pas un problème de permission plutôt que de mauvais chemin?


Il ne semble pas être un problème d'autorisation (le fichier 777 a-t-il un point à un point) car cela fonctionne si nous utilisons le chemin complet du fichier et non du chemin relatif. Nous obtenons un «non de ce fichier ou un répertoire» malgré le fait que je puisse quitter VI dans le chemin que je suis dans et chat le fichier en question. Il en va de même semble se produire si je déplace le fichier dans le répertoire avec le script et j'essaie simplement d'y accéder via ./file.txt. Toujours pas voir le fichier.


Une autre note rapide est que les chemins relatifs fonctionnent si nous exécutons le script via la ligne de commande ... Script Perl.pl. Cela semble être un problème avec seulement accéder au script via une demande via Apache.


Une nouvelle Tribbit. Je dispose maintenant du script Perl Imprimer pwd ; et sa montrant que le répertoire actuel comme étant '/' malgré cela étant /srv/site/scripts/script.pl. Je ne sais pas pourquoi le script penserait que son CWD est '/' lorsque vous accédez au fichier via exemple.com/scripts/ script.pl . Merci encore pour votre aide avec cela.


Peut-être que Apache circule dans un chroot prison?


Sauf si elle est par défaut, je ne vois pas mod_chroot chargé ni configuré nulle part dans l'un des modules Apache. Savez-vous comment nous pourrions vérifier cela et / ou le désactiver? Si j'inclus également un ls -l dans le même script. Je vois tous les fichiers / répertoires au niveau racine du serveur. Je ne m'attendrais pas à ce que si le script ait été emprisonné à son propre répertoire.


3 Réponses :


2
votes

Les chemins relatifs sont relatifs au répertoire de travail actuel du processus, ce qui n'est pas nécessairement identique à celui du répertoire contenant le programme. C'est en fait, c'est souvent / code> pour les démons (et donc leurs enfants).

Pour les chemins relatifs à l'emplacement du programme, utilisez P>

use FindBin qw( $RealBin );

my $qfn = "$RealBin/relative/path/to/file.txt";
open(my $HANDLE, "<", $qfn)


1 commentaires

Merci pour la réponse. Je suppose que c'est la curiosité ici. Nous avons tiré sur le code hérité qui utilise le chemin relatif comme indiqué ci-dessus. Cependant, sur le nouveau serveur, le script montre le chemin comme "/". Au lieu de modifier le code, comment pourrions-nous pouvoir définir notre environnement de sorte que le script voit son chemin correctement? Notre solution actuelle ne fait que l'ajout d'un fichier d'utilisation :: Basename QW (Dirname); CHDIR (DIRNAME (0 $));



0
votes

Il est mauvais pratique de spécifier le chemin du fichier dans Ouvrir avec une chaîne fixe, sauf si le chemin est prédéfini et ne change jamais - comme par exemple avec / etc / fstab sous Linux .

Vous devez modifier le code pour utiliser la variable (s) à la place.

Définir la variable en haut de la fonction de script - In fonctionnalité Si vous devez modifier base et chemin vous saurez que vous le trouverez à la Peu de premières lignes du code.

dans une telle situation ajoutez temporaire dans le code quelque chose comme xxx

une fois que vous avez exécuté votre script à partir de WebServer que vous devez rechercher Le fichier my_uniq_tile.txt - c'est l'emplacement sera par défaut base du serveur Web pour l'emplacement (s) de fichiers (s).

Ajustez maintenant les variables avec chemin de fichier en conséquence. xxx


1 commentaires

Merci. Oui, nous n'utilisons pas réellement le chemin fixe, mais plutôt des variables comme vous le mentionnez. Le chemin fourni dans l'exemple est juste que pour l'exemple. La question n'est pas avec le chemin étant construit correctement cela a à voir avec le chemin relatif qui ne fonctionne pas. Dans votre cas à l'aide d'un './' est également relatif et dans notre cas échoue également.



0
votes

Comme mentionné dans le commentaire ci-dessus. Notre solution finale était d'utiliser: xxx

Cela nous a permis d'obtenir le code de travail tout en conservant des modifications de code supplémentaires au minimum.


0 commentaires