SSHログインできないサーバーからのWebサイト移行

何らかの理由で、Webサイトをそっくりそのまま別のサーバーに移行しなければならないとします。
通常は、

  1. 旧サーバーでコンテンツファイルやDBデータをExport
  2. 新サーバーをセットアップ
  3. 新サーバーでコンテンツファイルやDBデータをImport
  4. DNSのAレコードを新サーバーのIPアドレスに変更

という手順で移行します。

このとき、これまた何らかの理由で、旧サーバーに一切ログインできない場合はどうすればよいでしょうか。
このままでは、コンテンツファイルやDBデータを取り出せません。

このようなケースのひとつの解決手段としては、「クローラーツールを使って、Webコンテンツデータをすべて静的コンテンツデータとしてダウンロードする。」という方法があります。

isdwgetコマンドによるWebコンテンツデータのダウンロード

サーバーがLinuxであれば、クローラーはwgetコマンドを使うのが一番簡単です。
wgetコマンドによるコンテンツのダウンロード方法は、下記サイトの説明が詳しいです。

(参考)
wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・!
http://girigiribauer.com/archives/925

  $ wget --recursive \
    --level inf \
    --no-clobber \
    --random-wait \
    --restrict-file-names=windows \
    --convert-links \
    --no-parent \
    --adjust-extension \
    <ダウンロードするサイトのURL>

これで、静的なWebサイトだけではなく、Movable TypeやWordPressのようなCMSを使用したWebサイトでも、HTMLリンクでたどれる限り、Webサイトのデータをダウンロードできます。
クエリパラメータを使ったページのURLは、/index.html@q=123.html のようにちょっとカッコ悪くなってしまいますが、この際仕方ありません。

新サーバーでWebコンテンツをダウンロードできたら、ApacheなどのWebサーバーの設定を行い、Webブラウザで新サイトにアクセスし、表示やリンクが問題ないか確認します。

ダウンロードの取りこぼしがあれば、wgetコマンドで個別にダウンロードします。
JavaScriptでマウスオーバー時の画像切り替えを行っている場合などは、HTMLリンクがないため、wgetコマンドによるクロールでは取りこぼしてしまいます。

ページのリンクはすべて /aaa/index.html のようになってしまうので、これをやめて、/aaa/ としたい場合は、以下のように、findコマンドとsedコマンドを組み合わせて一括変換するとよいでしょう。

 # find . -type f -print | xargs sed -i "s/\/aaa/index.html/\/aaa\//g"

isd認証があるページの場合

BASIC認証やCookieによる認証があるサイト、ページの場合も、wgetコマンドでダウンロードできます。
下記サイトの説明が詳しいです。

(参考)
wgetで認証付きサイトをダウンロードする
http://webos-goodies.jp/archives/51277893.html

・BASIC認証の場合

  $ wget --recursive \
    --http-user=<ユーザー名> \
    --http-password=<パスワード> \
    --level inf \
    --no-clobber \
    --random-wait \
    --restrict-file-names=windows \
    --convert-links \
    --no-parent \
    --adjust-extension \
    <ダウンロードするサイトのURL>

・Cookieによる認証の場合

  $ wget --recursive \
    --header 'Cookie: name=value' \
    --level inf \
    --no-clobber \
    --random-wait \
    --restrict-file-names=windows \
    --convert-links \
    --no-parent \
    --adjust-extension \
    --reject-regex "\?logout" \
    <ダウンロードするサイトのURL>

–headerオプションで、Cookie情報を指定します。
CookieのセッションID name=value の値は、Firefoxの「開発ツール」を使うのが一番簡単だと思います。
Firefoxの「ツール」>「Web開発ツール」>「Webコンソール」でWebコンソールを開いたまま対象のサイトにアクセスし、ID、パスワードを入力してログインすると、Webコンソールで送信したCookieの情報を参照できます。
–headerオプションでは、Postパラメータを渡すこともできます。

また、–reject-regexオプションでログアウト処理のURLを正規表現で指定します。
上記は、ログアウト処理のURLが /?logout の場合の例です。
ページのどこかにログアウトのHTMLリンクが存在すると、wgetが「ログアウト」を踏んでしまい、その後はログアウトした状態でダウンロードしてしまうため、結果的にコンテンツデータが正しく取得できません。

isdwgetコマンドが古いバージョンの場合

CentOS 5など少し古いOSに入っているwgetコマンドでは、上記のオプションの一部に対応していないので、その場合は、例えば下記のように、新しいバージョンのwgetのソースからビルドしてインストールします。

 # cd /usr/local/src/
 # wget http://ftp.gnu.org/pub/gnu/wget/wget-1.15.tar.gz
 # tar zxvf wget-1.15.tar.gz
 # cd wget-1.15/
 # ./configure --with-ssl=openssl
 # make
 # make install

 # /usr/local/bin/wget --version

GNU Wget 1.15 built on linux-gnu.
...

これで、新しいバージョンのwgetが /usr/local/bin/wget としてインストールされます。

isdまとめ

SSHログインできないサーバーから別のサーバーにWebサイトを移行する場合の、「wgetコマンドでWebコンテンツデータをダウンロードする」という解決方法についてまとめました。

Webコンテンツデータを静的なページに落とせるので、AWSのS3ホスティングに移行することもできますね。
ただ、このままではページURLがちょっとカッコ悪いですし、コンテンツの更新などWebサイトを運用していくには大変ですので、CMSを導入するなど、根本的な解決が必要となるでしょう。

isd余談

PC向け老舗クローラーの「波乗野郎」というソフトがあります。
「波乗野郎」は僕が昔勤めていたビー・ユー・ジーという会社で開発、リリースしたソフトで、今でもたまに使っています。
Windows 8でも、インストーラexeファイルのプロパティで、互換モード「Windows XP」を指定すればインストールでき、問題なく動作します。

今回のような「Webサイトを丸ごとダウンロードする」という用途では、(20年前のインターネット回線向けに作られているので)クロールが遅いのと、CSSの@importに追従しないなどで取りこぼしがあるため、向いていませんが。。

僕は直接開発に関わってはいないのですが、20年近く前に開発されたソフトが今でも問題なく動くというのは、感慨深いものがあります。
きょうもよい波でした。

波乗メッセージ

Follow me!