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

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


いますぐ実践! Linux システム管理 / Vol.136 / 読者数:1333名

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

楽しかった黄金週間が、まもなく終わろうとしています。
みなさんの黄金週間は、いかがでしたでしょうか?

いろいろ思うところはあると思いますが、個人的には、明日から社会復帰できるよう、 早めに就寝されることをお勧めします。
(こんな時間に発行しておいてなんですが…。)

ところで、Windows XP の販売期間やサポート期間について、 いろいろと話題になっているようですね。(Yahoo の買収ほどじゃないですが…)

結局、OS の新機能はさほど必要とされておらず、セキュリティや速度、 信頼性などがそこそこ維持されるなら、XP でもぜんぜん問題ないよ、 とみんなが思っているところに、問題があるような気がします。

…いえ、XP でいいのだから、ぜんぜん問題ではないですね。

CPU などのハードが速くなり、インターネットもそこそこ使えて、 OS も安定してきた今、ひとびとの注目が OS より上の層に向かうことは、 ごく自然なことのように思います。

ですので、今後、MS がどのように方向転換していくのか、 現在の寡占的状況を維持できるのかなどを、注意深く観察したいなと思います。

身もふたもないことを書いたところで、今回も、はりきってまいります!

今回のお題 - パスワードを自動生成する

前回、Mercurial というバージョン管理ツールを使って管理する方法を、 簡単にご紹介しました。

Vol.135 - Mercurial で設定ファイルを管理する
http://www.usupi.org/sysad/135.html

ですが、反響がほとんどなく、読者さんもあまり増えませんでした。
これはいいぞと思うツールに出会って、勝手に舞い上がってしまっていたようです。 …め、目が覚めました。

また、この時期、新入社員のかたが教育を終え、 配属されてシステム管理の見習いに任命されたとか、 異動先でシステム管理を任されてしまった、ということが、 各所で見受けられるように思われます。

これらを踏まえまして、またしても初心にかえり、 脱初心者を目指す貴兄向きの内容を、粛々とご紹介したいと思います。

というわけで、まず手始めに、ユーザ登録を取り上げたいと思います。

ユーザ登録といえば、useradd コマンドですが、 数十または数百のユーザを一括して登録するとなると、若干のひねりが必要です。
そのあたりを、できるだけ具体的に、ご紹介していこうと思います。


…とはいえ、複数ユーザの一括登録ネタは、初期のころにご紹介済です。

Vol.004 - たくさんのユーザを登録する
http://www.usupi.org/sysad/004.html
Vol.005 - たくさんのユーザを登録する フルスロットル
http://www.usupi.org/sysad/005.html

上記を見ていただければ、決まったパターンのユーザを大量生成することができます。 後は、各自読んでいただければと思います。

…いやいや、ですが、パスワードに関しては、 驚くほど簡潔に終わらせてしまっています。いくら社内限定とはいえ、 簡単に推測できるパスワードを使用するのは、 あまりお勧めできるものではないですよね。(われながら…)

ですので、今回は、ややきちんとしたパスワードを自動生成して、 複数のユーザをじゃんじゃん登録したいと思います。


ありがたいことに、かゆいところに手が届く的ツールは、 たいていだれかが開発してくださっています。

パスワードを自動的に生成してくれるツールも、もちろん存在します。
それは、mkpasswd というコマンドです。

Fedora や Vine などでは、expect パッケージに含まれます。
Ubuntu の場合、whois パッケージに同名のコマンドがありますが、 効用がちょっと異なります。ですので、 libstring-mkpasswd-perl パッケージに含まれる mkpasswd.pl のほうを、 ご使用ください。

 

さて、mkpasswd(もしくは mkpasswd.pl)コマンドを実行しますと、 適切なパスワードを標準出力に出力してくださいます。

  % mkpasswd
  zxv7@N8mJ

引数なしですと、上記のように、9文字のパスワードを出力します。
長さを指定したい場合は、-l オプションを使用します。
たとえば、16文字のパスワードにする場合、以下のように実行します。

  % mkpasswd -l 16
  c[j5Fwcmsmaydl4A

また、使用するパスワードの文字種も指定できます。
デフォルトでは、数字、アルファベット小文字、大文字、そして特殊文字は、 それぞれ最低 2, 2, 2, 1文字使用されますが、 オプションの使用で変更することが可能です。
-d オプションで数字、-c オプションで小文字、-C オプションで大文字、 -s オプションで特殊文字の最低文字数を指定できます。
たとえば、大文字を最低3文字、特殊文字を最低2文字使用したい場合は、 以下のように実行します。

  % mkpasswd -C 3 -s 2
  {_T3Ig1Iv

…という感じで、mkpasswd コマンドを実行しても、 ファイルが消えたりパスワードが変更されたりなどといったことはありません。
ですので、いろいろなオプションを指定して、実行してみてください。


mkpasswd コマンドの使いかたがわかったところで、本題に入ります。

まず、ユーザを一括登録する際に使用する、 CSV ファイルを生成するためのスクリプトを、作成したいと思います。
CSV ファイルには、1行につき、以下の情報を含むこととします。

  ユーザ名,パスワード,UID,GID,ユーザ情報,ホームディレクトリ,シェル

ユーザ名は、ここでは user001, user002, ... といった、 連番的なものにしたいと思います。
そして、ユーザID(UID)は 500+連番に、グループID(GID)は 500、 ホームディレクトリは /home/ユーザ名、シェルは /bin/bash だと仮定します。

すると、上記 CSV ファイルを生成するスクリプトは、以下の通りです。

#!/bin/sh
MKPASSWD="/usr/bin/mkpasswd -s 0 -l 8"
BASEUID=500
GID=500
[ $# -eq 1 ] && TOTAL=$1 || TOTAL=100
num=1
while [ $num -le $TOTAL ]; do
    printf "user%03d,`$MKPASSWD`,%d,$GID,User %03d,/home/user%03d,/bin/bash\n" $num `expr $BASEUID + $num` $num $num
    num=`expr $num + 1`
done

そのまま実行しますと、user001〜user100 の100人分を出力します。
引数に数字を指定すれば、指定した人数分を出力することもできます。

これを mkpasswdcsv.sh というファイル名で保存し、実行しますと、以下のように、 CSV 形式の情報がどどどと吐き出されます。

  % chmod +x mkpasswdcsv.sh
  % ./mkpasswdcsv.sh
  user001,5ia4fAQk,501,500,User 001,/home/user001,/bin/bash
  user002,qi8clZC5,502,500,User 002,/home/user002,/bin/bash
  ...中略...
  user100,0Vkyu1Ow,600,500,User 100,/home/user100,/bin/bash

そして、上記 CSV ファイルをもとに、ユーザを一括登録するスクリプトは、 以下のようになります。

#!/usr/bin/perl
my @salt = ('.', '/', 0..9, 'A'..'Z', 'a'..'z');
my $snum = $#salt + 1;

srand(time ^ $$ ^ unpack "%L*", `ps auxww|gzip`);
while(<>) {
    chop;
    my @dat = split(/,/);
    my $passwd =
        crypt($dat[1], join('', @salt[rand $snum, rand $snum]));
    `useradd -p \"$passwd\" -u $dat[2] -g $dat[3] -c \"$dat[4]\" -d $dat[5] -s $dat[6] $dat[0]\n`;
    print "$dat[0] : " . ("ok", "NG")[$? ? 1:0] . "\n";
}

パスワードの暗号化のために crypt が必要でしたので、 Perl スクリプトに仕立て上げました。とはいえ、基本的には、 useradd コマンドに、各種情報を横流しするだけの、ごく単純な作りだと思います。

これを、useraddcsv.pl という名前で保存しましたら、root の権限で、 以下のように実行してください。

  # ./mkpasswdcsv.sh > user001-100.csv
  # chmod +x useraddcsv.pl
  # ./useraddcsv.pl < user001-100.csv

すると、user001〜user100 が、めでたく生成されるはずです。
もしされなかったら、エラーメッセージなどをもとに、 粛々とデバッグをしてみてくださいまし。


以上、mkpasswd コマンドを使ってパスワードを自動的に生成し、 複数のユーザを一括して登録する方法を、ご紹介しました。

上記は、あくまでもひとつの例です。
実際には、さまざまなシチュエーションが想定されますので、 ご紹介したスクリプトがそのまま使える、というケースは少ないのかもしれません。

ですが、肝の部分はそのまま使えると思いますので、ぜひ、スクリプトを作成して、 極力自動化することを目指してくださいませ。

宿題の答え

前回の宿題は、

  Mercurial によるバージョン管理を、最初からあらためて始めたいとき
  には、どうすればよいでしょうか?

でした。

管理対象のトップディレクトリ直下に、.hg という名前のディレクトリが作られて、 その下にじゃんじゃんと情報が記録されていきます。

ですので、いままでのことをなかったことにするには、 .hg 以下をすべて消し去ってしまえばよいです。

  % rm -rf .hg

あっけないですね。以上、現場からお送りしました。

 

さて、予定より早く試合が終わりましたので、当初ご紹介の予定だった、 Mercurial の続きの一部を、ここでご紹介しましょう。(なんじゃそりゃ)

分散バージョン管理ツールというくらいですので、 複数のマシン上で分散して管理することができます。
具体的には、SSH を使って、他のマシン上の管理対象を、 手元のマシン上にコピーすることができます。

  % hg clone ssh://マシン名/パス

たとえば、zion という名のマシンの /etc/httpd 以下をお取り寄せするには、 以下のように実行します。

  # hg clone ssh://zion//etc/httpd

zion 上に同名のアカウントがないとか、root で ssh ができないという場合は、 他のユーザの権限でお取り寄せしましょう。たとえば、 zion 上のユーザ usu の権限で行うには、以下のように実行します。
(/etc/httpd 以下を読む権限を、usu が持っている必要があります。)

  # hg clone ssh://usu@zion//etc/httpd

すると、カレントディレクトリに、httpd/ 以下の複製が作成されます。

 

さて、双方で開発を行いますと、同期をとる必要があると思います。
たとえば、コピー元のマシンで変更が行われ、それをコピー先のマシンに反映するには、 コピー先のマシン上で hg pull を実行します。

  # hg pull

ただし、これだけでは、.hg/ 以下の情報が反映されるだけです。
実際のファイルを更新するために、hg update も実行してください。

  # hg update

 

逆に、コピー先のマシンで変更し、commit した内容を、コピー元に反映する場合は、 commit した後に hg push を実行します。

  # hg push

こちらも、コピー元の .hg/ 以下を変更するだけです。 コピー元の実際のファイルに変更を反映させるには、 コピー元のマシン上で hg update を実行してください。

  zion# hg update

 

ちなみに、コピー元のありかは、hg path でわかります。

  # hg path
  default = ssh://usu@zion//etc/httpd

 

反響はあまりありませんでしたが、 Mercurial がよいツールだということにかわりはないと思います。ですので、 もし万が一触る機会がありましたら、ぜひぜひ使ってみてください。(嘆願)

今回の宿題

今回の宿題は、

  複数のユーザを一括で削除するスクリプトを作成しましょう。

です。

たくさんのユーザを登録する機会があるとするならば、その逆も真なりということで、 一括して削除しなければならないシチュエーションもあるのではないかと思います。

ユーザ名を引数で指定してもいいですし、 本題と同じようなCSVファイルを使用してもいいと思います。 各自よいなと思った方法で、実現してみてくださいませ。

あとがき

昨年の黄金週間は、栗日記のブログパーツを作ることだけを目標にして、 いちおうブログパーツを完成させることができました。

今年は、諸般の事情により、絵をいくつか描く必要があり、 これといった目標は立てませんでした。
そのおかげで…と言っていいのかどうかわかりませんが、 描き上げるべき絵は完成させることができましたし、 親子ともにもりもりと休みを楽しむこともできました。

せっかくの休みですから、お仕事などから開放されて、 リフレッシュすることも大事だよな、と思うことにしました。
というわけで、明日から、みっちりと仕事をこなそうと思います。

さて、絵を描くノルマを達成するついでに、 以前から描こうと思っていた絵も作ってみました。
それは、シス管のページのトップの絵です。

http://www.usupi.org/sysad/

個人的に思い入れのあるワークステーションをメインに、描きたいマシンを、 縮尺はやや無視して(本当は気づいたらおかしくなっていただけですけど…)、 もりもりと描いてみました。
こんな程度の画力ですので、こりゃなんだよっていうマシンも多々あると思いますが、 あーこんなのあったねとかなんとか思っていただけますと、幸いです。

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 5月18日(日) 頃に、お会いしましょう!

 

「いますぐ実践! 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/ (栗日記ブログ)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本