Previous Topへ Next

UNIXの構造を知る/Make sense of UNIX commands' structure

コマンドの実体

ここでUNIXというシステムはそもそもどういう構造のシステムなのかという根源的な話にちょっとふれます。

ここまでいくつかコマンドを使ってきました。
このコマンドというのはterminalなどのシェルにそういう文字列を入力するとそういう命令を実行してくれる、そういう風にUNIXが作られていると何となくここまで漠然と理解してきたのではないかと思います。

しかしこのコマンドは実はUNIXのシステムそのものの機能ではなく、GUI環境でいうところのアプリケーションのようなものだというと理解しにくいでしょうか?


MacOSXのGUI環境でもインストール直後の環境のままでいくつかのアプリケーションが使えます。テキストエディットができるしMailでメールをうつこともできるしSafariでインターネットを見ることもできます。

しかしOSXのインストールなりの環境ではMSワードの.doc書類を見ることができません。エクセルもパワーポイントも開くことができません。これらはMSOfficeをインストールしないと利用することができません。
ところでこのネイティブでついてくるSafariとMSwordはどう違うのかというとアプリケーションであるという意味では全く同じです。Safariも削除してアンインストールすることもできます。

これと同じでUNIX環境でlsというコマンドを利用するというのはlsという既にインストールされたアプリケーション(UNIXではアプリという言葉を使わずにコマンドという言葉を使うわけです)を利用しているということなのです。



UNIXのコマンドはFinder等のGUI環境では隠されているが
Coelaなどの不可視ファイルを見ることができるアプリで見れば
所定のディレクトリにちゃんと格納されていることが分かる
つまりGUI環境のアプリケーションと全く同じ構造だ


このキャプチャーの構造を見てもらえば分かるのですが、UNIXのアプリといえるコマンドは全てファイルという形で所定のディレクトリにおさまっています。
実はUNIXというシステムは全ての事象を「ファイル」という形で認識します。
システムから見ればモニターやキーボードもファイルとして見えているわけです。

キーボードに何かを入力するとシステムからは
「キーボードという名称のファイルに何か書き込まれたのでそれを読み込んで有意の命令は実行する」
という風に見えているわけです。
また「処理の結果が出力できるのでまずディスプレイというファイルにその結果を書き込む」
という動作をするとモニターに結果が表示されるわけです。

UNIXは全てのものをファイルとして認識してそれを読み込んだり書き込んだりするというシステムなのです。

さらにいえばUNIXをベースにしているMacOSXも実は全ての事象をファイルとしてとらえています。



OSXのアプリケーションを「パッケージの内容を表示」で見てみると
その実体は全てファイルであることが分かる
OS9からOSXに移行する時にこの部分が一番異様に感じたことだ

このキャプチャーを見てもらえば分かることですが、OSXのGUI環境で使うアプリも、コンテクストメニューの「パッケージの内容を表示」で中身を開けてもらうと中身のアプリの本体はファイルであることが分かります。
GUIのアプリはこうしたファイルをひとまとめにしたフォルダを一つの実行型プログラムに見せるバンドルという方法でまとめていますが、実はアプリのアイコンの実態はフォルダでアプリ本体はその中身のファイルであることが分かります。
昔OS9時代に手に入れたOSXのバックアップディスクの中身がOS9のGUIで見るとみんなテキスト性のファイルであることにびっくりした覚えがあります。


ちょっと脱線してしまいましたが、ここの要点はコマンドはファイルとしてシステムの所定の位置に格納されているというです。コマンド本体だけでなくシステムの設定も全てファイルとして文字列で記録されたものがシステムの所定の位置に整然と保管され、システムはその文字を読み込んでそこに書かれた通りに動作しているのです。

OSXは.docファイルをネイティブでは扱えないがMSワードをインストールするとそれを開くことができるようになると書きました。ではコマンドもアプリのようなものであるとしたらそれをインストールして従来無かった機能を後から追加することができるのかというと、実はできるのです。

そのためにmakeというコマンドも用意されています。
インストールは可能ですが、そのインストールしたコマンドを利用するためにUNIX独特の必要な手続きというものがあります。
それが次に説明するパスを通すということです。








UNIXがコマンドを実行する時にどういう手続きを踏むかを説明するとこうなります。

例えば
% ls -a
というコマンドを入力してenterキーを叩いたとしましょう。

OS10.2デフォルトのtcshの場合は
/etc/csh.login
または
~/.tcshrc

OS10.3デフォルトのbashの場合は
/etc/profile
もしくは
~/.bash_profile
を読みにいきます。

このいずれかに
setenv PATH "/bin:/sbin:/usr/bin:/usr/sbin"
というような形で実行するべきコマンドを探しにいくべきパスが全て書き込まれています。

システムはこの文字列の指示に従ってここに書いてある全てのパスに、terminalに入力されたコマンドと一致するものがあるかを探しにいきます。
この場合は
/bin
/sbin
/usr/bin
/usr/sbin

の4つのパスを探しにいくことになります。

ここに先ほどのlsと一致するものがあれば(lsは/binに実際デフォルトであるわけですが)それを読み込んでそこに書かれたプロセスを実行します。

これがUNIXの動作の仕方で、このコマンドを探しにいくパスをコマンドサーチパスといいます。



terminalで試しにecho $PATHと打ち込んでみよう
現在設定されているコマンドサーチパスが表示される

問題は新たにコマンドをインストールしたときです。
インストールされたコマンドがこういうデフォルトで設定されたパスの上にあれば問題ないのですが、ユーザがインストールするコマンドはこれとは別のユーザ領域のパスにインストールされることが多いのです。
それでそのままインストールしたコマンドを実行しようとすると
:Command not found
という表示が出てしまいます。

そこで先ほどの設定ファイルにこのコマンドサーチパスの記述を追記してやります。
それにはいくつか方法があります。

ひとつはこれらの設定ファイルを直接エディタで開いてそこに
set path = ($path /××/××/××)
と追記して下さい。
(/××/××/××には新しいコマンドがインストールされたパスを記述する)
bashの場合は~/.bashrcなどに
PATH="$PATH:/××/××/××"
と追記します。

これはGUIでテキストエディタで開いてもいいですし、シェル環境にはviなどのテキストエディットコマンドもあります。
しかしいずれの場合もrootの権限を要求されることがあることは記憶しておいて下さい。

また既出のechoというコマンドを使って設定ファイルに直接記述するという方法もあります。そのコマンドの例を挙げておきます。

(tcshの場合)
% echo set path = ($path /××/××/××) >> ~/.tcshrc
(bashの場合)
$ echo export PATH="${PATH}:/××/××/××" >> ~/.bash_profile

このコマンドサーチパスを設定することをUNIXユーザのみなさんはよく「パスを通す」といいます。
UNIX系のトラシューBBSで「コマンドをインストールしたのにCommand not foundと表示されるだけで動きません」という質問に対して、回答者が「パスを通して下さい」と答えているのを見かけますが、パスを通すというのはこういうことをさしています。






anchor

MacOSXでclamavをコマンドで使う

先日Linuxでclamavをコマンドを使って、パターンファイル更新、スキャンまで実行する方法について書いた。
MacにインストールしたClamXavのエンジンも同じものだから、Macでも同じことができる筈だ。
そこでろくに調べもしないで、freshclam、clamscanなどのコマンドを打ってみたが、やはりパスが通っていないらしい。
ここまでは想定の範囲内だったのでLinuxと同じコマンドもトライしてみた。

しかし動かない。
勿論これも想定の範囲内・・・(^_^;)

そこでやっぱりちゃんと調べてみることにした。
いつもclamavのパターンファイル更新は
"/usr/local/clamXav/share/clamav"
の中身を上書きしているので、バイナリもこの近くに有るに違いないと思い、MainMenuを使って不可視領域を表示して、このあたりを探してみた。
その結果見つけたのがここだった。
"/usr/local/clamXav/bin/clamscan"
"/usr/local/clamXav/bin/freshclam"

そこでまずパターンファイルの更新のコマンドはこういうことになる。
sudo /usr/local/clamXav/bin/freshclam

そしてカレントディレクトリのスキャンはこういうコマンドになる。
sudo /usr/local/clamXav/bin/clamscan

さらにカレントディレクトリから下の階層を「再帰的にスキャン」するには
sudo /usr/local/clamXav/bin/clamscan -r

感染したファイルだけ結果表示するには
sudo /usr/local/clamXav/bin/clamscan -r --infected

感染したファイルを削除するには
sudo /usr/local/clamXav/bin/clamscan --remove

起動ボリュームの全てのディレクトリを「再帰的に」スキャンして感染したファイルだけ表示したい時にはまず
cd /
と打ってenter、
sudo /usr/local/clamXav/bin/clamscan -r --infected
と打ってenterすればいい。

一気に片を付けたい時には
sudo /usr/local/clamXav/bin/clamscan -r --remove
とする手もあるが、このコマンドで何かを削除されたら取り消しはできないので、慎重になった方が良いと思う。


以上せっかくMacOSXにはClamXavという優れたGUIフロントエンドがあるので別に覚えなくてもいいコマンドだが、Macでもこういうことができるという備忘録として。






もたもたトライアンドエラーをしながらもパターンファイル更新に成功した
そのコマンドはsudo /usr/local/clamXav/bin/freshclamということになる





さらにもたもたしながらclamでのスキャンにも成功
sudo /usr/local/clamXav/bin/clamscanというコマンドで可能に

anchor

最近ClamAVをTerminalで使うことにハマっている

ここで紹介した方法なのだが、最近これにハマっている。
MacOSXでclamavをコマンドで使う

ClamAVとは言うまでもなくMacで使えるもっとも強力なフリーのアンチウイルスソフトClamXavのエンジン、UNIXのコマンドの部分だ。

出自がUNIXのコマンドなのだからTerminalで使えても別に不思議でも何でもない。
でもなぜかTerminalから起動すると軽快に動くような気がする。 それは気のせいかもしれないけど、結果までエラーなく表示できるのは気のせいではない。

使い方としては一行でclamscanというコマンドとオプションとターゲットのパスを打つ手もあるが、ものぐさな私はもっともめんどくさくない方法でやっている。
まずTerminal
cd
と打ってひとつスペースキーを打って、スキャンしたいディレクトリのフォルダアイコンをTerminalのウインドウにドロップする。
例えばライブラリフォルダをスキャンしたい時にはライブラリフォルダをドロップすると
cd /Library
という文字列がもう入力される。あとはEnterキーを叩くだけでそこにカレントディレクトリを移動できる。
Macならではの機能だ。

次にclamscanのコマンドを打つが、これも一度
sudo
と打ってスペースを一度打ってMainMenuなどを使って 不可視フォルダを表示するようにしてFinderからGUIでclamscanのバイナリをドロップすればいい。そうすると
sudo /usr/local/clamXav/bin/clamscan
という文字列が入力されるので、あとはEnterキーを叩けばいい。
下の階層まで全部スキャンしたい時には
sudo /usr/local/clamXav/bin/clamscan -r
でいい。

しかもこのコマンドは入力しないといけないのは最初だけで2回目からはカーソルキーの上矢印を叩いていれば過去の履歴から呼び出せる。
なので次回からはカーソルキーとEnterキーだけで実行できる。
GUIでClamXavを起動してやるよりも楽だ。

何か感染ファイルのアラートが出たらそのあたりだけ、GUIのClamXavでスキャンすれば、隔離などができる。

この方が楽だし動きが確実なので最近これにハマっている。






Terminalのラク〜な使い方
cdと打って一回スペースキーを打ってスキャンしたいフォルダをGUIでドロップする
ライブラリフォルダをドロップすればcd /Libraryと入力されるのでEnterキーでそこに移動
あとは履歴のclamscanコマンドを呼び出してEnterキーを叩くとスキャンが始まる





使っているリソースは同じだからTerminalClamXavの速度も安定性も同じ筈だ
しかし感覚的にはこちらの方がサクサク動いている気がする
今何をスキャンしているかが目に見えるし失敗が無いからかも





clamscanというプロセスが使用するメモリもこんなもの
ClamXav Sentryが1.6GBのメモリを使いまくっているのとくらべたら軽いもんだ





もっともClamXavの名誉のために言えばこちらも軽いプロセスではある



2009年8月24日















Previous Topへ Next





site statistics