PHP:Windowsからsshを実行してLinuxにログインし、スクリプトを実行する
質問
これが私の目標です。 すべてのソースコードと開発データベースを備えたWindows XP PCがあります。 それを「pc.dev.XP」と呼びましょう。 Linuxを実行する宛先コンピューターがあります。 それを" pc.demo.Linux"と呼びましょう。 これが" pc.dev.XP"で行ったことです。 (ちょうどあなたがコンテキストを取得するように):
- すべてのcygwinのものをインストールしました
- 有効なrsaキーを作成し、destに配置します sshがしないようにコンピューターをバックアップする パスワードを尋ねる
- rsyncはこのようにうまく機能します
" pc.dev.XP"でこれを行おうとした場合コマンドライン経由:
cd \cygwin\bin
ssh Fred@pc.demo.Linux "cd /var/www && ls -al"
これはパスワードを要求せずに完全に機能します これが" pc.dev.XP"でやりたいことです:
- devを抽出するphpスクリプトを起動します。データベースをsqlファイルに
- このファイルを圧縮
- ftpを介して" pc.demo.Linux"に転送します
- " pc.demo.Linux"へのログ" unzipを実行してからmysql -e" source unziped file"
" pc.dev.XP"で実行する場合手動で:
putty -load "myconf" -l Fred -pw XXX -m script.file.that.unzip.and.integrates.sql
これは完全に機能します。 同じ:
cd \cygwin\bin
ssh Fred@dest "cd /var/www && ls -al"
php(" pc.dev.XP"にインストールされたwamp)でexec()しようとすると、それらのスクリプトがハングします。これは、ユーザーが「システム」であるためだと確信しています。 " Fred"ではなく、puttyまたはsshがパスワードを要求しますが、多分間違っています。
とにかく、私が説明したこれらの4つのタスクを自動化する方法を探していますが、exec()がハングするために立ち往生しています。 safe_exec_modeディレクティブまたはsafe_exec_dirディレクティブに問題はありません。開発マシンでは無効になっているため、exec(" dir")
などの基本的なものを試してみると、exec()は非常にうまく機能します。私ができること/確認/修正できることは何ですか?
解決 3
これが私がしたことです: バッチファイル:
- " php.exe my_extract_then_compress_then_ftp.php"経由でphpファイルを呼び出します
- rsyncを呼び出してソースフォルダーを同期します
- putty -l user -pw password -m file_with_ssh_commands_to_executeを呼び出します
これは魅力のように機能します。
他のヒント
これが必要かどうかはわかりませんが、通常、次のような構成を使用してマシン間でデータベースを同期します。
php extractFromDb.php | ssh user@remote.com "mysql remoteDatabaseName"
これはPHPスクリプトをローカルで実行し、スクリプトがSSH straigtを介して出力するSQLコマンドを、リモートデータベースで実行するリモートmysqlプロセスにパイプします。
圧縮が必要な場合は、SSHの-Cスイッチを使用するか、選択した圧縮プログラムの使用を次のように統合できます。
php extractFromDb.php | gzip -9 | ssh user@remote.com "gunzip | mysql remoteDatabaseName"
http://myWebserver.comにアクセスするように、Apacheで実行されているPHPからこれを実行したい/crazyScript.php そしてこれはすべて起こりますか?または、PHPでスクリプトを記述し、cmdライン経由で呼び出すだけですか?
最初の解決策が必要な場合は、これらすべてのタスクを実行するための資格情報を持つ別のユーザーでapache / issを実行してみてください。
"開発用PCで手動で実行した場合、これは完全に機能します。"。 なぜそうしないのですか?このスクリプトを実行すると、devマシン上のローカルSSHサーバーに接続していると想定します。これを行う場合、資格情報Fredを使用しているため、すべてが機能します。 PHPスクリプトを実行すると、おそらくSYSTEMとして実行されていることになります。
apacheを実行しているユーザーを変更するか、phpを使用してローカルsshに接続し、代替の資格情報を使用してください。