読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

カレントディレクトリを一旦変更してから元に戻す

(知らなかったとはいえ)あぶねーことしてたので反省がてら。
もしかしたら初心者レベルかもしれないアレでアレなんですが…

サーバに置いてあるファイルを参照するシェルスクリプトPHPから呼んでいたのですが、
シェルスクリプト内でファイルを相対パス指定しているのを素で呼んでいたという。

雑な例なんですが

シェルスクリプト hoge.sh

ls -l ../hoge

PHP

exec("/abc/def/fuga/hoge.sh");

という感じ。
カレントディレクトリがどこかを意識していないので危ないやつ。

というかシェルに対しての相対パスかと思っていた。確かにそんなはずはない。


んでPHP側をこういう感じで修正しました。
※場合によってはパーミッションで弾かれるので注意

// カレントディレクトリを一旦保存
$dir = getcwd();

// 特定のディレクトリに移動+必要に応じてエラー処理
if (!chdir("/abc/def/fuga")){ /* だめ */ }

// コマンド実行
exec("/abc/def/fuga/hoge.sh");

// 元のディレクトリに移動+必要に応じてエラー処理
if (!chdir($dir)){ /* だめ */ }