質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

7648閲覧

phpのexec関数をApache経由で行う場合とコマンドプロンプトで行う場合の違いについて

annderber

総合スコア98

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/04/04 04:59

編集2018/04/05 07:23

お世話になります。

環境情報
・OS: Windows Server 2012 R2 Standard Edition
・php: 5.6
・Apache: 2.4

phpのexec関数を使用して、ネットワークドライブを接続する処理を行っている箇所があります。

php

1 exec('net use z: "\\192.168.1.1\test" password /user:test_user /persistent:no>nul 2>&1'); 2

この処理をwindowsのコマンドプロンプトから実行させるとうまくいくのですが、
Apache経由で処理を行うと接続処理がうまくいきません。

このような現象が起こる原因について教えていただけますでしょうか。
よろしくお願いいたします。

・・・・・追記

現状の状況としては

Apache経由での接続処理は別のパスで試したところうまくいきました。
なので、対象パスのログイン情報などが間違っているのかもと考えたのですが、コマンドプロンプトで実行する分にはうまくいっているのでそういうわけでもないようなのです。
なので現状問題の切り分けが出来ていない状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2018/04/04 07:17

「うまくいかない」とは、期待する動作は何で、実際にはどうなるのでしょうか?
otn

2018/04/04 07:51

エラーメッセージを捨てずに見ましょう。
annderber

2018/04/05 07:16 編集

お二人ともコメントありがとうございます。 最終的にやりたいことはネットワークドライブを接続して、そこにcsvファイルを置きたいという物ですが、 現状、ネットワークドライブにちゃんと接続できるかどうかでテストしています。 エラーメッセージを見るべきだとは思うのですが、なぜかエラーメッセージが取得出来ない状態です。 もう少し詳しい内容を加筆します。
otn

2018/04/05 07:18

もしかして、>nul の意味を分からず付けてますか?それが「エラーメッセージを捨てる」ということです。
annderber

2018/04/05 07:23

なるほど!「2>&1」を付けていればエラーメッセージが取得出来るものと考えていました。やはりコマンドの内容はしっかりと調べないといけないですね。ありがとうございます。
dodox86

2018/04/05 08:06

別のPATH、と言うのは、別のネットワークPATHをさしますか?それともローカルのPATHでしょうか。ちなみにWindowsサービスとしてApache2を動作させているのであれば、">"リダイレクトでエラー出力は得られません。
annderber

2018/04/05 08:21 編集

コメントありがとうございます。別のパスとは別のネットワークになります。>nulを付けると駄目だということは教えていただいてエラー取得できるようになりました。
dodox86

2018/04/05 08:25

別のネットワークPATHでOKでしたか。それであれば、私が思っていた原因と違うかもしないので回答は控えます。 "> LOGFILE" のようにリダイレクトでエラー内容を取得されようとしているのであれば、Windowsサービス下では空のファイルになってしまう可能性が大きいです。 それでも簡単に確認できるでしょうから、試してみていいかもしれません。(取れればそれでOK) リダイレクトでエラーが取れなければ、終了コード(ERRORLEVEL)でヒントを得られるかと。
annderber

2018/04/05 08:32 編集

コメントありがとうございます。ネットワーク関連は疎くて言葉の使い方が分かっていないのですが私が言った別のパスとは192.168.1.14のように同じネットワーク内の別の端末という意味なので、別ネットワークとは言えないですね。また、終了コードでヒントが得られるとは具体的にどういった取り方か教えていただけますでしょうか。PHPからとれるものでしょうか
dodox86

2018/04/05 08:40

まずは、当初予定していた">nul"をつけないでエラー出力を得られるかを確認しましょう。終了コードはphp のexecのリファレンスをみましょう。http://php.net/manual/ja/function.exec.php
asm

2018/04/05 08:42

PHPうろ覚えなんだけど、シングルクォートもエスケープ必要でしたっけ・・・?
annderber

2018/04/05 08:53

dodox86さん。コメントありがとうございます。ローカルの環境ではエラーメッセージが取得できるのを確認しました。ただ、現状対象のサーバー事態は近くにはないので、実際のエラーメッセージを確認することができないのが難点です
annderber

2018/04/05 08:54

asmさんありがとうございます。シングルクォートのエスケープは現在の処理では使用してないです。バックスラッシュはエスケープしていますが
dodox86

2018/04/05 09:00

netコマンドの(エラー含む)出力を得られたのであれば、質問に追記すればより有用な回答を得られると思います。(ただの心配に終わったようで、失礼しました)
annderber

2018/04/05 09:13

処理がうまくいってないサーバーは近くになくて、実際のエラーメッセージを取得できないのです。できれば色々調べようがあるのですが、、、、なので現状は事前に色々調べておいて現地で調査しながら試そうと考えています。
guest

回答4

0

実行ユーザーが違うとかですかね?

投稿2018/04/05 07:31

tekka

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/04/05 07:35

コメントありがとうございます。 質問文に追記したのですが、別のパスで行うとApache経由でもうまく行くのです。 なので、そのパスのログイン情報が間違いなのかもと思ったのですが、コマンドプロンプトから行うとうまくいくのです。 なので現状問題の切り分けができていません。エラーメッセージを取得して調査してみようと思っているのですが、対象のサーバーは簡単にいじれる訳ではないので、調査前になるべく情報を集めておきたい次第です
guest

0

よくあるのは、環境変数の違いです。
フルパスで書くと動くケースがあります。

投稿2018/04/04 05:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/04/04 05:32

コメントありがとうございます。 具体的にどこの環境変数が影響する可能性があるのでしょうか。 またフルパスで書くとはどこの部分を指していますでしょうか。
退会済みユーザー

退会済みユーザー

2018/04/04 05:39

コマンドにパスが通っていない可能性があります。 コマンドをフルパスで書いてみてください。
annderber

2018/04/04 06:21

フルパスで実行してみましたが、うまくいきませんでした。 他に何か原因は考えられますでしょうか。
退会済みユーザー

退会済みユーザー

2018/04/04 08:20

エラーをひらってみては?
y_waiwai

2018/04/05 07:28

うまくいかないとはどーゆーふーにうまくいかないのでしょう。 そのコードでコンソールにでもログ表示させて実際に実行しているのか見てみれば?
annderber

2018/04/05 07:32

コメントありがとうございます。 うまくいかないというのはネットワークドライブが接続されない。という意味です。 別の方のコメントでエラーメッセージの取り方が分かったので調査してみます。
guest

0

直接の回答ではないですし、外している可能性も高いですが、思いつくものをいくつか:

  1. 接続できない\192.168.1.1のPCはWindows Server 2012 と言うことですが、ユーザーアカウントの管理をActive Directoryで行っていたりしませんか? PC自体、ドメインコントローラーだったりしませんか?

  2. 接続できない\192.168.1.1のPCはWindows Server 2012 だったとして、"test_user"と言うユーザーは実際に存在するのでしょうか。Active Directoryではなかったとしても、ローカルPCアカウントだと簡単には認証できない気もします。(未確認です)

  3. 同じ接続できる別のPCは、Windows Serverではなく、Windows10などの普通のクライアントPC(ワークステーション)だったりしませんか?

  4. コマンドプロンプトからは接続OKだということは、そのコマンドプロンプトを開いたログオンユーザーのコンテキストが影響している可能性があります。

  5. Windowsサービスで稼動しているapache2内からnetコマンドをphpのexecで実行すると、ユーザーアカウントとしてはそのPCのローカルシステムアカウント"SYSTEM"が使われるはずです。

netコマンドのコマンドラインオプションで "test_user/password"を指定していますが、Windowsの認証はローカルPCで行うケースと、ActiveDirectory下でのドメインコントローラーで行うケースがあるので、デフォルトで使われているユーザー認証の為のコンテキストが異なっているのかもしれません。

apache2下で実行するnetコマンドの実行時のアカウントは、"ローカルPC\SYSTEM"となるはずなので、もし、繋ごうとしているPCがユーザー単位での認証でActive Directoryのネットワークへログオンしていたとしたら、\192.168.1.1\test へのアクセスに影響している気もします。

いずれにせよ、実機でエラーの内容を確認したら何かまた原因が分って進展を得られるかと思います。


補足です:2018/04/05 19:14

上記回答、「~していませんか?」などと問いかけ口調ですが、それへの回答を求めているわけではありませんので、お気づかいの必要はありません。(単に、気に留めてみてください程度の意味です)

投稿2018/04/05 10:02

編集2018/04/05 10:14
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/04/06 08:34

コメントありがとうございます。 色々教えていただきありがとうございました。
guest

0

自己解決

皆様のコメントのおかげで大変勉強になりました。
ありがとうございました。

その後の作業で無事ネットワークドライブの接続ができました。
結局のところ原因は指定していたドライブ名がすでに使用されていたというなんとも恥ずかしいものでした。。。

投稿2018/04/06 08:39

編集2018/04/06 08:39
annderber

総合スコア98

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2018/04/06 08:44

捨てずに得たエラーメッセージで原因が分かったのだと思いますが、深刻な理由でなくて良かったです。(レス不要です)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問