wgetで質問です.

$ wget URL -O file
として,URLにあるファイルのリストをfileに書き出したいのですが,同じマシン上の別ユーザーで実行した場合で書き出す形式が異なります.
これはどこの環境設定に依存するのでしょうか?
ユーザーA
-----------------------------------
<HTML>
<HEAD>
<TITLE>Directory listing for ***</TITLE>
</HEAD>
<BODY>
<h2>Current directory is ***</h2>
<BR>
<HR>
<PRE>
<IMG SRC="http://**.gif"> <a href="ftp://***">..</a>
<IMG SRC="http://**.gif"> -rw-rw-r-- 1 1000 1000 67982 Apr 2 2007 <a href="ftp://***/file1">file1</a>
<IMG SRC="http://**.gif"> -rw-rw-r-- 1 1000 1000 67982 Apr 2 2007 <a href="ftp://***/file2">file2</a>
.....
-----------------------------------


ユーザーB
-----------------------------------
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>Index of *** on ***</title>
</head>
<body>
<h1>Index of *** on ***</h1>
<hr>
<pre>
2007 Apr 02 File <a href="ftp://**/file1">file1</a> (*** bytes)
2007 Apr 02 File <a href="ftp://**/file2">file2</a> (*** bytes)
....
-----------------------------------
よろしくお願いします.

回答の条件
  • 1人3回まで
  • 登録:2007/11/15 16:03:22
  • 終了:2007/11/17 01:00:59

ベストアンサー

id:cicupo No.4

cicupo回答回数13ベストアンサー獲得回数32007/11/15 20:33:24

ポイント120pt

# お返事が遅くなりすみません。

# 相変わらず以下の回答は自信はないのでポイントは結構です。

まず訂正なのですが、--save-headers は FTP だと何もヘッダが出力されないようです。てっきり HTTP の話だと思い込んでいましたもので、すみません。FTP の場合のヘッダも何かすれば保存できるのかもしれませんが。。

さて、意図しない設定に関しては、ともかくも

・オプション等何も付けずに実行している

・設定ファイル /etc/wgetrc や $HOME/.wgetrc の記述に問題ないか

というのを確認していただいて。。

質問者さんの例を見ると、Index の記述が全く異なる(一方は "Directory listing for"、もう一方は "Index of ...")ので、最終的に接続しているサーバが違うのかなぁと思いリングサーバということをご確認したのですが、良く考えると、同じマシンから同じリングサーバに接続しても同じサーバに接続するような気もしますね。。

他に考えられる点として、例えば proxy の設定ですが、wget の設定でプロキシが意図せず有効になってしまっているとして、その場合は --no-proxy などのオプションを付けてみるなどの対策が考えられます。

また、LANG が異なれば、"Index of ..." などの表記も異なる場合があるようです(ただし日本語か英語かというような違いなので質問者さんのケースとは別の話だと思います)。

リンクの形式については man wget をさらによく読むと、以下の記述を見つけました(長いので一部省略してます)。

       -k
       --convert-links
..省略..
           *   The links to files that have been downloaded by Wget will be
               changed to refer to the file they point to as a relative link.
..省略..
           *   The links to files that have not been downloaded by Wget will
               be changed to include host name and absolute path of the loca-
               tion they point to.
..省略..
           Because of this, local browsing works reliably: if a linked file
           was downloaded, the link will refer to its local name; if it was
           not downloaded, the link will refer to its full Internet address
           rather than presenting a broken link.  The fact that the former
           links are converted to relative links ensures that you can move the
           downloaded hierarchy to another directory.
..省略..

また、画像などを含めてすべてダウンロードするためのオプションとして --page-requisites があります。

長くなりましたが、参考までにこちらで --save-headers した時の出力は以下のようになります(ただし、FTPの場合は先頭に空白行が入るだけでした)。

Date: Thu, 15 Nov 2007 00:12:34 GMT
Server: Apache
Set-Cookie: Apache=********; path=/
Connection: close
Content-Type: text/html
Content-Language: ja

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:spry="http://ns.adobe.com/spry">
..省略..
id:taki

ありがとうございます.

まさに

> 他に考えられる点として、例えば proxy の設定ですが、wget の設定でプロキシが意図せず有効になってしまって

> いるとして、その場合は --no-proxy などのオプションを付けてみるなどの対策が考えられます。

でした.

.wgetrc でproxyの設定をしていなかったので,これは違うと思ってたのですが,--no-proxy であっさり解決しました.

本当にありがとうございます.

ソースまで見てくださったみたいで,本当にありがとうございます.

勉強になりました!

2007/11/17 00:56:12

その他の回答(4件)

id:cicupo No.1

cicupo回答回数13ベストアンサー獲得回数32007/11/15 17:08:13

ポイント10pt

あまり自信がないですが、相手方がリングサーバという可能性はありませんでしょうか?

以下のオプションでより詳しい情報が得られるのではないかと思います。

       -S
       --server-response
           Print the headers sent by HTTP servers and responses sent by FTP
           servers.

もしくは

       --save-headers
           Save the headers sent by the HTTP server to the file, preceding the
           actual contents, with an empty line as the separator.

当方は GNU Wget 1.10.2 です。

id:taki

ありがとうございます.

今回の場合,同じサーバでの現象なので,こちらの設定が問題なのだと思います.

ユーザーAの場合に,ファイルのリストの前に".."があったり,画像ファイルが挿入されるのはどこの設定かを知りたいのです.

こちらのバージョンも同じです.

そちらでは,どんな形式で出力されますか?

よろしくお願いします.

2007/11/15 17:40:21
id:yoshifumi1975 No.2

yoshifumi1975回答回数58ベストアンサー獲得回数102007/11/15 19:42:23

ポイント2pt

ユーザ毎で動作が異なるということは、$HOME/.wgetrc では無いでしょうか。

つまり、/home/ユーザA/.wgetrc や、/home/ユーザB/.wgetrc が無いか見てみてください。

id:taki

ありがとうございます.

すでに,~/.wgetrc はチェックしてます.

2007/11/16 15:26:24
id:bayan No.3

bayan回答回数100ベストアンサー獲得回数132007/11/15 19:45:22

ポイント20pt

URLがまったく同じなのに、吐き出した結果が違うということでしょうか?


(多分)上の階層に移動する .. とか、アイコンの画像とかは、

相手方のサーバーが用意しているもので、wget が出しているのではないと思います。


私も cicupo さんがおっしゃっているように相手方がリングサーバー等で、

異なるサーバーから受信している可能性を、まずは疑います。


同じサーバーというのはURLのホスト名の部分が同じということでしょうか?


同じサーバー名であっても複数のIPアドレスが割り当てられていて、その都度

違うサーバーに行っていることがあります。


またIPアドレスがひとつであっても、ロードバランサーやリバースプロキシが

代表窓口をやっていて、後背に複数のWebサーバーが隠れているという場合も

あると思います。


-S オプションで相手側の応答ヘッダや、ホスト名の解決(Resolving) の様子を

確認してみましたか?



差し支えなければURLを教えてもらえますでしょうか?

当方もGNU Wget 1.10.2 (Red Hat modified) が入っているので、

出力形式を確認するができると思います。

とここまで書いたのですが、ユーザーごとに環境が違うとすると、< br>

.wgetrc に何か書いてあるかもしれませんね。

ユーザーのホームディレクトリに .wgetrc はありますか?


例えば、user_agent が設定してあって、相手のサーバーが

ユーザーエージェントを見て出力を変えるということはあるかもしれません。


あとは http_proxy が設定してあって、プロキシが途中で改変しているとか。

id:taki

ありがとうございます.

$ wget -d ftp://ftp.riken.go.jp -O /tmp/outfile

で,ユーザー毎に結果が違います.

ちなみに,どのユーザーも~/.wgetrc は使用していません.

他の,~/.*rc の設定の違いかと思っているのですが・・・

2007/11/16 15:31:58
id:cicupo No.4

cicupo回答回数13ベストアンサー獲得回数32007/11/15 20:33:24ここでベストアンサー

ポイント120pt

# お返事が遅くなりすみません。

# 相変わらず以下の回答は自信はないのでポイントは結構です。

まず訂正なのですが、--save-headers は FTP だと何もヘッダが出力されないようです。てっきり HTTP の話だと思い込んでいましたもので、すみません。FTP の場合のヘッダも何かすれば保存できるのかもしれませんが。。

さて、意図しない設定に関しては、ともかくも

・オプション等何も付けずに実行している

・設定ファイル /etc/wgetrc や $HOME/.wgetrc の記述に問題ないか

というのを確認していただいて。。

質問者さんの例を見ると、Index の記述が全く異なる(一方は "Directory listing for"、もう一方は "Index of ...")ので、最終的に接続しているサーバが違うのかなぁと思いリングサーバということをご確認したのですが、良く考えると、同じマシンから同じリングサーバに接続しても同じサーバに接続するような気もしますね。。

他に考えられる点として、例えば proxy の設定ですが、wget の設定でプロキシが意図せず有効になってしまっているとして、その場合は --no-proxy などのオプションを付けてみるなどの対策が考えられます。

また、LANG が異なれば、"Index of ..." などの表記も異なる場合があるようです(ただし日本語か英語かというような違いなので質問者さんのケースとは別の話だと思います)。

リンクの形式については man wget をさらによく読むと、以下の記述を見つけました(長いので一部省略してます)。

       -k
       --convert-links
..省略..
           *   The links to files that have been downloaded by Wget will be
               changed to refer to the file they point to as a relative link.
..省略..
           *   The links to files that have not been downloaded by Wget will
               be changed to include host name and absolute path of the loca-
               tion they point to.
..省略..
           Because of this, local browsing works reliably: if a linked file
           was downloaded, the link will refer to its local name; if it was
           not downloaded, the link will refer to its full Internet address
           rather than presenting a broken link.  The fact that the former
           links are converted to relative links ensures that you can move the
           downloaded hierarchy to another directory.
..省略..

また、画像などを含めてすべてダウンロードするためのオプションとして --page-requisites があります。

長くなりましたが、参考までにこちらで --save-headers した時の出力は以下のようになります(ただし、FTPの場合は先頭に空白行が入るだけでした)。

Date: Thu, 15 Nov 2007 00:12:34 GMT
Server: Apache
Set-Cookie: Apache=********; path=/
Connection: close
Content-Type: text/html
Content-Language: ja

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:spry="http://ns.adobe.com/spry">
..省略..
id:taki

ありがとうございます.

まさに

> 他に考えられる点として、例えば proxy の設定ですが、wget の設定でプロキシが意図せず有効になってしまって

> いるとして、その場合は --no-proxy などのオプションを付けてみるなどの対策が考えられます。

でした.

.wgetrc でproxyの設定をしていなかったので,これは違うと思ってたのですが,--no-proxy であっさり解決しました.

本当にありがとうございます.

ソースまで見てくださったみたいで,本当にありがとうございます.

勉強になりました!

2007/11/17 00:56:12
id:hamster078 No.5

hamster078回答回数587ベストアンサー獲得回数42007/11/16 05:21:11

ポイント2pt

~/.wgetrcをコピーすれば同じになりますよ。

id:taki

ありがとうございます.

すでに,~/.wgetrc はチェックしてます.

2007/11/16 15:27:51
  • id:KuroNeko666
    linux なら /etc/wgetrc はチェックしたはず。

    ん…?
    URLにあるファイルのリストとは?
    リストを使うなら、-i オプションでは?

    wget -i filelist -o file [URL]

    あと、オプション -d をつけると wget がどういう動きをしているのか
    表示されます。デバッグモードです。

    wget -d [URL]

    どういうリクエストを送って、どういう内容が返ってきてるのか
    詳細にわかります。

    あと、環境変数に http_proxy が設定されているかどうか、
    チェックされましたか?
  • id:Bookmarker
    diff ~user1/.wgetrc ~user2/.wgetrc

    とすれば、違いがわかるのでは。
  • id:taki
    コメントありがとうございます.
    /etc/wgetrc
    ~/.wgetrc
    等はチェック済みです.

    $ wget URL -O file
    では,URL(ディレクトリ)の中にあるファイルのリストを,fileという名前のファイルに書き込むという事を考えています.

    個人的には,ユーザー毎の環境設定が問題だと思うのですが,.tcshrc等を同じにしても結果が変わらないのです・・・

    http_proxyの設定もチェックしています.
    wget -d を試してみます.

  • id:taki
    $ wget -d URL

    やってみました.

    Using `.listing' as listing tmp file.

    の様に, .listing を使うか使わないかが分かれ目の様です.
    明示的に .listing を使う様にするにはどうしたらいいんでしょう?

    よろしくお願いします.
  • id:Bookmarker
    環境変数も全て同じですか?

    user1% env | sort > /tmp/user1.env
    user2% env | sort > /tmp/user2.env
    % diff /tmp/user1.env /tmp/user2.env
  • id:cicupo
    .listing は ftp の際に ls -al したもの(ファイルのリストやディレクトリ構造?)を保存する一時ファイルのようです。動作を見た感じでは、ファイル名が衝突した場合、保存先ファイル名(index.html など)を使うようです。

    「.listingを使う様に...」という事は、ローカルにそのようなファイル名のファイル等があるということでしょうか? wget がファイル名を「決めうち」で使っているため、ローカル側に同じファイル名のファイル等があると色々と問題を起こすようです。

    例えば、サーバAの .listing を --no-remove-listing で削除しないでローカルに残したまま、同じディレクトリでサーバBに接続すると、出力結果が変わりました。時間が経ってサーバAのコンテンツが入れ替わった後に、古い .listing を残したまま同じサーバAに接続しても同じことが言えるはずです。

    .listing 自体は、キャンセルしたダウンロードを継続したりと利用価値があるようですが、もし問題なければローカルの .listing を削除して再度実行されてはいかがでしょうか。

    もし .listing がそもそもローカルに存在しないようであれば、、うーん。くどいですが、リングサーバやプロキシの可能性は消えていますでしょうか?
  • id:cicupo
    少し目線を変えて、
    「ユーザーAの場合に,ファイルのリストの前に".."があったり,
    画像ファイルが挿入されるのはどこの設定かを知りたいのです.」
    に対するコメントです。

    私の環境で例えば wget ftp://www.ring.gr.jp/ を実行した場合、ユーザBと同様の形式になりました。実行時メッセージにも出力される通り、これは wget が自前で HTML 化しているものです。

    この場合、".." は wget が判断して無視しています(オプション -v で 「Ignoring `.' and `..';」と表示されました)。

    一方でユーザA形式の出力は、apache などの Web サーバが自動的に作る DirectoryIndex に
    似ています。

    wgetのソース (1.10.2) を見るとユーザB形式の出力をしている箇所は見つかりますが、ユーザA形式のように img タグを出力している箇所は見当たりません。

    回答には至らず申しわけありませんが、ご参考まで。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません