Posted on

Linuxからwindowsサーバーにファイルを渡す

あるプロジェクトで(PHPを動かして)Linuxで生成したCSVファイルをwindowsサーバーに渡さないといけない状況が発生しました。

まずLinuxからwindowsサーバーにファイルを渡せるの?という疑問から解決していきます。
googleで調べるとsmbclientというのを使うとwindowsの共有フォルダにアクセス出来るみたい!!

smbclientを使うにはLinuxとwindowsの両方に設定が必要みたいです。


まずLinux側にはsambaが入っていないといけないみたいで自分のサーバーにsambaが入っているか確認します。
サーバーで「rpm -q samba-client」と打ってみて「パッケージ samba はインストールされていません。」と出たらsambaをインストールします。
インストールは「yum install samba-client」を実行します。。
インストール後、改めて「rpm -q samba-client」と打ってみるとインストールされたsambaのバージョン「samba-client-3.0.33-3.39.el5_8」が表示されます。

次にwindows側では共有フォルダの作成をします。
とりあえずC:直下にshareというフォルダを作って右クリックで共有とセキュリティーを選びます。
出てきたウィンドウの共有のタブを選び、中の「このフォルダを共有する」をチェックします。
同じ画面のアクセス許可のボタンを押してEveryoneユーザーのフルコントロールに許可を与えてあげます。

下準備が出来たらLinux側でrootユーザーになって
smbclient ‘\\windowsサーバーのIPアドレス\share’ -U ユーザー名%パスワード
と入力します。すると「smb: \>」となるのでここでファイルの移動の命令文を入力します。
(Linuxで/var/www/html/testに20130810.csvというファイルを置いた状態で)
put /var/www/html/test/20130810.csv 20130810.csv
そうするとwindowsサーバーのC:\\shareの中に20130810.csvというファイルが出来ました。

Linuxからwindowsサーバーにファイルが渡せたので次にphpを実行した際に出来たCSVを自動的に移動する部分を作っていきます。
phpを実行してCSVを/var/www/html/testフォルダに20130810.csvと作成した後にシェルを呼び出すプログラムを書きます。
今回は実行した日をファイル名に持ったCSVを渡したかったので日付を動的に渡しています。

$day = date('Ymd');
exec("/usr/local/bin/move_csv.sh {$day} > /dev/null 2>/dev/null");

最後に実行シェルの記述ですがmove_csv.shの内容は

#!/bin/sh
day=$1
smbclient '\\windowsサーバーのIPアドレス\share' -U ユーザー名%パスワード -c "put /var/www/html/test/${day}.csv ${day}.csv"

これでphpを叩いたタイミングで自動的にwindowsサーバーにファイルが出来るようになりました。