総合手引 | セクション 3 | English | オプション |
#include <unistd.h>
rcmd() 関数は gethostbyname(3) を使用してホスト *ahost を調べ、ホストが存在しない場合は -1 を返します。 ホストが存在する場合は、ホストの標準名に *ahost を設定し、よく知られているインターネットポート inport に存在するサーバとの接続を確立します。
接続が確立されると、タイプ SOCK_STREAM のインターネットドメインのソケットが呼び出し側に返され、また stdin と stdout としてリモートコマンドに渡されます。 fd2p が 0 以外である場合は、制御プロセスへ追加のチャンネルが設定され、 その記述子が *fd2p に収められます。 制御プロセスは、このチャンネルでコマンド (ユニット 2) からの診断出力を返し、 また UNIX シグナル番号としてこのチャンネルのバイトを受け取って、 コマンドのプロセスグループに転送します。 fd2p が 0 である場合は、 stderr (リモートコマンドのユニット 2) が stdout と同じように作成されます。 任意のシグナルをリモートプロセスに送信する準備はされませんが、 バンド外のデータを使用することでリモートプロセスの注目を得ることはできます。
プロトコルの詳細については、 rshd(8) を参照してください。
rresvport() 関数は、特権インターネットポートを持つアドレスに結び付いたソケットを 入手するのに使います。 このソケットは、 rcmd() やその他いくつかの関数での使用に適しています。 特権インターネットポートは、 0 から 1023 の範囲にあるものです。 この種のアドレスをソケットに結合できるのはスーパユーザのみです。
iruserok() 関数と ruserok() 関数は、 gethostbyname(3) ルーチンが返すリモートホストの IP アドレスか名前、2 つのユーザ名、 そしてローカルユーザの名前がスーパユーザの名前であるかどうかを示すフラグを 引数にとります。 ユーザがスーパユーザ でない 場合は、 /etc/hosts.equiv ファイルをチェックします。 この検索が実行されなかった場合、またはこの検索が成功しなかった場合は、 ローカルユーザのホームディレクトリの .rhosts をチェックし、サービスへの要求が許可されているかどうかを確認します。
このファイルが存在しない場合や通常のファイルでない場合、またはユーザや スーパユーザ以外がこのファイルの所有者である場合、あるいは所有者以外がこの ファイルに書き込める場合、チェックは自動的にエラーとなります。 マシン名が " hosts.equiv" ファイルにリストされている場合、またはホストとリモートユーザ名が " .rhosts" ファイルに存在する場合は 0 が返されます。 その他の場合、 iruserok() と ruserok() は -1 を返します。 gethostname(3) で入手したローカルドメインがリモートドメインと同じである場合は、 マシン名のみを指定する必要があります。
iruserok() 関数は、セキュリティ上の理由で強く推奨されます。 ruserok() 関数は DNS 全体を信用する必要があり、侵害される可能性がありますが、 iruserok() はせいぜいローカル DNS を信頼する必要しかありません。
"_af" や "_sa" といった接尾辞のついた関数、たとえば rcmd_af(), rresvport_af() や iruserok_sa() などは、IPv6 と IPv4 ポートを扱えることを除いて、 対応する接尾辞のない関数と同じ動作をします。
"_af" 接尾辞は、アドレスファミリ (下記参照) を指定するために使われる af 引数が加わっていることを意味しています。 af 引数の拡張は、バイナリアドレス引数を持たない関数に対して実装されています。 バイナリアドレスの代わりに af 引数はどのアドレスファミリが必要かを指定します。
"_sa" 接尾辞は、関数が汎用ソケットアドレスと長さを 引数に持っていることを意味しています。 ソケットアドレスはプロトコルに依存しないデータ構造なので、 必要に応じて IPv4 と IPv6 のソケットアドレスを渡すことができます。 sa 引数の拡張は、プロトコルに依存したバイナリアドレス引数を渡す関数に対して 実装されています。 引数は、汎用的な方法でいくつものアドレスファミリをサポートするように、 更に汎用的なアドレス構造に置き換えられる必要があります。
"_af" 接尾辞も "_sa" 接尾辞もついていない関数は、IPv6 と IPv4 の両方とも扱える ruserok() 関数を除いて、IPv4 のみで動作します。 アドレスファミリを切替えるには、 af 引数に AF_INET もしくは AF_INET6 を設定しなければなりません。 rcmd_af() に対しては、 PF_UNSPEC も許されます。
成功した場合、 rresvport() 関数は有効で結合したソケット記述子を返します。 エラーが発生した場合は -1 を返し、エラーの原因に従ってグローバル変数 errno が設定されます。 「すべてのネットワークポートが使用されている」ことを示す場合は、 エラーコード EAGAIN がオーバロードされます。
RFC2292, Advanced Socket API for IPv6,
, ,draft-ietf-ipngwg-rfc2292bis-01.txt, Advanced Socket API for IPv6,
, , ,RCMD (3) | March 3, 2000 |
総合手引 | セクション 3 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | Like a classics radio station whose play list spans decades, Unix simultaneously exhibits its mixed and dated heritage. There's Clash-era graphics interfaces; Beatles-era two-letter command names; and systems programs (for example, ps) whose terse and obscure output was designed for slow teletypes; Bing Crosby-era command editing (# and @ are still the default line editing commands), and Scott Joplin-era core dumps. | ” |
— The Unix Haters' handbook |