======lftpをWindows 10で使う====== [[windows:rsync|rsync が Windows 10 で無事動いた]] ので、気を良くして lftp もチャレンジしてみた。 ロリポップはライトプランで契約しているのでSSHが使えない。だが、FTPSは可能なので、[[https://ja.wikipedia.org/wiki/Lftp|Lftp]]を使ってFTPSでmirrorさせてみたい。 **lftp**\\ http://lftp.yar.ru/ **参考サイト**\\  [[https://tech.nikkeibp.co.jp/it/article/COLUMN/20140310/542302/|【lftp】FTPサーバに接続してファイルを転送する]]\\  [[https://www.itmedia.co.jp/enterprise/articles/0804/25/news014.html|lftpで行う手軽なバックアップ]]\\  [[https://server-setting.info/centos/lftp-sftp-mirror.html|lftp + sftp(ssh) でファイルの同期をとる]]\\  [[https://mag.osdn.jp/07/12/20/0054221|CLIマジック:lftpで行う手軽なバックアップ]]\\ =====lftp for Windowsのダウンロード===== lftpはWindowsをサポートしていないが、cygwinのDLLを使ったWindows版がある。\\ **LFTP for Windows**\\ https://nwgat.ninja/lftp-for-windows/ **chocolatey**でも同じものが見つかる(現時点で4.8.0)。\\ https://chocolatey.org/packages/lftp chocolatey用のインストールパッケージはこちら。\\  32bit - https://f001.backblazeb2.com/file/nwgat-cdn/lftp/win32/lftp-4.8.0.win32-openssl.zip\\  64bit - https://f001.backblazeb2.com/file/nwgat-cdn/lftp/win64/lftp-4.8.0.win64-openssl.zip\\ 「[[windows:rsync]]」でcygwinの32bit版DLLを%PATH%にインストールした。そこにlftpの64bit版をインストールすると、cygwinの64bit版DLLとのコンフリクトが起きてしまう。だから、lftpも32bit版をインストールする。chocoを使う場合には、 choco install --x86 lftp 自分でインストールする場合には、上記の32bit版ZIPファイルをダウンロードして解凍する。 2019/07/17 00:00 bin 2019/07/17 00:00 etc 2017/07/15 03:42 35,819 GPL.txt 2017/07/15 03:42 122 nwgat.ninja.url binフォルダの中身は 2017/07/15 03:42 795,677 bash.exe 2017/07/15 03:42 12,829 cygcom_err-2.dll 2017/07/15 03:42 2,058,269 cygcrypto-1.0.0.dll 2017/07/15 03:42 110,109 cyggcc_s-1.dll 2017/07/15 03:42 285,213 cyggssapi_krb5-2.dll 2017/07/15 03:42 1,034,269 cygiconv-2.dll 2017/07/15 03:42 42,525 cygintl-8.dll 2017/07/15 03:42 193,565 cygk5crypto-3.dll 2017/07/15 03:42 762,397 cygkrb5-3.dll 2017/07/15 03:42 39,965 cygkrb5support-0.dll 2017/07/15 03:42 313,373 cygncursesw-10.dll 2017/07/15 03:42 227,357 cygreadline7.dll 2017/07/15 03:42 432,669 cygssl-1.0.0.dll 2017/07/15 03:42 12,829 cygssp-0.dll 2017/07/15 03:42 1,473,053 cygstdc++-6.dll 2017/07/15 03:42 3,454,230 cygwin1.dll 2017/07/15 03:42 84,519 cygz.dll 2017/07/15 03:42 1,357,312 lftp.exe 2015/06/23 14:51 676,903 sh.exe 2017/07/15 03:42 727,581 ssh.exe 20 個のファイル 14,094,644 バイト binフォルダの内容をPATHの通ったフォルダにコピーしておく。 =====lftpの実行とエラーへの対処====== ====SFTP転送にチャレンジ==== せっかくなので、SFTP転送にもチャレンジしてみたい。もちろん、ライトプランのロリポップではなく、別のサーバーを相手にしてのチャレンジだ。 [[windows:rsync#.sshフォルダの準備]]、[[windows:rsync#鍵の生成と転送]]を行って、SFTPのためのSSHの準備をした。\\ lftp sftp://ftp.server.name lftp中で''ls''コマンドを実行してみたら、エラーになってしまった。\\ ''**`ls' at 0 [execl(/bin/sh) failed: No such file or directory]**'' デバッグモードで実行してみると、こんな出力行があった。\\ ''---- Running connect program (ssh -a -x -s -l user sftp.server.name sftp)''\\ 直接 ''ssh -a -x -s -l user sftp.server.name sftp)'' を実行してみた。 パスワード入力のあとで、\\ ''Permission denied, please try again.''\\ と出力された。sshをつかって、リモートでsftpを起動させているが、パーミッションが許可されていないようだ(ちなみに、このサーバーはさくらのスタンダードプラン)。\\ では、SSHログインに使っているユーザー名を指定してみた。 lftp -u user,password sftp://sftp.server.name 残念ながら変化なし。\\ SFTP転送は諦めざるを得なかった(仕様的にはできるはずなんだけど)。\\ SFTPが使える環境では[[windows:rsync|rsync]]を使えばいいので、ここは諦めることにした。\\ ====FTPS転送==== lftp ftps://ftps.server.name lftpのプロンプトでlsを実行してみると、\\ **''`ls' at 0 [Connecting...]''**\\ と表示して固まってしまった。 デバッグモードで実行してみると、\\ ''---- Connecting to ftps.server.name (XX.XX.XX.XX) port 990''\\ port 990 (FTPSのImplicitモード)に接続しようとしてタイムアウトしていることがわかった。 lftpは、プロトコルにFTPSを指定されると、Implicitモードでポート990に接続しようとする。ところが、サーバー側は(さくらもロリポップも)FTPSはExplicit(明示的)モード専用だったので、接続できない、というわけだ。\\ lftp -e "set ftp:ssl-force true;" ftp.server.name プロトコル指定なしだとデフォルトのFTPになるが、サーバーがFTPSに対応していればExplicit(明示的)モードでFTPSが使われる。ssl-forceをtrueに設定しておくと、サーバーがFTPSに対応していない場合には(パスワードの送信を拒否するため)エラーとなる。 lftpのプロンプトでlsを実行してみると、\\ **''`ls' at 0 [530 Login incorrect.]''**\\ アノニマス・ユーザーでは当然だめということか。FTPのユーザー名とパスワードを指定する。 lftp -e "set ftp:ssl-force true;" -u user,password ftp.server.name 再び ls を実行すると。\\ **''ls: Fatal error: Certificate verification: unable to get local issuer certificate (XX:XX...''**\\ というエラーが発生した。 [[https://github.com/enasequence/read_docs/issues/1|lftp to webin freezes at `ls' at 0 [Logging in...] #1]]\\ こちらによれば、SSLで接続している時に、証明書のサイト名とアドレスが合わないなどの場合にこのエラーになる。対策としては、 ''set ssl:verify-certificate no'' の指定を行って証明書のチェックを省く。 lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no" -u user,password ftp.server.name FTPのほうがFTPSよりオーバーヘッドが少なく、転送が短時間で終わるので、敢えてFTPプロトコルで転送したい場合もありそうだ。そんな場合は、''set ftp:ssl-allow off''を指定すれば良い。 ====フォルダの同期やバックアップ==== フォルダの同期やバックアップに使うのは mirror コマンドだ。 mirror [OPTS] [source [target]] ダウンロードは mirror remote local アップロードは mirror -R local remote **オプション**\\ ^省略表記^フル表記^意味^ |-e|--delete|リモートに存在しないファイルを削除する| |-n|--only-newer|新しいファイルのみダウンロードする| |-v|--verbose[=//level//]|冗長な出力を行う| |-x RX|--exclude //RX//|操作対象外のファイルを正規表現で指定する| |-X GP|--exclude-glob //GP//|操作対象外のファイルをグロブパターン(*.htmlなど)で指定する| |-R|--reverse|逆の同期(ファイルをアップロードする)| |-P|--parallel[=//N//]|N 個のファイルを並行してダウンロードする| | |--script=//FILE//|実行されるコマンドを FILE に書き込むが、実際には実行しない| | |--just-print, --dry-run|''–script=-''と同じ| mirror --delete --only-newer --verbose --parallel=2 source target mirror -env -P 2 source target [[https://www.linuxsecrets.com/discussions/732-lftp-mirror-command-exclude-matching-files-regex|Lftp Mirror Command Exclude Matching Files [ Regex ] ]]\\ **実行例** lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no; mirror -env -x data/cache /wiki /cygdrive/d/xampp/htdocs/wiki; bye" -u username,password ftps.server.lolipop.jp ロリポップのFTPサーバー(SFTPではない)に接続し、リモートの/wikiフォルダを、ローカルのD:\xampp\htdocs/wikiフォルダにコピーするが、キャッシュフォルダ(data/cache)は除外する。また、リモートにないファイルはローカルから削除し(-e)、新しいファイルだけダウンロードする(-n)。 ローカルフォルダについては''C:\folder''ではなく、''/cygdrive/c/folder''というcygwinスタイルのフォルダ指定を行う必要がある。 LFTPは -parallel オプションを使って並列で転送できるところがナイス。rsyncにはこういう技はできないみたいで、[[https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync|GNU parallelを使う]] とか [[http://wg.drive.ne.jp/rose/rsync-parallel/|スクリプトを書く]] などの手間がいる。 =====TIPS==== ====起動オプション==== lftpの起動オプション。 ^オプション^意味^ |-d|デバッグモードをONにする。| |-e //commands//|commandsを実行する(終了しない)。| |-u //user[,pass]//|ユーザー名とパスワードを指定する。| |--norc|ホームディレクトリのrcファイルを実行しない。| |--rcfile //file//|指定のrcファイルを実行する。| |-f //script_file//|スクリプトファイルを実行して終了する。| |-c //commands//|commandsを実行して終了する。| パスワードをコマンドラインに記述するのは避けた方が良いので、[[windows:netrc|~/.netrc]] を活用すべき。 ====コマンド一覧==== lftp :~> help ! (commands) alias [ []] attach [PID] bookmark [SUBCMD] cache [SUBCMD] cat [-b] cd chmod [OPTS] mode file... close [-a] [re]cls [opts] [path/][pattern] debug [OPTS] [|off] du [options] edit [OPTS] exit [|bg] get [OPTS] [-o ] glob [OPTS] help [] history -w file|-r file|-c|-l [cnt] jobs [-v] [] kill all| lcd lftp [OPTS] ln [-s] ls [] mget [OPTS] mirror [OPTS] [remote [local]] mkdir [OPTS] module name [args] more mput [OPTS] mrm mv mmv [OPTS] [re]nlist [] open [OPTS] pget [OPTS] [-o ] put [OPTS] [-o ] pwd [-p] queue [OPTS] [] quote repeat [OPTS] [delay] [command] rm [-r] [-f] rmdir [-f] scache [] set [OPT] [ []] site source torrent [OPTS] ... user [] wait [] zcat zmore ====.lftprc==== setコマンド類は、~/.lftprc(C:\home\ユーザー名\.lftprc)に記述しておけば、LFTPの起動時に読み込まれて実行される。 ====環境変数==== %SHELL%にcygwinのsh.exeのパスを指定しておくと、!//command// が使えるようになる(さもないと、''execlp(/bin/sh) failed: No such file or directory'' というエラーになる)。 ====include/excludeのファイル指定==== --include-rx-from=FILE --exclude-rx-from=FILE --include-glob-from=FILE --exclude-glob-from=FILE load include/exclude patterns from the file, one * ファイル名は /cygdrive/ で始まるパスで指定する(~/は使えない) * ファイルの改行コードはLFのみにする(そうしないとパターン末尾にCR(\r)が含まれてしまう)