2009年11月16日

■ いますぐ実践! Linux システム管理 / Vol.169

─[PR]─────────────────────────────────
:            12月末まで20%OFF権

:      あのクワトロ・ジャイアントを1800円ですぐお届け!!!

:     ドミノ・ピザ & まぐまぐ限定  → http://a.mag2.jp/iHay
─────────────────────────────────[PR]─


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ いますぐ実践! Linux システム管理 / Vol.169 / 読者数:1386名
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

こんばんは、うすだです。

なんだったかは忘れましたが、無料のサービスを受けるため、某転職情報
サイトに登録してから、求人情報のメールが届くようになりました。

いま、特に転職したいというわけではないのですが、どういう会社がなに
を募集しているのかというのは気になりますので、たまに眺めています。

で、見ていて思うのが、どの会社さんも、社名にインパクトがなくて記憶
に残らない、ということです。(ものすごく失礼ですみませんが…。)

多いのが、あまり聞いたことのない横文字の名前とか、ありきたりすぎる
名前(システムなんとか、なんとかテクノロジーなど)、それと、長い社名
を短縮したアルファベット3文字、などでしょうか。

でも、そんな中、ありふれた横文字単語の組み合わせでも、組み合わせが
面白い社名に出くわすことがあります。
そうしますと、なんでそんな名前にしたんだろうと思い、中身をじっくり
見てしまいます。(思うツボですよね…)

ちなみに、個人的におおっと思ったのは、「バイナリーラブ」です。
バイナリーをラブですよ。すごい発想ですよね。
(例がないとアレだと思い、意を決して書いてみました。どきどき。)

それはさておき、では、超メジャーな会社の社名はどうなんだろうか? と
いう疑問が、個人的に沸いてきました。

グーグル、ヤフー、マイクロソフト、アップル、ソフトバンク、インテル
…などなど、社名が普通名詞的になっている会社がたくさんあります。
それらをあらためて見てみますと、そういう意味だったのかとか、意外と
ぱっとしないなあとか、いろいろ考えられて、興味深いです。

…というわけで、いくつか分類しようとしたのですが、凝っている社名も
そうでない社名もあり、これっていう傾向は見られておりません。
結局、知られているかどうかが重要、なのかもしれませんね。

以上、スタート地点戻ったところで、今回もはりきってまいります!!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 今回のお題 - alien でパッケージを変換する
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ひとくちに Linux と言いましても、さまざまなディストリビューション
が世の中には存在しております。

ですが、使用するパッケージの形式は、RedHat 系ですと RPM、Debian
ですと deb と、ディストリビューションの数ほどには存在しません。

ですので、他のディストリビューション用のパッケージを試してみたら、
意外と問題なく使えた、といったことが少なからずあるように思います。

とはいえ、Debian を使っているのに、RPM パッケージしかない場合は、
途方に暮れてしまいますよね。(もちろん、逆も同様ですが。)

しかし、みなさん、ご安心ください。
そんな貴兄のために、パッケージを変換してくれる、便利なツールが存在
します。それは、alien さんです。

alien
http://kitenet.net/~joey/code/alien/

今回は、この alien さんを使って、手軽にパッケージを変換する方法を
ご紹介したいと思います。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ パッケージを変換する

もちろん、まずは、alien パッケージが必要です。
しかし、残念ながら、Debian 系にはありますが、RedHat 系にはないよう
です。申し訳ありませんが、RedHat 系の貴兄は、指をくわえて見ていて
ください。(あるいは、ソースを入手してコンパイルしてみてください。)

$ sudo apt-get install alien


さて、基本的な使い方ですが、いたって簡単です。
変換したい形式をオプションで指定するだけです。

変換できる形式は、deb や rpm はもちろん、Stampede Linux の slp や
Slackware の tgz、そして Solaris の pkg にまで対応しています。
(といっても、Stampede なんていうのは初めて知りましたが…。)

それぞれ、オプションは、--to-パッケージ名 になります。
たとえば、foo-0.0.1-1.fc12.i386.rpm を deb パッケージに変換したい
場合は、以下のように実行します。

……………………………………………………………………………………
$ alien --to-deb foo-0.0.1-1.fc12.i386.rpm
Must run as root to convert to deb format (or you may use fakeroot).
……………………………………………………………………………………

おっと、root で実行するか、fakeroot を使えと言われてしまいました。
穏便に、fakeroot を使ってみたいと思います。

……………………………………………………………………………………
$ fakeroot alien --to-deb foo-0.0.1-1.fc12.i386.rpm
foo_0.0.1-2_i386.deb generated
……………………………………………………………………………………

…ああ、今度は大丈夫です。


逆に、deb パッケージから RPM パッケージへの変換は、--to-rpm という
オプションでできます。
以下では、bar_0.0.2-35_i386.deb を RPM パッケージに変換します。

……………………………………………………………………………………
$ alien --to-rpm bar_0.0.2-35_i386.deb
Warning: alien is not running as root!
Warning: Ownerships of files in the generated packages will \
probably be wrong.
……………………………………………………………………………………

エラーにはなりませんが、非root で実行すると都合が悪そうです。
同様に、fakeroot でオブラートに包みます。

……………………………………………………………………………………
bar-0.0.2-36.i386.rpm generated
$ fakeroot alien --to-rpm bar_0.0.2-35_i386.deb
bar-0.0.2-36.i386.rpm generated
……………………………………………………………………………………


同じようにして、slp や tgz への変換も可能です。
ただし、pkg への変換は、pkgproto というコマンドがない! と言われ、
エラーになってしまいますので、できませんでした。

……………………………………………………………………………………
$ fakeroot alien --to-pkg baz-0.0.3-99.noarch.rpm
sh: pkgproto: not found
error during pkgproto:
……………………………………………………………………………………

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ ところでちゃんと動くかな

変換だけしても、実際にインストールや動作に失敗していては、元も子も
ありませんよね。というわけで、確認してみましょう。

前回、John the Ripper をご紹介しましたが、残念ながら Fedora にしか
パッケージがないようだ、とお伝えしました。

では、alien さんで deb パッケージを作ってみましょう。
ちなみに、john さんの RPM パッケージは、以下を使用しました。

ftp://rpmfind.net/linux/fedora/releases/10/Everything/i386/os/Packages/john-1.7.0.2-6.fc9.i386.rpm

deb パッケージの作成手順は、先ほどと同様です。
インストールもしてしまう場合は、--install オプションをつけます。

……………………………………………………………………………………
$ sudo alien --to-deb --install john-1.7.0.2-6.fc9.i386.rpm
……………………………………………………………………………………

問題なく、インストールが行われました。

そして、前回の手順にしたがって、動作させてみます。
test3 ユーザに対して、single crack mode を試してみますと、あっさり
発見していただけました。問題なさそうです。

……………………………………………………………………………………
$ sudo unshadow /etc/passwd /etc/shadow > privpasswd
$ chmod 400 privpasswd
$ john --single --users=test3 privpasswd
Loaded 1 password hash (FreeBSD MD5 [32/32])
test3 (test3)
guesses: 1 time: 0:00:00:00 100% c/s: 4.54 trying: test3
……………………………………………………………………………………

ちなみに、SHA512 には未対応のようです。
(おそらく、DES と MD5 だけのような…前回は気づきませんでした。)

……………………………………………………………………………………
$ john --users=test1 privpasswd
No password hashes loaded
$ grep test1 privpasswd
test1:$6$2zjoH...:1001:100::/home/test1:/bin/bash
……………………………………………………………………………………

さらにちなみに、ホームの下にファイルが作られるようです。

……………………………………………………………………………………
$ ls ~/.john/
john.log john.pot
……………………………………………………………………………………


ただ、なんでもかんでもうまくいく、というわけではなく、いくつか確認
した限りでは、環境の違いによりうまく動作しない、ということが何度か
見受けられました。

たとえば、alien そのものの deb パッケージを RPM パッケージに変換し
ますと、Perl のライブラリが /usr/share/perl5 以下に入ります。
ですが、RedHat 系では /usr/share/perl5 を参照しないようですので、
alien を実行しますと、以下のように叱られてしまいます。

……………………………………………………………………………………
$ alien --to-deb dnotify-0.18.0-1.i386.rpm
Can't locate Alien/Package/Deb.pm in @INC (@INC contains: ...) \
at /usr/bin/alien line 296.
BEGIN failed--compilation aborted at /usr/bin/alien line 296.
……………………………………………………………………………………

上記の問題は、perl -I/usr/share/perl5 などとすることで回避できます
が、他にも問題はありますので、その都度対応する必要があります。
(ちなみに、alien の場合、上記で回避しても、他の問題で引っかかり、
すんなりとは動作してくれません。残念…。)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ tgzからパッケージを作る

さて、tgz への変換が可能ということは、tgz をパッケージにできる、と
いうことでもあります。

昔、RPM や deb パッケージを無理やり作る方法をご紹介しました。
ですが、alien を使えば、あれこれする必要はありません。

苦労して考えたのになーという釈然としない気持ちは置いておきまして、
alien でパッケージに仕立て上げてみましょう。

ここでは、/usr/bin/usucmd.sh というファイルだけのパッケージを作成
してみます。
まずは、/usr/bin/usucmd.sh を、以下のようにしてでっち上げます。

……………………………………………………………………………………
$ mkdir -p usr/bin
$ cat > usr/bin/usucmd.sh << E-O-F
> #!/bin/sh
> echo $*
> E-O-F
$ chmod +x usr/bin/usucmd.sh
……………………………………………………………………………………

そうしましたら、以下の手順で tgz にしましょう。

……………………………………………………………………………………
$ tar cfz usucmd-0.1.tgz usr
……………………………………………………………………………………

あとは、いつものように、alien で rpm や deb に変換するだけです。
まずは、rpm から。
(変換は最初のalienの実行だけです。残りは確認のための実行です。)

……………………………………………………………………………………
$ fakeroot alien --to-rpm usucmd-0.1.tgz
usucmd-0.1-2.noarch.rpm generated
$ rpm -qip usucmd-0.1-2.noarch.rpm
Name : usucmd Relocations: (not relocatable)
Version : 0.1 Vendor: (none)
...
Group : Converted/unknown Source RPM: usucmd-0.1-2.src.rpm
Size : 18 License: unknown
...
$ rpm -qlp usucmd-0.1-2.noarch.rpm
/usr
/usr/bin
/usr/bin/usucmd.sh
……………………………………………………………………………………

もちろん、deb パッケージも作ることができます。
(変換は最初のalienの実行だけです。残りは確認のための実行です。)

……………………………………………………………………………………
$ fakeroot alien --to-deb usucmd-0.1.tgz
usucmd_0.1-2_all.deb generated
$ dpkg -I usucmd_0.1-2_all.deb
...
Package: usucmd
Version: 0.1-2
Architecture: all
...
Section: alien
Priority: extra
Description: Converted tgz package
...
$ dpkg -c usucmd_0.1-2_all.deb
...
drwxr-xr-x usu/adm 0 2009-11-11 00:20 ./usr/bin/
-rwxr-xr-x usu/adm 18 2009-11-11 00:20 ./usr/bin/usucmd.sh
……………………………………………………………………………………

…ああ、あっけないほどうまくいきます。

もしよろしければ、過去の苦労した結果もご覧いただけますと幸いです。

Vol.130 - RPM パッケージを作成する
http://www.usupi.org/sysad/130.html
Vol.131 - deb パッケージを作成する
http://www.usupi.org/sysad/131.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ おわりに

以上、alien を使って、パッケージを変換する方法を、ご紹介しました。

上記は、だいたい Ubuntu 9.10 の環境で試しましたが、RPM パッケージ
を扱う際、db3 に関するエラーがぱんぱん出ました。

……………………………………………………………………………………
error: cannot open Name index using db3 - No such file or directory (2)
エラー: Name インデックスを db3 でオープンできません - No such \
file or directory (2)
……………………………………………………………………………………

エラーは出ますが、RPM パッケージは生成されていますので、気にしない
でおいています。(なにかご存知でしたら、ご教示くださいませ。)

それはさておき、パッケージがなくて困ったときや、ただのファイルの塊
をパッケージにしたいときなどに、試してみていただけますと幸いです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 宿題の答え
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

前回の宿題は、

入力されたパスワードが正しいかどうかを確認するツールを、作成して
ください。

でした。

ではさっそく、自分なりに考えた、回答となるスクリプトです。

……………………………………………………………………………………
#!/usr/bin/perl
use strict;

if($#ARGV != 1) {
warn "Usage: $0 username password\n";
exit 1;
}
my $user = shift; # 引数で指定したユーザ名
my $pass = shift; # 引数で指定したパスワード

open(SHADOW, "/etc/shadow") || die "cannot open.";
while() {
my ($luser, $lencr) = split(/:/, $_); # shadowから得る
my ($salt, $encr);
next if $luser ne $user; # ユーザ名が不一致なら次のループへ
if($lencr =~ /^(\$\d[^\$]*\$[^\$]+\$)(.*)$/) {
$salt = $1; # DES以外の場合(たぶん)
} else {
$salt = substr($lencr, 0, 2); # DESの場合
}
$encr = crypt($pass, $salt); # 暗号化
if($encr eq $lencr) {
print "match: $lencr\n";
} else {
print "NOT match: $lencr != $encr\n";
}
last;
}
close(SHADOW);
……………………………………………………………………………………

これを checkpasswd.pl というファイル名にして保存しましたら、いつも
のように実行可能にしましょう。

……………………………………………………………………………………
$ chmod +x checkpasswd.pl
……………………………………………………………………………………

そして、rootの権限で、ユーザ名とパスワードかもしれない文字列を引数
に指定して実行します。
たとえば、test ユーザのパスワードが test1 かどうかを確認するには、
以下のように実行します。

……………………………………………………………………………………
# ./checkpasswd.pl test test1
match: 暗号化したパスワード
……………………………………………………………………………………

一致しますと、上記のように match: とかいうのが出力されます。
異なる場合は、NOT match: 云々と出力されます。

……………………………………………………………………………………
# ./checkpasswd.pl test nisepasswd
NOT match: ホンモノの暗号化したパスワード != ニセモノ
……………………………………………………………………………………

このスクリプトでは、/etc/shadow を直接読み込んで、指定したユーザの
暗号化したパスワードが一致するかどうかを確認しています。

そして、暗号化したパスワードが $なんとか$ で始まる場合は、次に出現
する $ までを salt とし、そうでなければDESだとみなして最初の2文字
を salt としています。

それで正しいかどうか、ちょっと自信がないのですが、こちらの環境で、
MD5, SHA256, SHA512 および DES では動作しました。

ちなみに、/etc/pam.d/passwd などにある pam_unix.so の引数で、暗号
化のアルゴリズムを変えられます。
たとえば、以下のような行が含まれますと、MD5 が使われます。

……………………………………………………………………………………
password required pam_unix.so ...中略... md5
……………………………………………………………………………………

passwd コマンドでパスワードを変更しますと、暗号化したパスワードが
$1$ で始まります。
これを、sha256 や sha512 に変更しますと、$5$ や $6$ で始まる長ーい
文字列になります。

詳しくは以下などに説明がありますので、興味のある方はご覧ください。

crypt (Unix) - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Crypt_%28Unix%29

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 今回の宿題
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

今回の宿題は、

alien で生成したパッケージの情報を、適切な内容に変更しましょう。

です。

alien で生成されたパッケージ、特に tgz から生成した場合の情報は、
なんと言いますか、かなりそっけないように思います。

たとえば Description は、Converted tgz package くらいしか記述して
くれません。(まあ仕方がないのですが。)

というわけで、いくつかカスタマイズを試みてみたいと思います。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ あとがき
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

というわけで、長年親しんだ Vine から、意を決して Ubuntu に鞍替えを
してしまいましたが(Vine ユーザのみなさま、すみません!)、各種設定で
いろいろ失敗をやらかしております。


せっかくですので(?)、2点ほど、ご紹介させていただきます。


まずは、Firefox 絡みです。
このマシンでは、Ubuntu のパッケージである Firefox を使用しています
が、別のマシンではダウンロードしたバイナリを使用しています。

ただ、各種設定ファイル等をなるべくマシン間で共通にしていますので、
Firefox の起動を、以下のシェルスクリプト($HOME/bin/firefox です)で
行っています。

#!/bin/sh
if [ -x /some/where/firefox/firefox ]; then
/some/where/firefox/firefox $*
else
firefox $*
fi

ダウンロードしたバイナリが /some/where/firefox/firefox として存在
すればそのバイナリを起動し、そうでなければパスの通った firefox を
起動する、という単純なスクリプトです。

ですが、PATH の中で、もし /usr/bin よりも $HOME/bin の方を先に指定
していますと、/some/where/firefox/firefox がないと、自分自身である
$HOME/bin/firefox を起動しますので、$HOME/bin/firefox を無限に起動
し続けてしまいます。

ということは、今でこそ気づきますが、当然そのときは気づかず、GNOME
のパネルから上記を起動し、プロセスを無限に起動させてしまいました。

いくらマシンが速くなったとはいえ、どんどんプロセスを増産していくの
ですから、次第に操作できなくなるほどモーレツに重くなっていきます。

…という状況を、何度も味わう羽目になりました。

最初は、新手のウィルスか何かか!…と焦りましたが、psコマンドを実行
したところ、$HOME/bin/firefox が数百…あるいは数千個並ぶのを見て、
己の犯した過ちに気づいた次第です。
(psコマンドが実行されるまでには、膨大な時間を要しましたが…。)


それに比べますと、もう1つの失敗は、たいしたことないです。たぶん。

いままで、端末エミュレータは、kterm か mlterm を使ってきましたが、
Ubuntu にしてからは GNOME端末をフツーに使ってみております。

GNOME端末さんは、キーボード・ショートカットの設定がメニューで簡単
にできますので、他のツールに合わせて、コピーに Ctrl-c を割り当てて
おきました。

当然、Ctrl-c を押しますと、GNOME端末がコピーの処理を行います。
ですので、なにかコマンドを実行して、途中で止めたくなって Ctrl-c を
押下しても、止まらなくなってしまいました。

…ええ、設定したそのときは、なにも考えていなかったのです。
そして、そんなアホな設定をしたことすら、忘れていたのです。

ですので、最初はなぜ効かなくなったのかわからず、Ctrl-z で中断して
killする、という回りくどい手順で、プロセスを強制終了していました。
ですが、ふと、キーボード・ショートカットの設定をしたことを思い出し
まして、Ctrl-c の設定を解除し、平穏な日々に戻ったという次第です。


…まあ、言ってみればそれだけです。
これをご覧いただき、みなさまのうっかりな設定が一つでも減ることを、
心から願っております。(ほんとうに!)


今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、12月6日(日) の未明にお会いしましょう!


「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗マグカップを作ろうかなと思っております。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)

◎いますぐ実践! Linuxシステム管理
のバックナンバー・配信停止はこちら
http://archive.mag2.com/0000149633/index.html
このメールに返信すれば、発行者さんへ感想を送れます


━【まぐまぐ!からのお知らせ】━━━━━━━━━━━━━━━━━━━━━
>>まとまった金額が必要、利息が気になる…、いつものコンビ二で利用したい<<
そんなあなたに、まぐまぐ!から「オリックスVIPローンカード」のご案内
【詳しくはこちら】 http://a.mag2.jp/ilzU
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

▽こちらもいかが?ビジネス・キャリアジャンルの注目メルマガ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
●アスマナ ─イヤでも成功路線にのってしまう常識はずれの方法─
http://www.mag2.com/w/0001004781.html
○国立大学大学院(ビジネススクール)非常勤講師の経験を持つ、外資系コン
サルティングファーム・大手外資系IT企業出身の“アスマナ塾”主宰者による
若手社会人・学生がキャリアを成功させるための「常識はずれの方法」
★発行者サイトもご覧ください↓
アスマナ塾:http://www.asumana.jp/ 事務局:http://www.yerbabuena.co.jp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━【まぐまぐ!】━
posted by ジャップ at 00:01| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: