PHPでSSHを利用して複数サーバに同じものをアップロードする



同じ構成のLinuxサーバに同じファイルを置くのが大変だったので試してみました。
scpコマンドだとコピーするごとにパスワードを聞かれないようにするのに工夫が必要だったので、
固定サーバにアップするだけなら引数だけ選んでアップしたいわということで作ってみました。

構成: Limux Mint12, PHP5.3.6, pecl 1.9.4

使い方

// スクリプトの引数にファイルを入れるとアップロードを行います
// $ php [script.php] [uploadfile]
// ex.
$ php deploy.php upfile.txt

PECLからssh2ライブラリダウンロード

PHPからSSHを開いてファイルをアップロードします。
先にPHPでssh2関連のライブラリをインストール。

$ sudo apt-get install libssh2-1
$ sudo apt-get install libssh2-1-dbg
$ sudo apt-get install libssh2-1-dev
$ sudo apt-get install libssh2-php
$ sudo pecl install ssh2-beta

PHPからSSHを利用してファイルをサーバに置く

<?php
/*
 * リストにあるサーバに対してSSHを開く、
 * 引数に与えられたファイルを転送する
 * usage: $ php deploy.php upfile.txt
 */

// アップロード先サーバ
$serveres = array(
  'www.hogehoge1.com',
  'www.hogehoge2.com',
  'xxx.xxx.xxx.xxx'
);
$up_dir = '/var/www'; // アップロード先ディレクトリ

if ( empty($argv[1]) ) { die ("引数にファイル名を入力してください\n"); }

foreach ( $serveres as $s ) :
    echo "connecting {$s}\n";
    $conn = ssh2_connect($s, 22);

    if (!$conn) die('Connection failed');
    
    // ssh接続
    if (!ssh2_auth_password($conn, 'user', 'password')) {
        die("ログイン拒否\n");
    }

    if (!ssh2_scp_send($conn, $argv[1], '/var/www/nginx-default/'.$argv[1]) ) {
        echo "転送失敗\n";
    }
    else {
        echo "転送完了\n";
    }

    ssh2_exec($conn, 'exit'); 
    unset($conn);
endforeach;

容量の小さいファイルはうまく動作したのですが、
30MぐらいのファイルをアップしようとするとWarningがでてアップできない現象が出ました。
どこかリミットがかかってるのかな・・・



コメントを残す