yuu_nkjm blog
2011-12-03(Sat) 編集
[FTP][openSUSE] コマンドラインからFTPSでFTPサーバ上のデータを取得
対話型だと自動処理に不向きなので,コマンドラインでFTPサーバからデータを取得したい.さくらインターネットでftpsが使える様になったということなので,ftpsによる接続を試みた.ncftpではftpsを扱えない様なので,FTPクライアントをlftpに代えた.
「Explicitモード(?)」の節が,うまくいったコマンドについて書いた部分である.
Implicitモード(?)
lftp -u user,passwd -e "mirror --only-newer --verbose /home/hoge/ /srv/www/repos/hoge" ftps://hoge.sakura.ne.jp:21
sakuraサーバはFTPSに990番ポートでなく21番ポートを使う様なので,ポート番号を指定する.
lftp -u hoge -e "debug 12" ftps://hoge.sakura.ne.jp:21 lftp hoge@hoge.sakura.ne.jp:~> ls ---- dns cache hit ---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中 `ls' (現在 0 バイト) [FEAT negotiation...] **** gnutls_handshake: A TLS packet with unexpected length was received. ---- コントロールソケットを閉じています ls: 致命的エラー: gnutls_handshake: A TLS packet with unexpected length was received.
上記の様なエラーが出て接続出来なかった.何でだろ….何かExplicitとImplicitとかいってた辺りが怪しい気がする.ひとまずwikipediaでも見てみる.
暗号化の種類
FTPSには、認証コマンド(AUTHコマンド)実行後に暗号化通信を開始するExplicitモードと、FTPSサーバ接続開始時点から暗号化通信を開始するImplicitモードの2種類が存在する。
Explicitモード
サーバに接続した後にクライアントがAUTHコマンドを実行して、使用するプロトコル(SSLまたはTLS)のネゴシエーションをおこない、適合したプロトコルでのハンドシェイク完了後に暗号化された通信がおこなわれる。 つまりExplicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する。
Implicitモード
サーバに接続した直後にSSLまたはTLSによるハンドシェイクがおこなわれる。 Implicitモードで動作するサーバに接続する場合、クライアントはサーバが採用している暗号化プロトコルに適合したFTPSクライアントソフトを使用する必要がある。 また、データ転送チャネル(PORTまたはPASVコマンドで作成されるチャネル)での通信を暗号化する場合、PROTコマンドを用いて保護レベルをP (Private) に設定する必要がある。
さくらインターネットの説明サイトにExplicitモードで接続する様に書いてあった.上記の蹴られ方を見ると,さっきはImplicitモードで接続しようとしていることになるのかな.「Explicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する」って書いてあるから,いきなりftpsを指定するのはこの説明に合わない気がする.語感としては,ftpsって指定する方がEplicitに思えるけど….
Explicitモード(?)
ユーザ毎の設定は~/.lftprcに,サーバ全体のlftpの設定は/etc/lftp.confに書く.
# ~/.lftprc set ftp:ssl-auth TLS set ftp:ssl-force true set ftp:ssl-allow yes set ftp:ssl-protect-list yes set ftp:ssl-protect-data yes set ftp:ssl-protect-fxp yes # set ssl:verify-certificate no サーバによってはこれが必要になるケースもある?
~/.lftprcに上記の様に記述し,以下のコマンドを実行した.先ほどと違うのは,ftpsではなくftpを指定した点である.
lftp -u hoge -e "debug 12" ftp://hoge.sakura.ne.jp lftp hoge@hoge.sakura.ne.jp:~> ls (snip) ---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中 <--- 220 ProFTPD 1.3.3c Server (SAKURA Internet FTP Server) [xxx.xx.xx.xxx] ---> FEAT (snip) ---> AUTH TLS <--- 234 AUTH TLS successful (snip)
"AUTH TLS successful"と出てるし,FTP over SSL/TLSが出来ていることが分かる.
ミラーリング用のスクリプト
# hoge-bkup.conf set ftp:ssl-auth TLS set ftp:ssl-force true set ftp:ssl-allow yes set ftp:ssl-protect-list yes set ftp:ssl-protect-data yes set ftp:ssl-protect-fxp yes # set ssl:verify-certificate no サーバによってはこれが必要になるケースもあるようだ. # 接続先のポート番号はftp://xxxxの後ろに:ポート番号で指定する. open -u hoge,passwd ftp://hoge.sakura.ne.jp debug 12 -o /tmp/lftp_hoge_bkup.log mirror --only-newer --verbose /home/hoge /srv/www/hoge
上記の様なスクリプトを作成し,lftpの-fオプションで渡して実行するようにした.パスワードを書き込むときは,そのファイルのアクセス権限に十分に注意する.
lftpのオプションは以下.-fと他のオプションの併用は出来ないようだ.
lftp -help 使い方: lftp [OPTS]`lftp' は rc ファイルを読み込んだあと最初に実行されるコマンドです -f ファイルで指定されたコマンドを実行し終了する -c コマンドを実行して終了する --help このヘルプを表示して終了する --version lftp のバージョンを表示して終了する 他のオプションは `open' コマンドのものと同じです -e 選択のすぐあとに指定のコマンドを実行する -u [, ] 認証で指定のユーザ/パスワードを使う -p 接続に指定のポートを使う ホスト名、URL あるいはブックマーク名
備考
残った疑問
lftp -v Libraries used: Readline 6.1
lftpのバージョン情報を表示させるとこんな感じ.ここでOpenSSLモジュールが組み込まれていると表示されないとFTPSが使えないと書いてある記事を見かけたのだが,どうなんだろう.
ncftp (ncftpget)
昔はncftpを使っていた.
ncftpget -u user -p 'passwd' -d /home/hoge/tmp/ncftp_hoge_bkup.log -T -R hoge.sakura.ne.jp /srv/www/repos/hoge /home/hoge
2012-12-03(Mon) 編集
[jQuery][WordPress] jQueryのTips
$のバッティングの回避
Uncaught TypeError: Property '%htmlEscapedText%apos; of object [object DOMWindow] is not a functionというエラーについて - by shigemk2などを参考のこと.自分が利用する場合はjQueryって直接指定すればいいんだけど,自分が利用しているjsはそうもいかない.jQueryのバージョンの混在などもめんどくさい問題を引き起こしそうだ.
セレクタで選んでeachした対象を処理するにはfind
[jQuery]eachとthisとfindの使いどころメモ | HappyQualityあたりを参照.
変数がundefinedか確認
if(typeof a === "undefined"){ alert("未定義") };