| 総合手引 | セクション 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.
| “ | The most horrifying thing about Unix is that, no matter how many times you hit yourself over the head with it, you never quite manage to lose consciousness. It just goes on and on. | ” |
| — Patrick Sobalvarro | ||