[0] 恐らくは他に役に立たないであろう備忘。Linux上のPHPからwinexeを起動して他のWin機のコマンドを実行したい場合。-[Id of Radiance ver.5]





■ 恐らくは他に役に立たないであろう備忘。Linux上のPHPからwinexeを起動して他のWin機のコマンドを実行したい場合。

 色んな理由からLinuxからWindows(Server)の操作をしたい事があります。
 専用のAPIやらRPCやらを持ってるモノだったらそこに対してアクセスしますが、内部コマンドについて処理をしたい場合何らかのCLI系サーバをWin側で立ち上げるか、はたまたIISとASP等を経由して内部コマンドを実行、といった手段があります。

 そんな手法の1つ、「LinuxからWindowsのコマンドを直接実行する手段」としてsamba系のツール「winexe」があります。と言うかあることを最近知りました。これはWindowsで言うところの「psexec」に似ており、コマンドプロンプトで実行するようなコマンドを実行することができます。

 で、更にPHPのexec関数やらsystem関数やらを使う事でLinuxベースのWebアプリからWindowsの特定制御を行う事を試みたのが今回のお話です。そんなことしたい人間がどれだけいるかって話です(苦笑)。
 とりあえずLinuxはおなじみCentOS5系でPHPは5.1.6。WindowsはServer 2008 R2。winexeは1.00。

 winexeのインストールは割愛。ソースコンパイルして適当なbinにコピー。
 適当にコマンドテスト。

   winexe -U "Administrator%pass" --system //[HOST] ipconfig 1> /var/log/test_winexe.log

 とりあえず出力をファイルに書いてます。結果ipconfigの結果が素直に返って来て感動。但し今更SJIS。まあコマンドプロンプトだから仕方ないか。

 で、次にこれをPHPのexec関数から実行。

  exec("winexe -U \"Administrator%pass\" --system //[HOST] ipconfig 1> /var/log/test_winexe.log");

 …ところがコレが何時まで経っても応答が返ってこない。psでプロセス見るとコマンドは発行されて止まってる様子。killしないと残りっぱなし。
 ログファイルを見ると

   tevent: EPOLL_CTL_ADD failed (Operation not permitted) - falling back to select()

 というエラーが1行。
 「permitted」云々言ってるんでアクセス権かな、と思いsudoによるroot権限実行に変更。しかし変化無し。
 他の実行コマンド系はどうだろう、と「system()」「shell_exec()」を用いるものの変化無し。
 またコマンド内容をシェルスクリプトに移動し、そちらで起動しても変化無し。

 sudoでもそうだったがこういった場合標準出力関係でトラブる事が多いので、似た状況で稼働するcronでの起動を試す。ユーザはPHPの稼働環境と合わせる意味でapache。しかしコチラは無事に稼働。TTY及びapacheユーザ権限の問題の可能性が薄れる。

 仕方ないので(いや最初からやれよと)元々出ているエラーメッセージを追うことに。
 「EPOLL_CTL_ADD failed」はコネクション系のエラーぽい。しかしここで「Windows側に処理結果が残るバッチ」を作成して実行したところ、そちらの稼働は確認できた。つまるところ「コマンドを読んだ後の戻り」が上手く言ってない様子。

 そうなると、どちらかというと「PHPから起動した故にプロセスの戻りのパイプがよくわからんことになっている」という可能性があるのかなと。EPOLLについて調べてたらファイルディスクリプタがどうこう言われたし。
 なので上記シェルの起動を、プロセス単位で制御する「popen()」に変更。そしてポインタを開く際の権限モードを書き込み可能な「w」で動くように設定。

  $pp = popen("winexe -U \"Administrator%pass\" --system //[HOST] ipconfig 1> /var/log/test_winexe.log","w");
  pclose($pp);

 上記の様にしたところ、無事終了しつつ且つ結果も取れるようになりました。
 更に実験で上記popenの権限モードを読み専用の「r」に変更したところ、他のexecやらと同様に停止しつつプロセスに居残り、また同様のEPOLL_CTL_ADD系エラーが発生することを確認しました。


 まーこんな話が世の中役に立つかはアレですが、他の実行ファイルを起動する場合にも似たような話が発生する可能性はあるでしょう。まあ一例ってことで。

2012-09-01 [技術・作業]

関連記事: