|
>1618 gixs様 レスが遅くなってしまい、すいません。 文章の書き方はすみませんでした。 他の人にも、時系列で書いた方が分かりやすいと指摘を受けました。 一度、リブートをしまして1からはじめてみましたので 手順を書いてみます。 1.NISサーバの設定 NIS管理しようとしているユーザの作成/etc/passwd smitty chypdom smitty mkmaster コマンドを発行し正常終了しました。 2.NISクライアントの設定 smitty chypdomでNISサーバと同じドメインを入力しました smitty mkclientで開始時期を決め実行しました。 /etc/passwdをNIS管理用に編集しました passwdを保存すると、クライアントのログインが不可となってしまうのです。 ypcat passwdも応答がない状態になってしまいます。 私のほうでも、色々と思い当たる物は考えてみたのですが、 NIS以前に 1.会社の引越しがあってIPが変わった ということもあったのです。 ただ、私のほうで何をどう見てよいかわからないレベルなもので 他の人にも聞いたりしているのですが、特に問題ないのではという回答なのです。 もし、思い当たる点があれば教えていただきたく思います。 IPが変わる際に設定しなければ行けないファイルhostsファイルなど があれば、教えていただけると、非常にうれしいです。 毎回毎回、分かり図らい文章だと思いますが、よろしくお願い致します |
|
> 文章の書き方はすみませんでした。 いえいえ、人のことを言えるほどでもありませんので。 NISクライアント側には、 1. そもそもNISの/etc/passwdが見えているか 2. 見えていたら、それをログイン時に参照できているか の2段階のチェックポイントがあります。 > passwdを保存すると、クライアントのログインが不可となってしまうのです。 > ypcat passwdも応答がない状態になってしまいます。 ypcat passwdの応答が無いということは、まだ第1段階の問題のようです。 > 2.NISクライアントの設定 > smitty chypdomでNISサーバと同じドメインを入力しました > smitty mkclientで開始時期を決め実行しました。 > /etc/passwdをNIS管理用に編集しました smitty mkclientの時、NISサーバはホスト名で入力したのでしょうか、 それともIPアドレスですか? ホスト名で入力するなら、ローカルの/etc/hostsにNISサーバのエントリが必要です。 IPアドレスで入力するなら、結局、 > マップの更新後に、stopsrc -s ypbind > startsrc -s ypbind -a "ypsetme" > ypset (ServerのIPアドレス) > を行なったところ、無事に設定する事が出来ました。 これを、smittyが内部的に実行するだけだと思いますが。 (明示的にNISサーバを指定しなくても、ブロードキャストで見つけられる・・・はず、 ですが、何とも言えません) ローカルの/etc/hostsにNISサーバのエントリがあるのに、 ホスト名での指定がうまく行かない場合、ホスト名の名前解決がうまくないのでしょう。 > 一度、/etc/netsvc.confを作り > hosts=local,nisを作成してやって見たのですが こう言っているので、問題無いとは思いますが。 ただ、古いAIXでは、このファイルは無かったはずです。 ypcat passwdが応答の無い時、 ping [NISサーバのホスト名] の応答はあるのでしょうか? 無いなら、ローカルの/etc/hostsを先に見ていないと判断できます。 > 毎回毎回、分かり図らい文章だと思いますが、よろしくお願い致します # どうでもいい突っ込み。 # 「わかりづらい」なら、この誤変換は出ないと思います。 |
|
>>1653 68user 様 >Net::SOCKS モジュールが参考になるかもしれません。 レスありがとうございます。 Net::SOCKS を使ったソースを参考にがんばってみたいと思います。 |
|
>gixs様 >smitty mkclientの時、NISサーバはホスト名で入力したのでしょうか、 >それともIPアドレスですか? この画面なのですが、AIXのバージョンが4.2.1の為に smitty mkclientで表示される画面が、 「* NIS クライアントを開始する時期 両方」 しか、表示されないのです >ypcat passwdが応答の無い時、 >ping [NISサーバのホスト名] >の応答はあるのでしょうか? 試して見たのですが、応答ありませんでした。 ># 「わかりづらい」なら、この誤変換は出ないと思います タイプミスで「わかりずらい」と打っていました。^^; |
|
はじめまして。 kaoriと申します。 Perl言語を勉強中です。 非常に参考になる情報をありがとうございます。 いつも感心しながら参考に勉強させてもらっています。 どうしてもわからないので教えてください。 Socketの使い方はなんとなく判ったのですが、IPv6のSocketはどういうふうに すればよいのでしょうか? Socket6っていうのをインストールしてみましたが、よくわかりません。。 私の環境は、FreeBSD-RELEASE4.1に、Perl5です。 こんな感じで作っていて、IPv4ではちゃんと動作しています。 $port = getservbyname($port_no,'tcp') || $port_no; $socket = IO::Socket::INET->new(PeerAddr => 127.0.0.1, PeerPort => 80, Proto => 'tcp', ); ご助言、よろしくお願いいたします。 |
|
>>1659 kaori - IPv6 環境が構築してあるか。ping6 コマンドを使って IPv6 で反応が返ってくるか (localhost 宛でもよい)。 - perl が IPv6 に対応しているかどうか。perl-5.005_03 なら多分 無理。5.6 か 5.7 で対応したかもしれません。Socket6 というのを 使えば 5.005_03 でもいけるのかもしれませんが、僕は試したことが ありません。 それをクリアすれば、少しの例外を除いて基本的には書き方は同じです (そうしないとソースレベルでの互換性が全くなくなるので)。例外と いうのは gethostbyname の代わりに getaddrinfo を使うとか。 とりあえず perldoc Socket6 してみてください。サンプルの ひとつでも載っているのではないでしょうか。 |
|
>>1660 68user > 少しの例外を除いて基本的には書き方は同じです (そうしないと > ソースレベルでの互換性が全くなくなるので)。例外というのは > gethostbyname の代わりに getaddrinfo を使うとか。 あー激しく不正確だなぁ。gethostbyaddr で IPv6 なプログラムは 書けます。でも、AF_INET を AF_INET6 にしないといけないとか、 struct sockaddr_in を struct sockaddr_in6 にするだとか、 ソースレベルでの書き換えが必要になります。しかもそのように 書き換えると IPv4 では動きません。 そりゃまずいというわけで、IPv4 でも IPv6 でも同じ書き方が できるような新しいライブラリが追加されました。getaddrinfo という関数や AF_UNSPEC というアドレスファミリ (AF_INET とか AF_INET6 とかを指定する必要がない) などなど。 というわけで、IPv6 only のプログラムは簡単に書けますが、 書いちゃいけません。IPv4/v6 両方で動くようなプログラムを 作るべきです。 あと、FreeBSD 4.1-RELEASE のデフォルト状態なら IPv6 対応の はずですね。/etc/inetd.conf の #echo stream tcp6 nowait root internal あたりを有効にして inetd を再起動して、それとお話しする クライアントを書いてみるといいでしょう。 以上、IPv6 アプリを書いたことのない者 (IPv6 を使ったことさえ ない) のたわごとでした。 |
|
しつこくて失礼。perl5.005_03 に Socket6 モジュールを入れてみました。 >>1660 68user > とりあえず perldoc Socket6 してみてください。サンプルの > ひとつでも載っているのではないでしょうか。 ばっちり載ってますね。これをちょいといじって % netstat -a | grep tcp6 | grep echo tcp6 0 0 *.echo *.* LISTEN なサーバにつなげようとしたら、 Can't load '/home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so' for module Socket6: /home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so: Undefined symbol "in6addr_any" at /usr/local/lib/perl5/5.00503/i386-freebsd/DynaLoader.pm line 169. だそうで。原因究明はまた後日…と言いたいところだけれど、 こりゃ僕のレベルではいかんともしがたいですな。 |
|
あーしつこい。でも初 IPv6 体験の記念に (やってることは しょぼいなぁ)。 4.1-RELEASE あたりなら、telnet も IPv6 ready なので、 % telnet ::1 echo で IPv6 で localhost の echo サーバとお話できます。 netstat で tcp6 なコネクションが張られていること、 tcpdump で IPv6 なデータグラムが流れていることを 確認してください。 % tcpdump -i lo0 21:56:30.055419 localhost.1206 > localhost.echo: . ack 5 win 57344 (DF) [tos 0x10] 4510 0028 0eca 4000 4006 2df4 7f00 0001 ... 21:54:41.404023 localhost.1204 > localhost.echo: S 705795707:705795707(0) win 16384 <mss 16324> 6000 0000 0018 0640 0000 0000 0000 0000 ... 先頭1バイトが4なのが IPv4、6 が IPv6 です。 |
|
> この画面なのですが、AIXのバージョンが4.2.1の為に > smitty mkclientで表示される画面が、 > 「* NIS クライアントを開始する時期両方」 > しか、表示されないのです 確認しました。 となると、ブロードキャストでNISサーバを見つけるはずですね。 > >ypcat passwdが応答の無い時、 > >ping [NISサーバのホスト名] > >の応答はあるのでしょうか? > 試して見たのですが、応答ありませんでした。 ローカルの/etc/hostsにNISサーバのエントリがあっても、応答無しですか? あまり引き延ばして、却って失望が大きくなってしまうのが辛いので、 状況をまとめます。 /etc/hostsにNISサーバのエントリがあるとして、 1. ping [NISサーバのホスト名]が応答なし 少しだけ脈あり。名前解決の順序がおかしいようです。 FAQの1.800(http://www.landfield.com/faqs/aix-faq/part3/) にありますが、環境変数NSORDERがあるとか?(可能性は低いですが) 2. ping [NISサーバのホスト名]が応答あり 今さら、この結論も気が引けますが、 ypwhich [NISサーバのIPアドレス] でうまくいくなら、それで結果オーライにしてしまってよいのではないでしょうか。 |
|
kaoriです。 ご丁寧な回答ありがとうございました! IPv6の環境は整っています(OCNの実験に参加しています)ので、 教えて頂いたのを参考に色々試してみます! > というわけで、IPv6 only のプログラムは簡単に書けますが、 > 書いちゃいけません。IPv4/v6 両方で動くようなプログラムを > 作るべきです。 本当にその通りですね。 アドバイスありがとうございます。 今後もよろしくお願いします! |
|
ちょっと便乗して試して見たのですが、 >>1660 68user > - perl が IPv6 に対応しているかどうか。perl-5.005_03 なら多分 > 無理。5.6 か 5.7 で対応したかもしれません。Socket6 というのを > 使えば 5.005_03 でもいけるのかもしれませんが、僕は試したことが > ありません。 なんか、FreeBSD の /usr/bin/perl は IPv6 に対応してない感じですね。 4-stable も 5-current(こちらは perl 5.6.0)も試しました。 perldoc Socket6 して出て来る IPv6 の daytime のサンプルを試しましたが、 socket: Protocol not supported などというエラーを返します。もちろん、inetd.conf 書き換えて、IPv6 の daytime は使えるようにしてあるのですが。一方、添付の C プログラムは うまくいくので、設定ミスではないと思うのですが。だいたい telnet ::1 13 もちゃんと反応しますし。 >>1665 kaori うちでは、localhost しか試せないのですが、kaori さんのところでは perl でもうまく行っていますか? perl 自体にも IPv6 のパッチあてないと いけないのでしょうか? とりあえず、Socket6 使って嬉しいのは IPv6/IPv4 両用に書かれたスクリプトでも動作する程度しかありませんね。うちの場合。 KAME パッチをあてて perl を make してみようとも考えましたが、 perl の開発スピードの方が早すぎるようで、パッチが追従しきれてません。 どなたか、うまくいったという方がいらっしゃったら、教えてください。 #include <stdio.h> #include <string.h> #include <err.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int main(int argc, char *argv[]) { struct addrinfo hints, *res, *res0; int error; int s; const char *cause = NULL; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo("localhost", "daytime", &hints, &res0); if (error) { err(1, "%s", gai_strerror(error)); } s = -1; for (res = res0; res; res = res->ai_next) { char hostname[NI_MAXHOST], servname[NI_MAXSERV]; s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (s < 0) { cause = "socket"; continue; } if (getnameinfo(res->ai_addr, res->ai_addr->sa_len, hostname, NI_MAXHOST, servname, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV) < 0 ) { err(1, "getnameinfo"); } else { printf("connecting to %s port %s...\n", hostname, servname); } if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { cause = "connect"; close(s); s = -1; continue; } break; } if (s < 0) { err(1, cause); } else { char buff[256]; memset(buff, 0, sizeof(buff)); if (recv(s, buff, 256, 0) < 0) { err(1, "recv"); } printf("%s\n", buff); } freeaddrinfo(res0); return 0; } |
|
>>1666 rosegarden > なんか、FreeBSD の /usr/bin/perl は IPv6 に対応してない感じですね。 > 4-stable も 5-current(こちらは perl 5.6.0)も試しました。 > perldoc Socket6 して出て来る IPv6 の daytime のサンプルを試しましたが、 > socket: Protocol not supported > などというエラーを返します。 原因が分かりました。ああ、余計なポストするんじゃなかったな。 FreeBSD の /usr/bin/perl はちゃんと IPv6 対応していますね。 私の場合 ports で Socekt6 インストールしたのですが、ちゃんと動きました。 ところで、Socket6.pm 持っている人は、サンプルが次のようになっていませんか? use Socket; use Socket6; @res = getaddrinfo('hishost.com', 'daytime', AF_UNSPEC, SOCK_STREAM); $family = -1; while (scalar(@res) >= 5) { ($family, $socktype, $proto, $saddr, $canonname, @res) = @res; ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); print STDERR "Trying to connect to $host port port $port...\n"; socket(Socket_Handle, $family, $saddr, $proto) || next; (以下略) 投稿した C プログラム眺めていて気がついたのですが、 socket(Socket_Handle, $family, $saddr, $proto) || next; って socket(Socket_Handle, $family, $socktype, $proto) || next; のミスじゃありませんか? # なんで投稿した直後に気が付くんだろう。 # 私の勘違いかなぁ? 最近ぼけているし...。 ちなみに、私の場合次のようにしたら、スクリプトはうまく動きました。 環境は 4-stable + perl 5.00503 + Socket6 です。 #!/usr/bin/perl use Socket6; use Socket; @res = getaddrinfo('localhost', 'daytime', AF_UNSPEC, SOCK_STREAM); $family = -1; while(scalar(@res) >= 5) { ($family, $socktype, $proto, $saddr, $canonname, @res) = @res; ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); print STDERR "Trying to connect to $host port port $port $family...\n"; socket(Sock, $family, $socktype, $proto) || die "socket: $!"; connect(Sock, $saddr) && last; close(Sock); $family = -1; } if( $family != -1 ){ print "connected to $host port $port\n"; while( defined($line = <Sock>) ){ print "$line\n"; } close(Sock); } exit; # 穴があったら入りたいです。 |
|
>>1667 rosegarden そうだ。補足です。下のスクリプトですが、 > socket(Sock, $family, $socktype, $proto) || die "socket: $!"; この部分の die 云々のところは next にして > socket(Sock, $family, $socktype, $proto) || next; とすると IPv6/IPv4 の daytime クライアントになります。私の場合には 最初から、/etc/rc.conf に ipv6_enable="YES" が入っているのと、 デバッグの意味もあって、上の die を入れておいただけです。 socket の三番目の引数は SOCK_STREAM とかそういうのが入ります。 私がはまったのは、サンプルをコピー & ペーストして書き換えたものを 使っていたからです。CPAN にある Socket6 は直っているかも知れません。 (でも、ダウンロードしたのは昨日の夕方ですが。) # コピー & ペーストなんて、安直なことしたバチがあったんですね。 上のように直して、inetd.conf で IPv4 の方だけ有効にしておくと % perl daytime6.pl Trying to connect to ::1 port port 13... Trying to connect to 127.0.0.1 port port 13... connected to 127.0.0.1 port 13 Fri Jan 26 16:59:50 2001 という感じで、IPv6 が有効だと % perl daytime6.pl Trying to connect to ::1 port port 13... connected to ::1 port 13 Fri Jan 26 17:01:16 2001 になります。IPv6 見てから、IPv4 見ると言うのは、システムによっては 変わるのでしょうか? とりあえず、うちの場合は telnet も ftp もこの順番です。 # しかし、なぜ投稿してから気がつくんだろう?? # 68user 様ならびに皆様、再三のゴミ書き申し訳ありません。 |
|
>>1667 rosegarden > 私の場合 ports で Socekt6 インストールしたのですが、ちゃんと動きました。 うちの 4.2-STABLE だと >>1662 68user > Can't load '/home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so' でしたが、会社の 4.1-RELEASE だとうまくいきました。うちの環境が 変だったのかもしれません。 >>1667 rosegarden > socket(Socket_Handle, $family, $saddr, $proto) || next; > って > socket(Socket_Handle, $family, $socktype, $proto) || next; > のミスじゃありませんか? む、まさにそこではまってました。それを直すと動いたのですが、 この Socket6 って変じゃないでしょうか? 以下の echo クライアントが デッドロックしてしまうようです。 #!/usr/bin/perl use Socket6; use Socket; @res = getaddrinfo('localhost', 'echo', AF_UNSPEC, SOCK_STREAM); $family = -1; while(scalar(@res) >= 5) { ($family, $socktype, $proto, $saddr, $canonname, @res) = @res; ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); print STDERR "Trying to connect to $host:$port $family...\n"; socket(Sock, $family, $socktype, $proto) || die "socket: $!"; connect(Sock, $saddr) && last; close(Sock); $family = -1; } if( $family != -1 ){ select(Sock); $|=1; select(STDOUT); print "connected to $host port $port\n"; print Sock "test!\n"; print <Sock>; close(Sock); } で、 print <Sock> の部分を $len = read(Sock,$buf,6); print "len=$len\n"; print "buf=$buf"; とかすれば動きますが、 $len = read(Sock,$buf,7); だとダメです。内部でバッファリングしちゃってるのかなぁ? >>1668 rosegarden > IPv6 見てから、IPv4 見ると言うのは、システムによっては > 変わるのでしょうか? /etc/hosts のエントリ順 (::1 と 127.0.0.1 のどちらが上にあるか) に よって変わるようです。 |
|
ぐぅ、あほだ。 >>1669 68user > print <Sock> そりゃ動かんわな。$buf = <Sock>; print $buf か print scalar(<Sock>) でした。失礼。 |
|
>>1667 rosegarden > socket(Socket_Handle, $family, $socktype, $proto) || next; > のミスじゃありませんか? で、これどうしましょうかね。 Hajimu UMEMOTO <ume@FreeBSD.org> 宛に投げればよきにはからってくれるでしょうけど、僕が連絡しても いいですし、rosegarden さんが既に連絡済みであればそういうことで。 |