• ベストアンサー

PHPから外部コマンドを使ってファイルやディレクトリを新規作成するには?

LinuxのFedora10で、PHPで外部コマンドを使ってサーバ内にディレクトリを新規作成したいのですができません。 /var/www/uuu内に、index.phpを設置し、その中の一部に以下のようなスクリプトを書いています。 <?php system("pwd"); system("touch fff"); system("mkdir ddd"); ?> system("pwd")は/var/www/uuuという結果を出してくれます。しかし、system("touch fff")やsystem("mkdir ddd")に関しては全く結果を出してくれません。 (PHP自体のエラーではないようです。) どうやら、外部コマンド自体はうまく機能してくれているみたいなのですが、ディレクトリやファイルを新規作成することができないようなのです。 /var/www内のディレクトリuuuのパーミッションを777にして、オーナーを一般ユーザにしてやってみても同様にうまくいきません。 どのようにすれば、PHPから外部コマンドを使ってファイルやディレクトリを新規作成することができるでしょうか? よろしくお願いします。

  • wataj
  • お礼率83% (133/160)

質問者が選んだベストアンサー

  • ベストアンサー
  • mattalix
  • ベストアンサー率62% (47/75)
回答No.5

やりたいことがrootでのuseraddだけなら、sudoersに apache ALL=(root) NOPASSWD: /usr/sbin/useradd とでも書いておきsudoすれば済むでしょう。 しかし私ならphpから直接sudoなどはせず、キューに入れるだけにしますね。別途サニタイズしつつ処理するものを書いてcronで回します。

wataj
質問者

お礼

ご回答どうもありがとうございました。お礼が遅くなって申し訳ありません。(長い間、見ていませんでした。) まさにお答えの通りでした。この十日間、別の方法でやっていましたが、mattalixさん投稿を拝見し、試したところ、うまく行きました。(ですから、mattalixさんの方法に変更しました。) 新しいことを学ばせて頂き、またLinuxを使うことが楽しくなりました。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

「非対話 adduser linux」あたりでググればひっかかるかもしれません 私のメイン環境のFreeBSDなら「pw」で一発なんですけどね Fedoraはあまりつかっていないので具体的なコマンドは知りません。

wataj
質問者

お礼

色々とお世話頂き、有難うございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>PHPで外部コマンドを使ってサーバ内にディレクトリを新規作成したい >外部コマンドでユーザ登録できない 全然ちがうレベルの話にかわっていますね? 新規ユーザーの追加ってなるとスーパーユーザーの仕事です。 apacheの実行ユーザーでなんでもできたら、apacheが乗っ取られた ときサーバーすべて乗っ取られますよ・・・

wataj
質問者

お礼

すみません。質問の内容が変わってしまっていますね…。 ユーザをapacheからrootに換えてやろうと思っているのですが、何故だかユーザを変えられません。 system("whoami"); system("su"); system("mypass"); system("whoami"); 結果は、 apache apache です。つまり、ユーザはapacheから変わっていません。 それではと、apacheのままsudoを使って、 # sudo useradd newuser にしてもapacheのパスワードを二度入れなければならないと思うので、以下のように書こうと思うのですが… system("sudo useradd newuser"); system("password_of_apache"); system("password_of_apache"); apacheのパスワードが分かりません。どうやって調べるのでしょうか。rootのパスワードを忘れた場合の対処法はたくさん載っているのですが…。

  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.2

プログラムを実行しているユーザーにコマンドの実行権が無いか、パスが通ってないという事ではないでしょうか。

wataj
質問者

お礼

ご回答どうもありがとうございます。 ただ、プログラムを実行しているユーザーにコマンドの実行権はありますし、パスが通ってないという事はありません。(質問をご覧ください。)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

sudoなどを使うか、外部コマンドではないphpの機能をつかってみては?

wataj
質問者

お礼

ご回答どうもありがとうございます。 sudo、検討してみましたが、どうやらディレクトリは作成されるようでした。すみません。 # useradd hogehoge を外部コマンドを使って実行しようとしていて、/home/hogehogeが作成されなかったので、そのように勘違いしていました。ディレクトリだけなら作成できました。 …という訳で、外部コマンドではないphpの機能ではユーザの新規登録はできないと思いますので、外部コマンドでユーザ登録できないかと思います。

関連するQ&A

  • ディレクトリの作成方法

    基本的なことなのかしれませんが、 PHPでディレクトリの作成方法を教えてください。 以前、MKDIRで作成していたようなのですが、 メンテしたらできなくなりました。 前のPHPファイルからsubmitで呼び出していたのを location.hrefでURL呼出に変更したのですが、 mkdir処理自体は変更していません。 また、mkdirでコマンドを検索してもヒットしないのですが コマンド自体なくなったのでしょうか? もしなくなったのであれば、代わりのコマンド(処理方式)はありますか? 複数質問してもうしわけないのですが、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • ファイルを作成するDOSコマンドって?

    DOSでテキストファイルを作成するコマンドは存在するのでしょうか? (UNIX環境でいうと、touchみたいなものです) ディレクトリを作成するコマンドはmkdirなんですが、ファイルを作成する コマンドって載ってないんですよ。。 DOSプロンプトから、helpで確認したんですが載ってなかったです。 helpに載ってないということは使用できない(存在しない) ということなのでしょうか? ■環境 Windows2000 Professional 回答宜しくお願いします。

  • php実行権限以外でのディレクトリ(ファイル)作成方法

    webからphpを起動し、ディレクトリを作る場合、 phpが実行された権限ではない権限で作ることはできますか? 所有者がapacheとなるディレクトリを作りたいのです。 試してみたこと。 ・mkdirでディレクトリ作成後、chownで所有者変更が出来ればいいのですが、 root権限で動いているわけではないので無理でした。 ・シェルを作って、シェルの所有者をapacheにしてphpからコマンドラインで シェルを呼び出してみましたが所有者apacheで作られません。

    • ベストアンサー
    • PHP
  • phpでディレクトリが作れません

    php初心者です レンタルサーバで php.iniはいじれない環境です、 ディレクトリを作ろうとすると Warning: mkdir(testdir) [function.mkdir]: File exists in /home/xxxx/public/www/php/mkdir.php on line 14 とエラーが出ます <? $chk = mkdir("mydir"); $chkr = mkdir("mydir_r", 0777); // 読み込みのみを許可 if ($chk) { echo "mydir を作成しました。 <br>\n"; } if ($chkr) { echo "mydir_r を作成しました。<br>\n"; } ?> 間違ってますでしょうか ご指導願いたいです

    • 締切済み
    • PHP
  • C言語でのディレクトリ作成についての質問です。

    C言語でのディレクトリ作成についての質問です。 Linuxコマンドのmkdir -pコマンドのようなことをC言語で実現したいのですが、 mkdir(dir1/dir2)のようにすると、エラーになってしまいます。 mkdir(dir1)のように階層でないディレクトリを指定した場合はうまくいくのですが・・・ mkdir関数では階層ディレクトリを1度で作成できないのでしょうか。 ディレクトリをたどってmkdirを1回ずつ使用しなければいけないのか、 階層ディレクトリを指定できる関数がほかにあるのか、 ご教授お願いいたします。

  • ディレクトリーが作成されないのは何故でしょう?

    実は、下のように記述して実行してもディレクトリーが作成されずに、その原因がわからないでいます。 <?php parse_str($_COOKIE[abc]); $dirc=$ck_data1; print $dirc; if(!file_exists($dirc)){ mkdir("$dirc"); } ?> 一応ディレクトリー名を確認するために、途中でprint $dirc;を入れて ディレクトリー名を確認しましたが、問題ないようでした。 $dircという変数を遣わないで、直接ディレクトリー名を入れると 問題なくディレクトリーは作成されます。     ↓ <?php parse_str($_COOKIE[abc]); $dirc=$ck_data1; print $dirc; if(!file_exists("test")){  //←testというディレクトリー名を直接入れると、問題なくディレクトリーが作成される。 mkdir("test"); } ?> 何とか、ディレクトリ名を変数で受けて作成したいのですが、 なぜ、変数で受けることができないのかがわかりません。 どなたか、詳しい方よろしくご指導お願いいたします。

    • ベストアンサー
    • PHP
  • phpから外部コマンドを使いたい

    外部コマンドを実行するために、phpのsystem()関数を使わせていただきました。 ところで、system('ls'); system('ls -l'); system('whoami');は、全部使えますが、 本当に使えたいsystem('unzip filename.zip');が使えないんです。 ApacheのUserは、nobodyです。 su nobodyにして、unzip filename.zipも使えるようなっております。 なぜ、phpから、system('unzip filename.zip'); は、使えないでしょうか? ご存じの方がいっらしゃいましたら、どうぞお教え下さい。

    • ベストアンサー
    • PHP
  • 別ユーザ所有のディレクトリ内にファイル作成できない

    こんばんは。 タイトルのとおりですが、まずPHPでディレクトリを作成し、 その中にindex.htmlを作成しようとしているのですが上手くいきません。 PHPで作成したディレクトリの所有者はapacheになっているためかと思い、 実際にFTPを通して自分で作成したディレクトリの中にindex.htmlを作成したところ上手くいきました。 ディレクトリのパーミッションはいずれもスクリプトにより0777を指定しています。 このように、PHPのみでディレクトリを作成し、その中にファイルを作成する といったことが出来ずにいます。解決策等ございましたらお教えください。 参考までに、ソースを掲載しておきます。 これを設置するディレクトリのパーミッションは0777にしてみましたが、出力は「fopen error」になります。 <?php $path = "./dir/"; if(mkdir($path, 0, true)){ chmod($path, 0777); if($fp = fopen($path."index.html", "w")){ fputs($fp, $put); fclose($fp); print "Created!"; }else{ print "fopen error"; } }else{ print "mkdir error"; } ?>

    • ベストアンサー
    • PHP
  • ドキュメントルートより上のディレクトリにあるPHPファイルをインクルードするには?

    外部に公開する必要がないディレクトリをドキュメントルートの外に置く構成のPHPプログラムを使用したいのですが、ドキュメントルートより上のディレクトリのPHPファイルをインクルードするにはどうすればよいのでしょうか? 例えば、DocumentoRootが/var/www/htmlで、 /var/www/html/test.phpから/var/www/data/include.phpをインクルードするようなケースです。 include.phpをtest.phpと同じディレクトリ(/var/www/html/)に置いた場合はインクルードできることを確認しています。 パーミッションは設定してあります。 phpinfo()でinclude_pathは「.:」となっています。 http.conf、php.ini等も編集することができる環境です。 ご存知の方がいらっしゃいましたら、アドバイスをお願いいたします。

    • ベストアンサー
    • PHP
  • PHPについての質問です

    PHPについての質問です PHPでフォームから画像をアップロードするプログラムを作成しています。 やりたいことは、 (1)ブラウザ上でフォームから画像をアップロード (2)アップロードした画像は、新しくディレクトリを作ってその中に格納する (3)そのディレクトリの管理者をwww-dataではなく、別のユーザに変えたい です。 この時、mkdir()でディレクトリを作成しようとすると、その親ディレクトリに書き込み権限がないとはじかれました。 あらかじめコマンドで親ディレクトリに外部からの書き込み権限を許すようにし、 先ほど作成したディレクトリの所有者がwww-dataとなっていたので、所有者を変えようとchown()をすると、 Operation not permitted in ...と出てしまい変えることができませんでした。 chown()で権限を変えようとしても、Operation not permitted ...と出てしまい変えることができません。 何かいい方法があると知っている方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • PHP