トップ > ソフトウェア > Nacho

[前ページ] [次ページ]


Nacho - ネットワークアプリケーション調査ツール

Author: Takeshi Fujiyoshi
Last update: 2010/08/24

目次

Nacho とは

Nacho はネットワークアプリケーションの挙動を調査するためのツールである。 Nacho = Network Application CHOsa tool の略。

同じ目的でよく使われるツールは telnet コマンドである。 telnet はサーバとの間で TCP コネクションを確立した後、 標準入力から読み込んだデータをサーバへ送信し、 サーバから受信したデータを単に標準出力へ書き出す処理を繰り返す。 telnet はシンプルだけど非常に便利で筆者も度々使用するのだが、 以下の問題がある。

Nacho はこれらの問題を解決し、以下のような機能を提供するプログラムである。

Nacho は以下の2つのプログラムから構成される。

プログラム名 機能
nacho Nacho の本体。 コネクション開閉やデータ送受信などのアクション、 発生したイベントの表示、 コマンド入力インタフェースを提供する。
nacli nacho の機能のうちコマンド入力インタフェースのみ提供し、 入力されたコマンドを nacho へ配送する。

配布物

配布ファイル 内容
nacho-0.2.tar.gz Nacho 0.2 のソースコードのアーカイブ
COPYING ライセンス

ソースコードのアーカイブを展開すると、ディレクトリ nacho-0.2 の下に 以下のファイルおよびディレクトリが展開される。

ファイル・ディレクトリ 内容
README.txt Nacho の説明書 (今あなたが見ている文書と同じ)
INSTALL.txt インストールガイド
TODO.txt 検討中の追加機能、認識している不具合等のメモ
src/ ソースコード置き場
nb/ NetBSD make 用のビルド環境
gm/ GNU make 用のビルド環境
ac/ GNU Autoconf 用のビルド環境
mkc/ mk-configure 用のビルド環境

ファイル内の文字コードは UTF-8 である。

動作環境

UNIX 系の OS を対象とする。 作者は以下の環境で動作確認した。

他にも確認したいが環境がない。

インストール方法

  1. OpenSSL(libssl) と EditLine(libedit) をインストール
    • BSD 系では両方とも最初から入っている(たぶん)
    • それ以外の UNIX ではパッケージから入れる or ソースからビルド
  2. nacho のソースコードをダウンロードし展開
  3. nacho をビルド
    • NetBSD make を使うならディレクトリ nb で make
    • GNU make を使うならディレクトリ gm で make
    • それ以外の make を使う or configure が好きな人は ディレクトリ ac で configure して make
  4. 同ディレクトリで make install して nacho と nacli をインストール

詳しくは INSTALL.txt を参照。

使用例

Nacho がどのようなものかをイメージしてもらうため、 ここでは大雑把な使用例を示す。

イベント待ちモードと CLI モード

シェルのコマンドラインから nacho を起動する。:

$ nacho
0 - Start main task

この状態でリターンキーを押して改行を入力すると CLI プロンプトが表示され、 コマンド入力待ちに入る。:

CLI>

適当にコマンドを入力してみる。:

CLI> help
** Invalid command: help
command:
    close
    connect [-S] <host> <serv>
    exit
    info
    listen [-S] <host> <serv>
    send [ <string> | -p <string> | -x <NN...> | -f <file> | -bnrst ]
    set [var=val [...]]
    sslstart

help というコマンドは知らないと言われ、 使用可能コマンドの一覧が使い方と共に表示された。

今、CLI のプロンプトが表示されていないことに注意して欲しい。 ここでもう一度リターンキーを叩いて改行を入れるとプロンプトが表示される。:

ここで改行投入
CLI>

nacho には次の2種類のモードが存在する。

イベント待ちモード
発生したイベントの内容を表示する。 標準入力から改行を読み込むと CLI モードに入る。
CLI モード
プロンプトを表示しユーザからのコマンドを受け付け実行する。 コマンドが投入されるかまたは単に改行が入力されると イベント待ちモードに戻る。

適当に改行を繰り返し入力してみると CLI のプロンプトが一回置きに 表示される。CLI プロンプトが表示されないときがイベント待ちモードである。:

CLI>

CLI>

CLI>

CLI モードにいるときはイベントが発生しても一切表示されず、 イベント待ちモードに戻った後に表示される。 ユーザが長いコマンドを入力している間に受信したデータの内容が表示されて 画面が乱れて入力が邪魔されるのを防ぐことができる。

nacho の終了

CLI モードで exit と入力するか、 イベント待ちモードで ^C (Control + 'C') を押すとプログラムが終了する。

TCP のクライアントになる

TCP のクライアントとしてサーバホストに接続し、 メッセージの送受信をする実験をしてみる。

nacho を起動し改行を入力し CLI モードに入ったら、 以下のように入力する。:

CLI> connect smtp.gmail.com submission
1 - Start TCP client task
1 - Connecting to 74.125.53.109 port 587 ...
1 - Connected (192.168.11.2 port 64842 -> 74.125.53.109 port 587)
1 - Receive 43 bytes (74.125.53.109 port 587 -> 192.168.11.2 port 64842)
        220 mx.google.com ESMTP q27sm6385850wfc.6\r\n

connect はサーバホストへ TCP コネクションの確立を試みるコマンドである。 引数に接続先のサーバホストとポートを指定する。 ここで接続したホスト smtp.gmail.com は GMail の STMP サーバであり、 submission はポート番号 587 に対応するサービス名である。 もちろん IP アドレスとポート番号を数値で指定しても良い。

nacho はイベントが発生するごとにメッセージを表示する。 ここでは4つにイベントが発生し、それぞれ

  1. TCP client タスクの起動
  2. ホスト 74.125.53.109 のポート 587 への TCP 接続トライ
  3. 接続の成功
  4. 接続先ホストからのデータ受信

を表している。 最後のイベントでは受信したデータの内容が表示されている。 末尾の \r は CR (文字コード 0x0d)、\n は LF (文字コード 0x0a) である。

各イベントの先頭の数字はタスク番号を表している。 Nacho では複数の TCP コネクションを同時に張ることが可能であり、 1つのコネクションに1つのタスク番号が割り当てられる。 この4つのメッセージは全てタスク1に関するイベントであることを示している。

次にこちらからデータを送信してみる。 改行を入力し CLI モードに入って以下のように入力する。:

CLI> send ehlo localhost -rn
1 - Send 16 bytes (192.168.11.2 port 64837 -> 74.125.53.109 port 587)
        ehlo localhost\r\n
1 - Receive 126 bytes (74.125.53.109 port 587 -> 192.168.11.2 port 64837)
        250-mx.google.com at your service, [221.113.230.120]\r\n
        250-SIZE 35651584\r\n
        250-8BITMIME\r\n
        250-STARTTLS\r\n
        250 ENHANCEDSTATUSCODES\r\n

send コマンドはデータを送信するコマンドである。 引数には送信したいデータを文字列や16進数で指定することができる。 send コマンドの末尾に付けた -rn は CR と LF の送信を指示している。 コマンドを投入するとすぐに2つのイベントが発生した。それぞれ、

  1. 接続先ホストへのデータの送信
  2. 接続先ホストからのデータの受信

を表している。

最後にコネクションを終了させてみる。:

CLI> close
1 - Closing
1 - End task

コネクションを閉鎖しタスクの終了を示すイベントが表示された。

TCP のサーバになる

次に TCP のサーバ側になり、クライアントからの接続を待ち受けてみる。 以下のように入力する。:

CLI> listen 0.0.0.0 55555
1 - Start TCP listen task
1 - Listen on 0.0.0.0 port 55555

listen コマンドは TCP 接続の待ち受けを開始する。 引数には待ち受けるアドレスとポートを指定する。 コマンドを投入すると2つのイベントが表示され、それぞれ、

  1. TCP listen タスクの起動 (タスク番号1)
  2. アドレス 0.0.0.0 のポート 55555 での待ち受けを開始

を表している。 なお、アドレス 0.0.0.0 はこのホストが所有する任意のアドレスでの 待ち受けを意味する。

さて、TCP listen タスクが待ち受けているアドレス&ポートに対し、 telnet コマンドを使って接続してみよう。 同じマシン上に端末をもう1つ開き、シェルから以下のように入力する。:

$ telnet localhost 55555
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

nacho には以下のようなイベントが表示されたはずだ。:

1 - Connected (127.0.0.1.64816 -> 127.0.0.1.55555)
2 - Start TCP server task

それぞれ、

  1. TCP listen タスクがクライアントからの接続を受理しコネクションを確立した
  2. そのコネクションを担当する TCP server タスクを開始した(タスク番号2)。

を表している。

telnet 側の端末から適当にデータを入力してみよう。:

Hello, I am Nancy.

すると、nacho 側の端末には以下のように表示された。:

2 - Receive 20 bytes (127.0.0.1 port 64816 -> 127.0.0.1 port 55555)
        Hello, I am Nancy.\r\n

それに対し、nacho 側から telnet へ応答を返してみる。:

CLI> send Hello, I am Keiko. -rn
2 - Send 20 bytes (127.0.0.1 port 55555 -> 127.0.0.1 port 64816)
        Hello, I am Keiko.\r\n

すると、telnet 側にはその内容が表示されたはずだ。

telnet 側からコネクションを切断してみる。 telnet のエスケープ文字 ^] (Control + ']')を入力し、 プロンプトから close と入力する。:

^]
telnet> close
Connection closed.

nacho 側では以下のように表示された。:

2 - Connection closed by peer
2 - End task

接続先ホストからコネクションが切断され、タスクが終了したことを意味する。

nacho コマンド

nacho は、コネクション開閉やデータ送受信などのアクション、 発生したイベントの表示、およびコマンド入力インタフェースの機能を 提供するプログラムである。

コマンドライン引数

書式:

nacho [options] [var=val ...] [[tid] command args ...]
引数 機能
-c socket_file nacho と nacli 間での通信に使用するソケットファイル名を 指定する。デフォルトは ~/.nacho/ctlmsg.sock 。但し、 相対パスならばディレクトリ ~/.nacho が基点となる。
-o filename

イベント情報の出力先ファイル名を指定。 指定したときは標準出力とファイルの両方に書込まれる。 未指定ならば標準出力にのみ書込まれる。

このオプションは nacho 起動後に logfile パラメータで 設定するとも可能。

-p {a|x|m|<locale>}

送受信データの表示形式を指定する。

  • a または ascii: ASCII 行表示モード(デフォルト)。 改行までを1行に表示する。 非表示文字は \xNN 形式で表示する(NNは16進2桁)。
  • x または hexdump: 16進ダンプ形式で表示
  • m または multibyte: 行表示モードのマルチバイト文字対応版。 環境変数 LC_CTYPE または LANG に設定された ロケールで表示文字か非表示文字かを判定する。
  • <locale>: 行表示モードのマルチバイト対応版。 指定されたロケールで表示文字か非表示文字かを判定する。

このオプションは nacho 起動後に print_mode パラメータで 設定するとも可能。

-v 冗長メッセージを表示
-V バージョンを表示して終了
var=val パラメータ var に値 val を設定する。 '=' の前後の空白を入れてはいけない。 指定できるパラメータについては後述する。
tid command を実行させるタスクのタスクIDを指定
command args ... 起動後に実行するコマンドを1つだけ指定できる。 nacho はこのコマンドを処理したあとイベント待ちモードに 入る。

イベント待ちモードと CLI モード

nacho は動作している間、2つのモードのどちらかにいる。

イベント待ちモード
nacho を起動するとイベント待ちモードに入る。 イベント待ちモードでは nacho で発生したイベントを表示する。 端末から改行が入力されると CLI モードに遷移する。
CLI モード
CLI モードに入ると 'CLI> ' プロンプトを表示し、コマンド入力を待つ。 CLI モードにいる間はイベントが発生しても画面に表示されない。 コマンドを投入するか単に改行を入力するか EOF (通常は ^D) を入力すると イベント待ちモードに遷移する。

CLI モードで入力できるコマンドについては後述する。

プログラムの終了

以下の方法で nacho を終了させることができる。

  • CLI モードで exit コマンドを実行する (CLI モードでは ^C を入力しても 終了しない)
  • イベント待ちモードで ^C (Control + 'C') を入力すると SIGINT が発生し、 nacho が終了する
  • 他のプロセスから SIGTERM を送信して終了させる

nacli コマンド

nacli は nacho からコマンド入力機能だけを抜き出したものである。 nacho がイベント待ちモードで動作している状態で、 別の端末から nacli を使ってコマンドを投入できる。 nacli 単体では何もできない。

コマンドライン引数

書式:

nacli [options] [var=val ...] [[tid] command args ...]
引数 機能
-c socket_file nacho と nacli 間での通信に使用するソケットファイル名を 指定する。デフォルトは ~/.nacho/ctlmsg.sock 。但し、 相対パスのときはディレクトリ ~/.nacho が基点となる。
-V バージョンを表示して終了
var=val パラメータ var に値 val を設定する。 '=' の前後の空白を入れてはいけない。 指定できるパラメータについては後述する。
tid command を実行させるタスクのタスクIDを指定
command args ... 起動後に実行するコマンドを1つだけ指定できる。 nacli はこのコマンドを nacho へ発行するとすぐに プログラムを終了する。 一方、コマンドを指定しなかったときは CLI モードに入る。

CLI モード

nacli には CLI モードのみ存在し、イベント待ちモードは存在しない。 nacho で発生したイベントはすべて nacho 側に表示される。

コマンドライン引数でコマンド(command args...)が指定されなかったときは CLI モードに入り、'CLI> ' プロンプトを表示しコマンド入力を待つ。 ユーザが端末からコマンドを投入するとローカルソケット経由で nacho に送信し、 すぐにプロンプトを表示してコマンド入力を待つ。

プログラムの終了

以下の方法で nacli を終了させることができる。

  • CLI モードで exit コマンドを実行する (CLI モードでは ^C を入力しても 終了しない)
  • CLI モードで ^D (Control + 'D') を入力する
  • 他のプロセスから SIGTERM を送信して終了させる

コマンドの使い方

nacho、nacli のコマンドライン引数または CLI モードから入力できる コマンドの仕様を示す。

現在サポートされているコマンドは以下の通り。

コマンド名 機能
connect TCP 接続 (クライアント側)
listen TCP 接続待ち受け開始 (サーバ側)
close コネクションを閉鎖しタスクを終了
send データを送信
sslstart SSLハンドシェークを実行
info タスク一覧を表示
set パラメータを表示・設定
exit プログラムを終了

タスク番号の指定

close、send、sslstart コマンドで各コマンド名の前にタスク番号を指定すると、 そのタスクに対してコマンドが配送され処理される。 タスク番号が未指定のときは最後に起動したタスクにコマンドが配送される。

例: タスク 5 のコネクションへデータを送信:

5 send helo ok -rn

それ以外のコマンドは無条件に Main タスクによって処理される。 ただし exit コマンドはタスクとは無関係である。

connect - TCP 接続 (クライアント側)

書式:

connect [-S] <host> <serv>

TCP client タスクを起動し、 そのタスク上でTCPクライントとしてサーバホストへの接続を試みる。

<host> には接続先のホスト名 or IPアドレス、 <serv> には接続先のサービス名 or ポート番号を指定する。 指定したホスト名に対応するアドレスが複数存在するときは、 接続に成功するまで順にトライする。

オプション -S を指定するとコネクションを確立したあと SSL ハンドシェークを実行し SSL コネクションの確立を試みる。

使用例:

CLI> connect smtp.gmail.com submission
1 - Start TCP client task
1 - Connecting to 72.14.213.109 port 587 ...
1 - Connected (192.168.11.2 port 65047 -> 72.14.213.109 port 587)
1 - Receive 43 bytes (72.14.213.109 port 587 -> 192.168.11.2 port 65047)
        220 mx.google.com ESMTP v38sm6741523wfh.0\r\n

listen - TCP 接続待ち受け開始 (サーバ側)

書式:

listen [-S] <host> <serv>

TCP listen タスクを起動し、 そのタスク上でTCPコネクションの接続の待ち受けを開始する。

<host> には待ち受けを行なうホスト名 or IPアドレス、 <serv> にはサービス名 or ポート番号を指定する。 指定したホスト名に対応するアドレスが複数存在するときは、 (getaddrinfo()で)最初に取得したアドレスでのみ待ち受けを行なう。 IPアドレスとして 0.0.0.0 を指定するとホストが所有する全ての IPv4 アドレスで待ち受ける。 同様に :: (または ::0) を指定するとホストが所有する全ての IPv6 アドレスで待ち受ける。

オプション -S を指定するとコネクションを確立したあと SSL ハンドシェークを実行し SSL コネクションの確立を試みる。

TCP listen タスクが待ち受けているアドレスに対し接続があると、 TCP server タスクが自動的に起動する。

使用例:

CLI> listen 0.0.0.0 55555
2 - Start TCP listen task
2 - Listen on 0.0.0.0 port 55555

close - コネクションの閉鎖

書式:

close

TCP client タスクと TCP server タスクで close を実行すると TCP コネクションが閉鎖しタスクが終了する。 TCP コネクション確立処理中のとき及び SSL ハンドシェーク実行中に close コマンドを実行すると処理が中断しタスクが終了する。

TCP listen タスクで close コマンドを実行すると、 待ち受け処理が終了しタスクを終了させる。

使用例:

CLI> close
1 - Closing
1 - End task

send - データ送信

書式:

send [ <string> | -p <string> | -x <NN...> | -f <file> | -bnrst ]

TCP コネクションに引数で指定されたデータを送信する。 ただし、SSL コネクションが確立しているコネクションについては SSL コネクションに対してデータを送信する。

以下に引数を説明する。 全ての引数は任意の場所に複数回指定でき、その順番にデータが送信される。

引数 内容
<string>

文字列 <string> を送信する。

但し、直前の引数が <string> または -p <string> のとき、 最初に空白(0x20)を送信してから <string> を送信する。

例えば send hello I am nancy としたとき、 hello 空白 I 空白 am 空白 nancy が送信される。

-p <string> 文字列 <string> を送信する。
-f <file> ファイル <file> の中身を送信する。
-x <NN...>

16進数 <NN...> を上位バイトから順に送信。 途中に16進数以外の文字は送信されず区切文字として機能する。

例えば send -x 001122_34455:66 とすると、 16進数で 00, 11, 22, 03, 44, 55, 66 が順に送信される。

-r CR (文字コード 0x0d) を送信する。
-n LF (文字コード 0x0a) を送信する。
-s 空白 (文字コード 0x20) を送信する。
-t 水平タブ (文字コード 0x09) を送信する。
-b

直後の引数で指定される送信データを Base64 で符号化する。

例えば send -bp hello -rn とすると hello を符号化した aGVsbG8K と、それに続けて CR LF が送信される。

使用例:

CLI> send ehlo localhost -rn
1 - Send 16 bytes (192.168.11.2 port 65043 -> 72.14.213.109 port 587)
        ehlo localhost\r\n
1 - Receive 125 bytes (72.14.213.109 port 587 -> 192.168.11.2 port 65043)
        250-mx.google.com at your service, [221.185.17.167]\r\n
        250-SIZE 35651584\r\n
        250-8BITMIME\r\n
        250-STARTTLS\r\n
        250 ENHANCEDSTATUSCODES\r\n

これでも同じ:

CLI> send -p 'ehlo localhost' -x 0d0a
1 - Send 16 bytes (192.168.11.2 port 65043 -> 72.14.213.109 port 587)
        ehlo localhost\r\n
1 - Receive 125 bytes (72.14.213.109 port 587 -> 192.168.11.2 port 65043)
        250-mx.google.com at your service, [221.185.17.167]\r\n
        250-SIZE 35651584\r\n
        250-8BITMIME\r\n
        250-STARTTLS\r\n
        250 ENHANCEDSTATUSCODES\r\n

sslstart - SSL ハンドシェークを実行

書式:

sslstart

TCP コネクション上で SSL ハンドシェークを実行し SSL コネクションの確立を 試みる。 このコマンドは、TCP client タスクと TCP server タスクでのみ使用できる。

SSL ハンドシェークが成功すると、 それ以降のデータは SSL コネクションに対して送受信される

使用例:

CLI> connect imap.gmail.com imaps
1 - Start TCP client task
1 - Connecting to 74.125.155.109 port 993 ...
1 - Connected (192.168.11.2 port 65329 -> 74.125.155.109 port 993)

CLI> sslstart
1 - SSL handshaking...
1 - SSL established
1 - Receive 69 bytes (74.125.155.109 port 993 -> 192.168.11.2 port 65329 SSL)
        * OK Gimap ready for requests from 221.185.17.167 37if7084938qci.76\r\n

info - タスク一覧を表示

書式:

info

現在動いているタスクの一覧を表示する。

使用例:

CLI> info
0 - Task list:
        0 - Main
        1 - TCP client (192.168.11.2 port 65105 -> 205.178.146.50 port 587)
        2 - TCP listen (0.0.0.0.55555)
        3 - TCP server (127.0.0.1.65103 -> 127.0.0.1.55555)

この例では、Main タスク、TCP client タスク、TCP listen タスク、 TCP server タスクがそれぞれ1つずつ動作している状態を示している。 各行の先頭の数字はタスクIDである。

set - パラメータを表示・設定

書式:

set [var1[=[val1]] [var2[=[val2]] ... ]

パラメータを表示または設定する。 var1, var2, ... はパラメータ名、val1, val2 ... は設定値である。

引数の形式によって動作が異なる。

引数が無いとき
設定可能なパラメータと現在の値を一覧表示する。
パラメータ名のみのとき
そのパラメータの現在値を表示する。
パラメータ名と等号の場合 (var= の形式)
パラメータの設定値を未設定 or デフォルト値に戻す。
パラメータ名と等号と設定値の場合 (var=val の形式)
パラメータに値を設定して表示する。

使用例:

CLI> set
0 - Parameters:
        verbose=no
        print_mode=ascii
        logfile=(unset)
        ssl_mode=(unset)
        ssl_ciphers=(unset)
        ssl_certfile=/home/fujiyosi/.cinwa/cert.pem
        ssl_keyfile=/home/fujiyosi/.cinwa/key.pem

CLI> set ssl_certfile=~/.cinwa/cert.pem ssl_keyfile=~/.cinwa/key.pem
0 - ssl_certfile=/home/fujiyosi/.cinwa/cert.pem
0 - ssl_keyfile=/home/fujiyosi/.cinwa/key.pem

設定できるパラメータについては後述。

exit - プログラムを終了

書式:

exit

プログラムを終了する。

CLI の使い方

CLI モードでは EditLine ライブラリ(libedit) を使用して行編集機能を 提供している。CLI で使用できる内蔵コマンド、設定項目および 設定方法については editrc(5) のマニュアルを参照されたい。

特殊文字のエスケープ

コマンド行に含まれる特殊文字はシェルと同じ方法でエスケープすることができる。

例: 空白文字の送信:

CLI> send -p 'hello  I   am    Nancy' -rn

例: 空白文字の送信その2:

CLI> send -p hello\ \ I\ \ \ \ am\ \ \ \ Nancy -rn

キーバインド

デフォルトで Emacs 風キーバインドになっている。 ^B でカーソルを左へ1文字移動、^F でカーソルを右へ1文字移動、 ^P で1つ前のコマンドに移動、^N で1つ後のコマンドに移動、など。 ^B は Control キーを押しながら B を押すことを意味する。

キーの設定および設定内容の表示は bind コマンドで行なう。

例: 現在のキーバインドを表示:

CLI> bind -a
Standard key bindings
"^@"           ->  em-set-mark
"^A"           ->  ed-move-to-beg
"^B"           ->  ed-prev-char
"^C"           ->  ed-tty-sigint
"^D"           ->  em-delete-or-list
(以下省略)

例: キーバインドを vi 風に変更:

CLI> bind -v

補完

デフォルトでは ^I に補完機能が割り当てられている。

補完には、コマンド名補完とファイル名補完がある。

コマンド名補完

コマンド名を補完する。 カーソルが先頭ワードに置かれている場合のみ適用される。

例:

CLI> ★ここで ^I を押す
close     exit      listen    set
connect   info      send      sslstart
CLI> c★ここで ^I を押す
close     connect
CLI> co★ここで ^I を押す
CLI> connect ★補完完了

2ワード目以降で ^I を入力するとコマンドの使い方が表示される。:

CLI> connect ★ここで ^I を押す
usage: connect [-S] <host> <serv>
CLI> connect
ファイル名補完

ローカルファイルシステム上のファイルパスを補完する。 ファイル名補完が適用されるケースは以下の2パターンある。

  • -f オプションの次のワード
  • xxxfile= に続く文字列(xxx は空白以外の文字列)

例:

CLI> send -f★ここで ^I を押す
.svn/        complete.o   na_ctlmsg.o  nacho_ssl.o  sockmacro.o
Makefile     datastr.o    na_misc.o    nacho_tcp.o  sslmacro.o
base64.o     getoptot.o   nacho        nacli        stdeasy.o
bufout.o     libtmp.a     nacho.o      nacli.o      task.o
cli.o        na_cmdopt.o  nacho_log.o  nbsock.o     toktok.o
CLI> send -fs★ここで ^I を押す
sockmacro.o  sslmacro.o   stdeasy.o
CLI> send -fss★ここで ^I をを入力
CLI> send -fsslmacro.o

注意点として、bind -v により vi 風キーバインドに変更した場合、 または bind -e により Emacs 風キーバインドに再設定した場合、 ^I のバインドが消えてしまう。 その場合は、以下のようにして bind コマンドにより再設定できる。:

CLI> bind ^I cli-complete

別のキーに割り当てるならば ^I の部分を変更する。

ヒストリ

ユーザが CLI から投入したコマンドはヒストリとして保存される。 Emacs 風キーバインドならば ^P で1つ前のコマンドに移動、 ^N で1つ後のコマンドに移動する。

ヒストリに保存するコマンド数の上限は history size N により設定できる。 例えば history size 100 を実行すると最大100個のコマンドがヒストリに 保存される。

nacho/nacli はプログラムを終了するとき現在のヒストリの内容を ヒストリファイルに保存し、次回起動時に復旧する。

ヒストリファイルは、環境変数 NACHO_DIR 設定時はそのディレクトリ、 それ以外のときはディレクトリ ~/.nacho 以下に置かれる。 ファイル名は nacho では history.nacho、nacli では history.nacli である。 これらは nacho が内部で管理するものであるためユーザが意識する必要はない。

例: ヒストリを表示:

CLI> history
1 connect smtp.gmail.com submission
2 send ehlo localhost -rn
3 send rset -rn
4 send quit -rn
5 history

例: ヒストリ保存行数を100行に設定:

CLI> history size 100

注意点: nacho では内蔵コマンドを実行したあとイベント待ちモードに遷移するため CLI には戻らない。CLI に戻るためには更に改行を入力すること。 一方 nacli では内蔵コマンドを実行するとすぐに CLI に戻る。

設定ファイル (~/.editrc)

CLI の初期設定を ~/.editrc に記述できる。 ~/.editrc は EditLine (libedit) を使用するプログラムから共通に 参照されるファイルであり、:

プログラム名:コマンド 引数 ...

という形式の行を並べたものである。

nacho および nacli のプログラム名は nacho である。 nacho / nacli は起動するとこのファイルの中の nacho: で始まる行の コマンドを実行することで CLI の初期設定を行なう。

以下の例は、vi ライクのキーバインドにし、ヒストリ保存数を100に設定する。:

nacho:bind -v
nacho:history size 100

詳しくは editrc(5) のマニュアルページを参照のこと。

制限事項

現状、CLI では日本語を含めマルチバイト文字の入力には対応していない。

マルチバイト文字を送信するためには、送信データを格納したファイルを用意し、 send コマンドの -f オプションでファイル名を指定する。

タスク

以下の4種類のタスクが存在し、必要に応じて生成される。 Main タスクを除き close コマンドを発行することでタスクが終了する。

Main タスク
タスク番号 0 を持つ特別なタスク。 nacho 起動時に必ず起動し、プログラムを終了するまで終了しない。
TCP client タスク
TCP コネクションのクライアント側に割り当てられるタスク。 connect コマンドにより生成され、サーバへTCPコネクションの確立を試みる。 コネクションが確立するとそのコネクションに関するイベントを受け持つ。 コネクションが閉鎖すると終了する。
TCP server タスク
TCP コネクションのサーバ側に割り当てられるタスク。 TCP listen タスクが待ち受けているアドレスに接続があると生成され、 そのコネクションに関するイベントを受け持つ。 コネクションが閉鎖すると終了する。
TCP listen タスク
TCP のサーバとしてクライアントからの接続を待ち受けるためのタスク。 listen コマンドにより生成され、クライアントからの接続を待ち受ける。 接続を受けるたびに TCP server タスクを起動する。 close コマンドにより終了する。

各タスクにはタスクIDが割り当てられる。 info コマンドによりタスクの一覧を表示できる。

パラメータ

set コマンド等で設定できるパラメータを以下に示す。

パラメータ名 機能
verbose yes なら冗長表示を有効化、no なら無効化。デフォルトは no。
print_mode

送受信データの表示形式を指定する。デフォルトは ascii。

  • a または ascii: ASCII 行表示モード(デフォルト)。 改行までを1行に表示する。 非表示文字は \xNN 形式で表示する(NNは16進2桁)。
  • x または hexdump: 16進ダンプ形式で表示
  • m または multibyte: 行表示モードのマルチバイト文字対応版。 環境変数 LC_CTYPE または LANG に設定されたロケールで 表示文字か非表示文字かを判定する。
  • ロケール名: 行表示モードのマルチバイト対応版。 指定されたロケールで表示文字か非表示文字かを判定する。
logfile イベント情報の出力先ファイル名を指定。初期値は「未指定」。 logfile が未指定のときは標準出力にのみイベント情報を 書き出す。 logfile が指定されたときは両方にイベント情報を書き出す。
ssl_mode

SSL で使用するプロトコルバージョンを 2、3、23、tls の いずれかで指定する。

  • 2: SSLv2
  • 3: SSLv3
  • tls: TLSv1
  • 23: クライアントでは SSLv2 を使用する。 サーバでは SSLv2 と SSLv3 を自動判定する(デフォルト)。
ssl_ciphers SSL でデータの暗号化に使用する暗号方式を指定する。 openssl ciphers コマンドで表示されるやつを指定可能。 デフォルトは未設定(→ OpenSSL のデフォルト値となる)
ssl_certfile SSL の証明書ファイル名を指定。 ただし現状は PEM 形式のファイルのみサポート。 デフォルトは未設定だがサーバになる場合は設定必須。
ssl_keyfile ssl_certfile に対応する秘密鍵ファイル名を指定。 ただし現状は PEM 形式のファイルのみサポート。 デフォルトは未設定だがサーバになる場合は設定必須。

環境変数

nacho が参照する環境変数を示す。

環境変数 機能
NACHO_DIR 作業ファイルを格納するディレクトリパスを設定。 未指定のときは ~/.nacho となる。
NACHO_FLAGS nacho のコマンドライン引数に追加する引数を指定する。

作業用ファイル

nacho が内部的に使用するファイルを示す。 基本的にはユーザが意識する必要はないはず。

各ファイルは、環境変数 NACHO_DIR 設定時はそのディレクトリに置かれ、 それ以外のときはディレクトリ ~/.nacho 以下 に置かれる。

ファイル名 内容
nacho.history nacho で ユーザが CLI から投入したコマンドが保存される。 nacho 終了時に記録され、再起動するとロードされる。
nacli.history nacli で ユーザが CLI から投入したコマンドが保存される。 nacli 終了時に記録され、再起動するとロードされる。
ctlmsg.sock CLI から nacho 本体にコマンドを発行するために使用される UNIX ソケットファイル。nacho 動作中のみ存在する。 ただし、オプション -c でソケットファイル名を指定した ときはそのファイルが使われる。

リリース履歴

日付 バージョン 変更内容
2010/09/02 0.2
  • 制御メッセージ通信をデータグラムから ストリームに変更 (しかし新たな問題が…)
  • エラーメッセージに関する不具合を修正
2010/08/23 0.1.1 Base64 符号化に関するバグを修正
2010/08/22 0.1 初回リリース

トップ > ソフトウェア > Nacho

[前ページ] [次ページ]