Schrift
[thread]7891[/thread]

Arbeitsverzeichnis aendern

Leser: 3


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
fritz
 2006-04-13 17:15
#64913 #64913
User since
2005-10-19
44 Artikel
BenutzerIn
[default_avatar]
Hi, ich schon wieder

Hab jetzt ein etwas kniffligeres Problem als vorher.

Und zwar moechte ich mein Arbeitverzeichnis bevor ich meine Exe Datei ausfuehre auf diesen Ort legen und nachher wieder zurueck.

Grund dafuer ist das in dem Exe File ein hardkodierter Pfad verwendet wird der auf ein txt file zugreift und dieses einliest.


Im Prinzip muesst ihr euch das so vorstellen:

Mein Perl laeuft auf Laufwerk C:

C:\test.pl

Das exe file das ich ausfuehren will und das txt file liegen aber in einem Ordner darueber also in C:\ordner\testing.exe.

Wenn ich jetzt den Pfad im system befehl angebe (C:\ordner\testing.exe) dann sucht das exe File aber die Daten auf der C Festplatte und nicht im Ordner "ordner".

Bitte um Hilfe wie ich mein Arbeitsverzeichnis aendern und wieder auf Normalzustand zuruecksetzen kann.
master
 2006-04-13 17:33
#64914 #64914
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
pfad ändern im Skript:
Code: (dl )
1
2
3
chdir('ordner/');
system('testing.exe.');
chdir('..');


Wenn die EXE = Perl ist, kannst du das nutzten
Das brauch ich auch noch viel:
Code: (dl )
use FindBin qw($Bin); chdir($Bin);


Egal wie du dein skript startest egal von wo aus, das skript hat nun immer den Pfad als aktuell in dem verzeichnis wo es gerade ist.\n\n

<!--EDIT|master|1144935438-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
fritz
 2006-04-13 17:53
#64915 #64915
User since
2005-10-19
44 Artikel
BenutzerIn
[default_avatar]
Ich danke dir vielmals, klappt super,
Diese Community ist einfach unglaublich gut und unglaublich schnell.

Ein lob an alle.


MFG

Fritz
Crian
 2006-04-13 18:09
#64916 #64916
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich empfehle, das Verzeichnis nicht zu wechseln, es sei denn, du hast keinen Einfluß auf die Programmierung der aufgerufenen ausführbaren Datei.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
fritz
 2006-04-13 18:13
#64917 #64917
User since
2005-10-19
44 Artikel
BenutzerIn
[default_avatar]
HAbe leider keinen Einfluss, das Programm kommt von ganz oben wenn ihr versteht was ich meine.


Da hat so ein kleiner Student nicht dran rum zu meckern

:-)
GwenDragon
 2006-04-13 18:56
#64918 #64918
User since
2005-01-17
14540 Artikel
Admin1
[Homepage]
user image
[quote=master,13.04.2006, 15:33]pfad ändern im Skript:
Code: (dl )
1
2
3
chdir('ordner/');
system('testing.exe.');
chdir('..');
[/quote]
Vielleicht besser so
Code: (dl )
1
2
3
4
5
use Cwd;
my $dir = getcwd;
chdir('ordner/');
system('testing.exe');
chdir($dir);
\n\n

<!--EDIT|GwenDragon|1144940315-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

betterworld
 2006-04-13 18:57
#64919 #64919
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=master,13.04.2006, 15:33]pfad ändern im Skript:
Code: (dl )
1
2
3
chdir('ordner/');
system('testing.exe.');
chdir('..');
[/quote]
chdir("..") ist unter Unix/Linux keine sichere Methode, um wieder ins alte Verzeichnis zurückzukommen. Dazwischenkommen kann immer ein Symlink oder ein richtig "geteimtes" rename oder gar mount. Wenn man ganz sicher gehen will, sollte man es ungefaehr so machen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
use POSIX;
require "syscall.ph";
my $d = POSIX::open(".") or die $!;
system("pwd"); # nur zur Kontroll-Ausgabe
chdir("/tmp") or die $!;
system("pwd"); # nur zur Kontroll-Ausgabe
-1 != syscall(&SYS_fchdir, $d) or die $!;
system("pwd"); # nur zur Kontroll-Ausgabe
POSIX::close($d);


(Ich will nicht behaupten, dass der Code irgendwie schön aussieht.)

Edit: "close" hinzugefuegt\n\n

<!--EDIT|betterworld|1144940907-->
master
 2006-04-13 19:14
#64920 #64920
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@Crian
er hat eben anscheinend keinen Einfluss darauf..

@betterworld
Ich denke chdir reicht.
(er wird den absoluten Pfad sicher kennen(ohne über links zu gehen) ) und wirklich sicher ist auch das nicht..
zwischen den einzelnen befehlen könnte das verzeichnis umbenannt werden.

ich hasse diese inkonsitenz gibts keinen wrapper?
chdir2 (oder sowas?)


@GwenDragon
Normalerweise würd ich auch diese Methode nehmen.
Ich wollte Ihm aber noch die relative-Möglichkeit aufzeigen
Dein code ist jedoch besser.
ok ich würde es nat so machen :-)

Code: (dl )
1
2
3
4
5
use FindBin qw($Bin); chdir($Bin);    #sollte eh immer stehen.

chdir('ordner/');
system('testing.exe');
chdir($Bin);
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
betterworld
 2006-04-13 19:36
#64921 #64921
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=master,13.04.2006, 17:14]@betterworld
Ich denke chdir reicht.
(er wird den absoluten Pfad sicher kennen(ohne über links zu gehen) ) und wirklich sicher ist auch das nicht..
zwischen den einzelnen befehlen könnte das verzeichnis umbenannt werden.

ich hasse diese inkonsitenz gibts keinen wrapper?
chdir2 (oder sowas?)[/quote]
Irgendwie verstehe ich diesen Absatz nicht. Stimmst Du mir zu oder stimmst Du nicht zu?

Jedenfalls reicht chdir nicht.\n\n

<!--EDIT|betterworld|1144942722-->
betterworld
 2006-04-13 19:54
#64922 #64922
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Crian,13.04.2006, 16:09]Ich empfehle, das Verzeichnis nicht zu wechseln, es sei denn, du hast keinen Einfluß auf die Programmierung der aufgerufenen ausführbaren Datei.[/quote]
Warum empfiehlst Du das?

Wechseln des Verzeichnisses kann sicherer sein, besonders, wenn man privilegiert arbeitet. Ich betrachte das jetzt aus Linux-Sicht, auch wenn "testing.exe" nicht nach Linux klingt.

Nehmen wir z. B. das klassische Beispiel: Wir möchten in /tmp ausmisten. Darin gibt es ein Verzeichnis "a", das dem Benutzer master gehört. Dieses Verzeichnis ist schon einen Monat alt, bedarf also einer Löschung. In dem Verzeichnis ist eine Datei "active". Die muss natürlich gelöscht werden, bevor das Verzeichnis selbst gelöscht werden kann. Wenn das per "unlink('a/active')" lösen, kann etwas ganz Schlimmes passieren! Eine Millisekunde nachdem wir per "stat" usw herausgefunden haben, dass die Datei tatsächlich dem Benutzer "master" gehört, kommt "master" selbst daher, loescht das Verzeichnis "a" und legt in /tmp einen Symlink namens "a" auf "/etc/iptables" an. Noch eine Millisekunde später machen wir unser "unlink ('a/active')". Damit haben wir die Firewall geloescht, oh nein!

So weit ich weiß, kann man solche Szenarios am besten umgehen, indem man chdir benutzt.

In diesem Beispiel kam jetzt kein externes Programm "testing.exe" vor, aber es sei dem Leser überlassen, ein Szenario zu entwerfen, in dem solch ein Programm vorkommt.\n\n

<!--EDIT|betterworld|1144944089-->
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-04-13 17:15.