WinSCPスクリプト入門:コマンドやバッチファイルとの連携による自動処理

 SFTPやFTPS、SCPといったファイルの暗号化転送に対応するソフトの1つにWinSCPがある。WinSCPは使いやすいユーザーインターフェイスが特徴だが、GUIを利用せずにコマンドラインで操作したり、テキスト形式で記述された処理を実行するスクリプト機能(バッチ処理機能)なども備えている。本記事ではこのコマンド機能の基本的な使い方や、よく利用されると思われるコマンド機能を紹介する。

 WinSCPはFTP/SFTP/FTPS/SCPに対応したファイル転送ツールだ。かつてファイルのアップロード/ダウンロードにはFTPが使用されることが多かったが、FTPはログイン情報やファイルなどを暗号化せずにやり取りするため、通信内容を盗聴してこれらの情報を盗み出すことが可能である。そのため近年では、暗号化通信を行うSFTP/FTPSやSCPの利用を推奨されることが多い。

 SFTP/FTPS/SCPに対応するクライアントはいくつかあるが、WinSCPはフリーで利用でき、また使いやすいユーザーインターフェイスを備えているため人気が高い。海外で開発されているものの、メニューや各種メッセージなどは日本語化されているため、英語に不慣れなユーザーでも問題なく利用できる。

 WinSCPはGUIでの利用が一般的だが、実はコマンドプロンプトで対話的に各種コマンドを実行する「コンソールモード」も備えている(図1)。この機能はあまり知られていないが、ワイルドカードで処理対象のファイルを指定できるなど、状況によっては非常に有用だ。また、コマンドを記述したスクリプトファイルを読み込んで実行する機能もある。定型処理を自動的に実行する場合などに便利である。

図1 WinSCPのコンソールモード
図1 WinSCPのコンソールモード

 なお、WinSCPのインストールやGUIでの基本的な使い方についてはWindows用SCP/SFTPクライアント「WinSCP」の使い方、設定という記事にまとめられているので、そちらを参照して欲しい。

WinSCPをコマンドラインで利用する:コンソールモードでの起動

 WinSCPのインストールフォルダ(デフォルトではC:\Program Files\WinSCP以下)にインストールされている「WinSCP.com」を実行すると、WinSCPがコンソールモードで起動する。コンソールモードでは「open」や「get」、「put」といった各種コマンドを打ち込んで実行することで、ファイルの送受信やディレクトリの作成、パーミッションの変更といった各種処理を実行できる。

 たとえば、「172.27.4.89」というホストに接続するには次のように「open」コマンドを実行する。

winscp> open 172.17.4.69

 openコマンドを実行すると指定したホストへの接続が行われ、ユーザー名とパスワードの入力が求められる。また、相手が初めて接続するホストだった場合はここでホスト鍵の情報が表示され、確認が求められる。

コンソールモードで利用できる基本的なコマンド

 コンソールモードで利用できるコマンド一覧はWinSCP日本語Wikiの「コマンドリファレンスにまとめられている。コマンドの詳細についてはそちらに譲り、ここではこれらを使った基本的な使用例を紹介しておこう。これらのコマンドはWindowsに標準で搭載されているコマンドラインベースのFTPクライアント(ftpコマンド)や、Linux/UNIXなどのftpコマンドと似たコマンド体系となっているため、これらに慣れているユーザーならすぐに使いこなせるだろう。

 なお、ファイル名を指定する場合など、コマンドにスペースを含む引数を与える場合は引数を「”」(ダブルクォート)で囲む必要がある。また、ダブルクォートを含む引数を指定する場合、その引数全体をダブルクォートで囲った上で、引数内のダブルクォートを「””」(ダブルクォート2つ)に置き換えればよい

 たとえば「test “hoge”.html」というファイル名を引数として与える場合、次のように指定する。

"test ""hoge"".html"

ファイルのダウンロード

 次の例は、「172.17.4.69」というホストに「taro」というユーザーでログインし、「public_html」ディレクトリ内にあるすべてのHTMLファイル(拡張子が.htmlのファイル)をダウンロードする、というものだ。

リスト1 ファイルをダウンロードする例

winscp> open taro@172.17.4.69  ←172.17.4.69に「taro」というユーザーで接続
サーバを探索中・・・
サーバに接続しています・・・
認証しています・・・
ユーザ名"taro" を使用中
キーボード対話式認証を使用。
Password:  ←パスワードを入力
認証されました
セッションを開始しています・・・
リモートディレクトリを読み込み中・・・
セッションを開始しました
アクティブセッション: [1] taro@172.17.4.69  セッション番号「1」としてセッションを開始
winscp> cd public_html   ←「public_html」ディレクトリに移動
/Users/taro/public_html
winscp> lcd "%HOME%"  ←ローカルのカレントディレクトリをホームディレクトリに変更
C:\Users\taro
winscp> ls  ←リモート側のファイル一覧を表示
drwxr-xr-x  34 taro    taro         1156 Apr 14 17:24:12 2010 .
drwxr-xr-x 360 taro    taro        12240 Apr 14 17:23:54 2010 ..
-rw-r--r--   1 taro    taro         2886 Apr 14 17:24:12 2010 20061130-115028.html
-rw-r--r--   1 taro    taro         3712 Apr 14 17:24:12 2010 20061201-082224.html
 :
(省略)
 :
-rw-r--r--   1 taro    taro        25223 Apr 14 17:24:12 2010 index.html
winscp> get *.html  ←拡張子が「.html」のすべてのファイルをダウンロードする
20061130-115028.html      |          2 KiB |    0.0 KiB/s | ascii  | 100%
20061201-082224.html      |          3 KiB |    0.0 KiB/s | ascii  | 100%
 :
(省略)
 :
index.html                |         24 KiB |  948.2 KiB/s | ascii  | 100%
winscp> exit  ←WinSCPを終了する

 ここで使われているコマンドは次の表1のとおりだ。

表1 リスト1で使われているコマンド解説
コマンド名 説明
open ユーザー名@>ホスト</ディレクトリ> 指定したホストに接続する
cd <ディレクトリ> リモート側のカレントディレクトリを変更する
lcd <ディレクトリ> ローカル側のカレントディレクトリを変更する
ls リモート側のファイル一覧を表示する
get <ファイル名> リモート側のファイルをダウンロードする
exit <ファイル名> WinSCPを終了する

ファイルのアップロード

 次の例は、「172.17.4.69」というホストに「taro」というユーザーでログインし、リモート側の「public_html\image」ディレクトリ内のすべてのファイルを削除、続けてローカル側の「C:\Users\taro\work」ディレクトリ内にあるすべてのPNGファイルをアップロードする、というものだ。

リスト2 ファイルのアップロードを行う例

winscp> open taro@172.17.4.69  ←172.17.4.69に「taro」というユーザーで接続
サーバを探索中・・・
サーバに接続しています・・・
認証しています・・・
ユーザ名"taro" を使用中
キーボード対話式認証を使用。
Password:  ←パスワードを入力
認証されました
セッションを開始しています・・・
リモートディレクトリを読み込み中・・・
セッションを開始しました
アクティブセッション: [1] taro@172.17.4.69  セッション番号「1」としてセッションを開始
winscp> lcd %HOME%\work  ←ローカル側のカレントディレクトリをホームディレクトリ以下の「work」ディレクトリに変更
C:\Users\taro\work
winscp> lls  ←ローカル側のカレントディレクトリ内にあるファイル一覧を表示
2010/04/14  17:54    <DIR>          ..
2009/12/09  15:34           110,878 tw10.png
2009/12/09  15:28           101,226 tw3.png
2009/12/09  15:29           102,771 tw4.png
2009/12/09  15:29            97,119 tw5.png
2009/12/09  15:29            80,893 tw6.png
2009/12/09  15:30            42,430 tw7.png
2009/12/09  15:31         1,117,448 tw8.png
2009/12/09  15:31           100,047 tw9.png
winscp> cd public_html/image  ←「public_html/image」ディレクトリに移動
/Users/taro/public_html/image
winscp> rm *.png  ←拡張子が「.png」のすべてのファイルを削除
tw10.png
tw3.png
tw4.png
tw5.png
tw6.png
tw7.png
tw8.png
tw9.png
winscp> put *.png  ←拡張子が「.png」である全ファイルをアップロード
tw10.png                  |        108 KiB | 6517.5 KiB/s | binary | 100%
tw3.png                   |         98 KiB | 6552.7 KiB/s | binary | 100%
tw4.png                   |        100 KiB | 6457.3 KiB/s | binary | 100%
tw5.png                   |         94 KiB | 5106.9 KiB/s | binary | 100%
tw6.png                   |         78 KiB | 5078.0 KiB/s | binary | 100%
tw7.png                   |         41 KiB | 5518.8 KiB/s | binary | 100%
tw8.png                   |       1091 KiB | 5421.0 KiB/s | binary | 100%
tw9.png                   |         97 KiB | 5206.5 KiB/s | binary | 100%
winscp> exit  ←WinSCPを終了する

 ここで使われているコマンドは次の表2のとおりだ。

表2 リスト2で使われているコマンド解説
コマンド名 説明
lls ローカル側のファイル一覧を表示する
put <ファイル名> 指定したファイルをアップロードする
rm <ファイル名> リモート側にある指定したファイルを削除する

ディレクトリの同期

 ローカルディレクトリ内のすべてのファイルをアップロードしたい、といった場合には「synchronize」コマンドが便利だ。このコマンドは指定したローカルディレクトリとリモートディレクトリの内容を比較し、更新されたファイルのみを転送するものだ。UNIX/Linuxではファイルの同期に「rsync」というコマンドがよく利用されるが、それと同様の目的に利用できる。たとえば、ローカルディレクトリとリモートディレクトリを比較してリモートディレクトリを更新する(更新されたファイルをアップロードする)には、対象とするホストにログインしたのち、「remote」オプション付きでsynchronizeコマンドを実行する。

synchronize remote <ローカルディレクトリ> <リモートディレクトリ>

 逆にローカルディレクトリ側を更新するには「local」オプション付きでコマンドを実行すればよい。

synchronize local <ローカルディレクトリ> <リモートディレクトリ>

 次の例は、ローカル側の「C:\Users\taro\work」とリモート側の「/Users/taro/public_html」を同期させる例だ。「remote」オプションが指定されているため、リモート側にないファイルがリモート側にアップロードされている。

リスト3 「C:\Users\taro\work」と「/Users/taro/public_html」の同期

winscp> open taro@172.17.4.69  ←172.17.4.69に「taro」というユーザーで接続
サーバを探索中・・・
サーバに接続しています・・・
認証しています・・・
ユーザ名"taro" を使用中
キーボード対話式認証を使用。
Password:  ←パスワードを入力
認証されました
セッションを開始しています・・・
リモートディレクトリを読み込み中・・・
セッションを開始しました
アクティブセッション: [1] taro@172.17.4.69  セッション番号「1」としてセッションを開始
winscp> synchronize remote C:\Users\taro\work /Users/taro/public_html
比較中...
ローカル 'C:\Users\taro\work' => リモート '/Users/taro/public_html'
同期中...
ローカル 'C:\Users\taro\work' => リモート '/Users/taro/public_html'
C:\...\taro\work\add.css |          0 KiB |    0.0 KiB/s | ascii  | 100%
C:\...\work\design.css    |          0 KiB |    0.0 KiB/s | ascii  | 100%
C:\Users\taro\work\image |          0 KiB |    0.0 KiB/s | ascii  |   0%
C:\...\image\tw10.png     |        108 KiB | 3498.1 KiB/s | binary | 100%
C:\...\work\image\tw3.png |         98 KiB | 4410.5 KiB/s | binary | 100%
C:\...\work\image\tw4.png |        100 KiB | 4883.4 KiB/s | binary | 100%
C:\...\work\image\tw5.png |         94 KiB | 4281.9 KiB/s | binary | 100%
C:\...\work\image\tw6.png |         78 KiB | 4417.4 KiB/s | binary | 100%
C:\...\work\image\tw7.png |         41 KiB | 4797.5 KiB/s | binary | 100%
C:\...\work\image\tw8.png |       1091 KiB | 5173.7 KiB/s | binary | 100%
C:\...\work\image\tw9.png |         97 KiB | 3537.0 KiB/s | binary | 100%
C:\...\work\index.html    |         47 KiB | 3636.1 KiB/s | ascii  | 100%
C:\...\work\local.css     |          3 KiB | 3534.6 KiB/s | ascii  | 100%
C:\...\work\sample.html   |         76 KiB | 3687.1 KiB/s | ascii  | 100%
C:...\sample_network.html |         49 KiB | 3669.1 KiB/s | ascii  | 100%
winscp> 

 ローカル側でいくつかのファイルを変更したのち再度同じコマンドを実行すると、今度は変更されたファイルのみが転送される。

winscp> synchronize remote C:\Users\taro\work /Users/taro/public_html
比較中...
ローカル 'C:\Users\taro\work\image' => リモート '/Users/taro/public_html/image'
同期中...
ローカル 'C:\Users\taro\work' => リモート '/Users/taro/public_html'
C:\...\taro\work\add.css |          0 KiB |    0.0 KiB/s | ascii  | 100%
C:\...\work\design.css    |          0 KiB |    0.0 KiB/s | ascii  | 100%
C:\...\work\index.html    |         47 KiB | 3249.3 KiB/s | ascii  | 100%
winscp> 

ファイルの自動同期

 リモートのWebサーバー上のファイルを確認しながら更新する場合など、ファイルの編集とアップロードを繰り返し行う場合に便利なのが「keepuptodateコマンドだ。keepuptodateコマンドを実行すると、引数で指定したローカルディレクトリ中のファイルを監視し、更新されたファイルを自動的にリモート側にアップロードする(図2)。

図2 ファイルの自動アップデート
図2 ファイルの自動アップデート

 なお、keepuptodateコマンドの実行を終了するにはCtrl+Cキーを押せば良い。

 たとえばローカル側の「C:\Users\taro\work」というディレクトリとリモート側の「public_html/work」というディレクトリを自動同期するには次のようにする。

リスト4 「C:\Users\taro\work」と「public_html/work」の自動同期

winscp> open taro@172.17.4.69  ←172.17.4.69に「taro」というユーザーで接続
サーバを探索中・・・
サーバに接続しています・・・
認証しています・・・
ユーザ名"taro" を使用中
キーボード対話式認証を使用。
Password:  ←パスワードを入力
認証されました
セッションを開始しています・・・
リモートディレクトリを読み込み中・・・
セッションを開始しました
アクティブセッション: [1] taro@172.17.4.69  セッション番号「1」としてセッションを開始
winscp> keepuptodate C:\Users\taro\work public_html/work
変更を監視しています。終了するにはCtrl-Cを押してください...

コマンドラインオプションの活用とバッチファイル連携

 WinSCPにはさまざまなコマンドラインオプションが用意されており、これらを利用することでWinSCPの起動直後に自動的に指定したサーバーに接続したり、ファイルのアップロードやディレクトリの同期を行うことができる。また、後述するスクリプト機能を利用することで、複数のディレクトリへのアップロードやファイルの削除といった比較的複雑な処理も自動で実行できる。

同期を行う「/synchronize」コマンドラインオプション

 「/synchronize <ローカルディレクトリ> <リモートディレクトリ>」というオプションを利用すれば、WinSCPの起動直後に指定したディレクトリ間の同期を実行することができる。

 次の例は「taro」というユーザーで「172.17.4.69」というホストに接続し、ローカル側の「C:\Users\taro\work」というディレクトリとリモート側の「/Users/taro/public_html」というディレクトリを同期させるものだ。

> "C:\Program Files\WinSCP\winscp.exe" taro@172.17.4.69 /synchronize "C:\Users\taro\work" "/Users/taro/public_html"

 なお、/synchronizeの代わりに「/keepuptodate」オプションを使用すれば、前述のkeepuptodateコマンドと同様の処理を行うこともできる。

ファイルのアップロード

 「/upload <ファイル1> <ファイル2> …」オプションを利用すれば、指定したファイルをアップロードできる。次の例は、「taro」というユーザーで「172.17.4.69」というホストに接続し、ローカル側の「C:\Users\taro\work\index.html」というファイルをリモート側の「/Users/taro/public_html」というディレクトリにアップロードするものだ。

"C:\Program Files\WinSCP\winscp.exe" taro@172.17.4.69/Users/taro/public_html/ /upload "C:\Users\taro\work\index.html"

スクリプトファイルを利用する

 /synchronizeや/keepuptodate、/uploadといったオプションでは単純な処理しか実行できないが、もしそのような処理を実行したい場合はスクリプトファイルを利用すればよい。「/script=<スクリプトファイル名>」オプション付きで実行すると、WinSCPの起動と同時に指定したスクリプトファイルが読み込まれ、記述されたコマンドが順に実行される。これにより、ファイルのアップロードや同期といった処理を自動的に行うことが可能だ。

 なお、 /scriptオプションを指定する場合、コンソールモードでWinSCPを起動させる「/console」オプションも併用しないとうまく動作しない場合があるようなので注意して欲しい。

 たとえば次のリスト5は、指定したサーバーに接続して特定のディレクトリにファイルをアップロードするスクリプトだ。

リスト5 ファイルをアップロードするスクリプトの例

option batch on    ←バッチモードをOnにする
open taro@172.17.4.69 ←「taro」というユーザーで「172.17.4.69」に接続する
cd public_html/work2  ←リモート側の「public_html/work2」ディレクトリに移動
lcd C:\Users\taro\work ←ローカル側の「C:\Users\taro\work」ディレクトリに移動
synchronize remote   ←リモート側のファイルをローカル側のファイルに同期
exit          ←終了

 このスクリプトを実行するには、コマンドプロンプトもしくはバッチファイル中から次のように実行する。

"C:\Program Files\WinSCP\winscp.exe" /console /script="<スクリプトファイル名>"

スクリプト内で環境変数や引数を利用する

 WinSCPのコンソールモードやスクリプト内では、次のようにして環境変数を参照することができる。

%<環境変数名>%

 たとえば、環境変数「TARGET」で指定したファイルをアップロードするには、次のようにすればよい。

put "%TARGET%"

 また、スクリプトに対し引数を与えて実行することもできる。引数を与えるには、次のように「/parameter」コマンドラインオプションを使用する。

"C:\Program Files\WinSCP.exe" /console /script=<スクリプトファイル> /parameter <パラメータ1> <パラメータ2> ...

 「/parameter」オプションで与えた引数は、順番に「%1%」「%2%」……という変数に格納され、上記の環境変数と同様にアクセスできる。たとえば次のスクリプトは、引数で与えたファイルをアップロードする例だ。

リスト6 指定したファイルをアップロードするスクリプト

option batch on    ←バッチモードをOnにする
open taro@172.17.4.69 ←「taro」というユーザーで「172.17.4.69」に接続する
cd public_html/work2  ←リモート側の「public_html/work2」ディレクトリに移動
put "%1%"     ←引数で指定したファイルをアップロード
exit          ←終了

今回紹介したツール:WinSCP