Windows版 lftp をダウンロードする
Windows版 lftp は、複数あるようで、普通にftp,sftpぐらいがまともに動作するのは、個人的に確認できたのは以下の1つだけでした。
http://redpark.posterous.com/lftp-for-windows の
Download Link: lftp423win.7z (Dec 2011) です。
ダウンロードするファイルを間違えないようにしましょう。
このページにある
・Download Link: lftp407win.7z
・ehcanadian’s 4.3.5 Build: http://ham-tech.net/tools/lftp_v4.3.5_win32.zip
は、sftpが動作しませんでした。
ダウンロードしたら、解凍します。ここでは、Cドライブ直下に解凍したとして、以降、解説します。
Windows版 lftp を使ってみる
Windows版 lftp をMS-DOS プロンプトから直接使うと、以下のようにsftpでは、コマンドが一切動作しません。
C:\lftp423\lftp> lftp
lftp :~$ open sftp://hoge:hogepassword@11.22.33.44:22
lftp hoge@11.22.33.44:~$ ls
`ls' at 0 [Delaying before reconnect: 24]
...
|
ひたすら [Delaying … ] を繰り返します。
これは、/bin/sh が見つからずに ssh が正しく動作しないためのようで、bash 経由で実行してあげるうまくいきます。
C:\lftp423\lftp> bash
bash-4.1$ export PATH=.
bash-4.1$ lftp
lftp :~$ open sftp://hoge:hogepassword@11.22.33.44:22
lftp hoge@11.22.33.44:~$ ls
drwxr-xr-x 3 hoge hoge 4096 May 10 03:21 .
drwxr-xr-x 4 root root 4096 Apr 11 21:11 ..
-rw------- 1 hoge hoge 611 May 10 15:11 .bash_history
drwxr-xr-x 2 hoge hoge 4096 May 10 02:50 .ssh
-rw------- 1 hoge hoge 1372 Apr 11 22:17 .viminfo
lftp hoge@11.22.33.44:~$ exit
bash-4.1$ exit
exit
|
と、lsコマンドを実行すると、ちゃんとファイルリスト情報を出力してくれます。
さて、lftp の特徴であるスクリプトを使ってアクセスするには、どうすれば良いでしょう。
以下にバッチファイル(ここでは、C:\Temp\lftp.bat とします)を作ってみました。
@echo off
setlocal EnableDelayedExpansion
rem 必ず下に2行以上の改行を入れること、
set LF=^
rem Bシェルスクリプトファイル名(cgwin形式パス)
set TEMP_SH=/cygdrive/c/Temp/bash.sh
rem Bシェルスクリプトファイル名(MS-DOS形式パス)
set TEMP_SH_DOS="C:\Temp\bash.sh"
rem lftpシェルスクリプトファイル名(cgwin形式パス)
set TEMP_SCRIPT=/cygdrive/c/Temp/lftp.sh
rem lftpシェルスクリプトファイル名(MS-DOS形式パス)
set TEMP_SCRIPT_DOS="C:\Temp\lftp.sh"
rem lftp.exe のインストールパスを指定します。(cgwin形式のパスを指定します。)
set LFTP_PATH=/cygdrive/c/lftp423/lftp
rem bash.exe のインストールパスを指定します。(MS-DOS形式のパスを指定します。)
set BASH_PATH="C:\lftp423\lftp"
rem Bシェルへ渡すスクリプトファイルを作成します。改行コードはLFのみとします。
set /p DUMMY=#^^!/lftp/bash!LF!export PATH=%LFTP_PATH%!LF!lftp.exe -f "%TEMP_SCRIPT%"!LF!< NUL >%TEMP_SH_DOS%
rem FTP/SFTPのユーザ名を指定します。
set FTPUSER=ftp_user_name
rem FTP/SFTPのパスワードを指定します。
set FTPPASS=ftp_password
rem FTP/SFTPのポート番号を指定します。
set FTPPORT=22
rem FTP/SFTP プロトコル名を指定します。(ftp or sftp)
set FTPPROT=ftp
rem FTP/SFTPのホスト名を指定します。
set FTPHOST=ftp.exmaple.com
rem FTP/SFTPにてダウンロードするファイル名指定します。
set FTPFILE=download_file
rem FTP/SFTPサーバーのバックアップファイルの出力パスを指定します。
set BACKUPPATH=/home/user/backup
rem ローカルのバックアップダウンロードパスを指定します。(cgwin形式のパスを指定します。)
set DOWNLOADPATH=/cygdrive/c/Temp
rem lftpへ渡すスクリプトファイルを作成します。改行コードはLFのみとします。
set /p DUMMY=open %FTPPROT%://%FTPUSER%:%FTPPASS%@%FTPHOST%:%FTPPORT%!LF!cd %BACKUPPATH%!LF!lcd %DOWNLOADPATH%!LF!get %FTPFILE%!LF!bye!LF!< NUL >%TEMP_SCRIPT_DOS%
%BASH_PATH%\bash.exe --login -i %TEMP_SH%
|
以下は、上記のバッチで作成される一時的なBシェルスクリプトファイル、lftpスクリプトファイルの具体的な出力例です。いずれも改行コードは、LFのみとなります。
C:\Temp\bash.sh のファイル内容例
#!/lftp/bash
export PATH=/cygdrive/c/lftp423/lftp
lftp.exe -f "/cygdrive/c/Temp/lftp.sh"
|
C:\Temp\lftp.sh のファイル内容例
open ftp://ftp_user_name:ftp_password@ftp.exmaple.com:22
cd /home/user/backup
lcd /cygdrive/c/Temp
get download_file
bye
|
ここでのポイントは、各スクリプトファイルは、改行コードがLFとなることです。
通常のWindowsでは、CRLFで1つの改行とみなされますが、ここでは、Unixライクな環境なためLFのみでスクリプトファイルを作成する必要があります。
以下の図は、バッチファイルと上記のファイルの関連、lftpの起動までの流れを示した図です。
要は、以下のように処理が流れていきます。
バッチファイル起動 → bash 起動 → lftp 起動
そこで、
bashの起動で用いるBシェルスクリプトファイル(bash.sh)
lftpの起動で用いるlftpスクリプトファイル(lftp.sh)
を、それぞれバッチファイルで自動的に一時的に作成しています。
ちょっと、複雑・・・ですね。
正直、ちょっと面倒ですね。
やっぱり、Windows なら WinSCP を使った方が楽なようです。結局は、Bシェル経由なので、1クッションありますから、単純に手間ですよね。
もちろんバッチファイルでわざわざBシェルスクリプトファイルを作成する必要まではないですが、lftpスクリプトファイルは、ファイル名が固定でない限り作成する必要があります。
ここで、lftpスクリプトファイルをBシェルで作成できないのが、もどかしいところでもあります。ここで使えるBシェルは、あくまでシェルだけなので、コマンドがほぼ何も使えないんですよね。
cygwinでちゃんとインストールすればLinuxとほぼ同様にBシェルでやれますけどね。
いずれにしても、まだバックアップされていない方は、
ウェブ関連データのバックアップを自動化する の記事を参考に バックアップされることをおすすめします。
データが消えてからでは遅いですよ。
コメントを投稿 :