プロが教える店舗&オフィスのセキュリティ対策術

perlにて現在のディレクトリパスを取得するにはどのようにすればいいのでしょうか?
モジュールをつかってcwd()で取得できるようなのですが、モジュールが入っていないサーバでも動くようにしたいのですがうまくできません・・・
どなたかご存知でしたら教えてください。

A 回答 (8件)

if($^O eq "MSWin32"){


$cwd=`cd`;
} else {
$cwd=`pwd`;
}
print $cwd;
--------------
ぐらいでいいんじゃないでしょうか
    • good
    • 0

あ~すみません、serverがwinでしたね


なら#7のは使えません
というか結局普遍的に使えるのはCWDしか無いのでは?
どうしても駄目なら
$0 , __FILE__
環境変数のPWD , SCRIPT_FILENAME , PATH_TRANSLATED(IISの場合)
のうち使えるものを選択して試すとか?
    • good
    • 0

コマンドラインからの実行なら $ENV{'PWD'} にフルパスがそのまま入るかと思います。

(CGIでは駄目)

CGIの場合は
$ENV{'SCRIPT_FILENAME'} =~ m|[^/]+$|; # これで $` にフルパスが入る
print "現在のディレクトリ = $` <P>\n";# 当然コマンドラインでは駄目


$0 や __FILE__ は少なくともfedora5ではコマンドライン、CGIともにパス無しのfile名
/home/tarou/test.cgi なら test.cgiしか入りません
fedora以外でも Apache+suexecではCGIで実行するとパス無しになったはずです
    • good
    • 0

> Perlでは$0という特殊変数に実行したスクリプトのフルパスが保存されています。



フルパスとは限らないみたいですけど?
実際perlvarの$0の項目にも「フルパスで」名前が格納されるとはかかれていません。
    • good
    • 1

確かに外部コマンド(pwdやcd)を使った方が手っ取り早いですが、それではOS依存になってしまいます。


完全にOS依存にしない形にする場合ですが、Perlでは$0という特殊変数に実行したスクリプトのフルパスが保存されています。
これを利用し、chdirするたびにこの変数の値を書き換えることによりディレクトリパスの管理ができそうです。

# スクリプト起動時のディレクトリ取得
$main::cwd = $0;
$main::cwd =~ s|(.*)/.*|$1|; # ディレクトリ部分のみ抜き出し

&my_chdir('foo');

sub my_chdir{
my $path = shift;
chdir($path);# サブディレクトリに移動
$main::cwd = (略) # ディレクトリ移動ごとに書き換え
}
    • good
    • 0

#1>opendir()でディレクトリ内のファイル一覧を行いたく、また階層も行き来できるようにしたい


カレントディレクトリは、別に取得しなくてもいいんじゃないかなあ。
あと
スクリプトの実行ディレクトリということであれば、
__FILE__ から取り出せるかもしれない。
    • good
    • 0

#2さんの回答に関して。


確かにそれでできるかもしれませんが、汚染チェックにひっかかりませんか?
Cwd.pmの中でも同じようなことをしていますが、

# Find the pwd command in the expected locations. We assume these
# are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
# so everything works under taint mode.

と但し書きがあります。
また、コマンドは絶対パスで呼び出しています。

もちろんこれらのリスクをわかった上で、それでもいいというのなら
止めませんが。
    • good
    • 0

> 、モジュールが入っていないサーバでも動くようにしたいのですがうまくできません・・・



どのような手段を試したのでしょうか?

ざっと見たところ、OSのアーキテクチャによって実際に取得を行う
手段を切り替えているようなので、OSによらず動くようにというのは
多分無理です(バイナリで記述する必要があるものがある)。

この回答への補足

opendir()でディレクトリ内のファイル一覧を行いたく、また階層も行き来できるようにしたいと考えております。cgiファイルひとつでなるべく簡単に記述したいと考えていて、そのファイルを書き換えることなく汎用性高いものを考えています。私自身、RedHat系Linuxばかりなので、OSによりバイナリとは初めて聞き勉強になりました(汗
開発環境はWindows(xampp)なので、Win系サーバでも使えたら良いかなと思います。

いろいろ調べたのですが、コマンド実行してその結果を受けるのが一番わかりやすいのではと思っておりますが多くの方はこの場合どういう考え方をされるのでしょうか?

補足日時:2006/08/11 03:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!