いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! 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(<SHADOW>) {
      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 システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本