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

2011-12-02(Fri) [長年日記] 編集

[Apache][openSUSE] "client denied by server configuration"エラーとAllow from all

client denied by server configuration

というエラーが出る時は,当該ディレクトリに以下の様な許可が与えられているか確認する.

Order allow,deny
Allow from all

openSUSEには,デフォルトで以下の設定がされているので,注意する.

# /etc/apache2/httpd.conf
 
# forbid access to the entire filesystem by default
<Directory />
    Options None
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

2011-12-01(Thu) [長年日記] 編集

[Apache][git][openSUSE] Git over http (cloneはできたがpushできず)

WebDAVの設定

Gitリポジトリの作成

GitリポジトリをWebDAV(+https)経由で公開する - yamkazu-techの日記を参考にレポジトリを作る.

cd /git/nkjm /git/repos/nkjm
mkdir projects.git
cd projects.git
 
git --bare init
  Initialized empty Git repository in /git/repos/nkjm
 
vi description 
echo "http://hoge.nkjm.info/git/nkjm/projects.git" > cloneurl
printf "[gitweb]\n\towner = yuu_nkjm\n" >> config

HTTPからgitするための設定.

cp -a hooks/post-update.sample hooks/post-update
chmod +x hooks/post-update
git update-server-info
chown -R wwwrun:www /git/repos/nkjm/projects.git

ここで,"git update-server-info"が重要.Git のリモートリポジトリから HTTP で pull するためのメモ - akihiko’s tech note

Git over httpの設定

# lv /etc/httpd/conf.d/gitweb.conf
 
Alias /git/nkjm /git/repos/nkjm
<Location "/git/nkjm">
    Options Indexes
    DAV on
    AuthType Digest
    AuthName "xxxxxxx"
    AuthUserFile /hogehoge/.htdigest
    <Limitexcept GET HEAD PROPFIND OPTIONS REPORT>
        Require valid-user
    </LimitExcept>
</Location>

動作確認

git pull http://hoge.nkjm.info/git/nkjm/projects.git/ master

pullはうまくいった.

しかし,pushしようとすると以下のエラー…

git.exe push --progress  "origin" master:master
error: Cannot access URL http://hoge.nkjm.info/git/nkjm/projects.git/, return code 22
fatal: git-http-push failed

関連しそうな情報(githubにpushしようとしたらreturn code 22とか言われた - marblejenkaの日記)もあったけど,解決せず.

自前でGitを運用する気はいまのとこないし,HTTP経由で書き込ませたいこともどれだけあるか分からないし,今回は諦める.WebDavは便利なんだけど,昔からイジメられている気がする.


トップ 最新 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|