talk
Table of Contents
talk
前回cursesを利用してるアプリを抽出した時、talkなんてのが出てきた。潜っ てみたいんだけど、正体はどんな物?
DESCRIPTION talk is a visual communication program which copies lines from your terminal to that of another user.
二人でお喋りを楽しむツールみたいだ。と、言うことは通話相手が必要なんだ な。最近は個人利用ばっかりなんで、ユーザーは自分しかいない。 この際、もう一つアカウントを造ろう。どうせなら有名人がいいな。まっさき に思いつくのは、リチャードストールマン(rms)さんだ。でもGNUだからなあ。 BSD陣営には馴染まないよ。じゃ、Bill Joyさんがいいか。何時でもlogin出来 るように準備しときます。
昔はunixのメンテナンスの為に、ケン・トンプソンは自分のアカウントが入っ たテープを配布してたらしい。牧歌的な時代があったんだねぇ。 5年越しに破られたUnixの父ケン・トンプソン氏のパスワードとは?
adduser して、joy ってアカウントを作成。彼と通話してみます。 まずは、ログインしてるか確認。
ob$ w 7:47AM up 2:17, 2 users, load averages: 0.59, 0.50, 0.49 USER TTY FROM LOGIN@ IDLE WHAT joy C0 - 6:22AM 9 -ksh sakae p0 192.168.1.5 6:56AM 0 tmux: client (/tmp/tmux-1000/default ob$ who joy ttyC0 Mar 11 06:22 sakae ttyp0 Mar 11 06:56 (xx.xx.xx.xx)
確認は、wでもwhoでも、お好きな方を。
ob$ talk joy [No connection yet] [Checking for invitation on caller's machine] [Checking for invitation on caller's machine] : --------------------------------------------------------------------------------
画面が2つに割れて、いかにもcursesしてますってはなるんだけど、相手から の返答待ちが永遠と続いてしまう。なぜかな?
このままでは進展が無いので、manを見直し。SEE ALSOにヒントが有るだろう。
SEE ALSO mail(1), mesg(1), who(1), write(1), talkd(8)
mesg, write
whoは先程使ったからいいとして、メールは今の時代にそぐわない(と思う)の で、無視して、mesgです。
The mesg utility is invoked by a user to control write access others have to the terminal device associated with the standard error output. Write access is allowed by default, and programs such as talk(1) and write(1) may display messages on the terminal.
関係有りそうなwriteが出てきたので、、、
DESCRIPTION write allows you to communicate with other users, by copying lines from your terminal to theirs.
joyさんに通知したいぞ。
ob$ write joy write: joy has messages disabled
これって、着信拒否してるんだな。許可はjoyさん自身が、mesg y する事だな。 引数を与えないと、現在の状態が表示されるとな。
ob$ mesg is y ob$ Message from joy@ob.my.domain on ttyC0 at 07:20 ...ob.my.domain" 07:20 12-Mar-24 hello sakae-san, I am joy. good morninng. EOF
これsakaeの端末側。joy側からメッセージを送信。受信拒否にはなっていない ので、ちゃんと受信できた。
また、joy側で、mesg y しておくと、ちゃんと送信できたよ。
ob$ write joy So cold today. care youer self !
一歩前進したような気がする。
where mesg y/n data
これで先に進んでは、もったいない気がする。智はバックヤードにってNHKで も番組造っているからね。この間やってた、造幣局への潜入記、なかなか良かっ たぞ。カメラが入いるのは初めてですって、自画自賛してたな。 国家の宣伝に加担させられただけじゃん、と言ったら水を差してしまうか。 新一万円札やら、新500円硬貨の偽造防止をアッピールしてたな。
オイラーが疑問に思ったのは、mesgの着信許可/不許可のフラグを、どうやっ て保持してるかだ? パッと思いつくのは、環境変数なんだけど。。 バックヤードの扉を開きましょ。
if ((tty = ttyname(STDERR_FILENO)) == NULL) if (stat(tty, &sb) == -1) case 'y': if (chmod(tty, sb.st_mode | S_IWGRP) == -1) err(2, "%s", tty); exit(0); case 'n': if (chmod(tty, sb.st_mode & ~S_IWGRP) == -1) err(2, "%s", tty);
早速、実験開始。
ob$ tty /dev/ttyp1 ob$ ls -l /dev/ttyp1 crw--w---- 1 sakae tty 5, 1 Mar 12 07:48 /dev/ttyp1 ob$ mesg n ob$ ls -l /dev/ttyp1 crw------- 1 sakae tty 5, 1 Mar 12 07:49 /dev/ttyp1
デバイスに対して書き込み許可が有るか無いかで、判定/制御してるんだな。 ちなみに、数有るターミナル・デバイスは、どうなってる?
ob$ ls -l /dev/ttyp[0-5] crw--w---- 1 sakae tty 5, 0 Mar 12 08:15 /dev/ttyp0 crw------- 1 sakae tty 5, 1 Mar 12 08:15 /dev/ttyp1 crw--w---- 1 sakae tty 5, 2 Mar 12 07:48 /dev/ttyp2 crw-rw-rw- 1 root wheel 5, 3 Mar 11 08:30 /dev/ttyp3 crw-rw-rw- 1 root wheel 5, 4 Jan 29 14:55 /dev/ttyp4 crw-rw-rw- 1 root wheel 5, 5 Jan 29 14:55 /dev/ttyp5 ob$ ls -l /dev/ttyC[0-3] crw--w---- 1 joy tty 12, 0 Mar 12 08:18 /dev/ttyC0 crw------- 1 root wheel 12, 1 Mar 12 05:52 /dev/ttyC1 crw------- 1 root wheel 12, 2 Mar 12 05:52 /dev/ttyC2 crw------- 1 root wheel 12, 3 Mar 12 05:52 /dev/ttyC3
ログインすると、デバイス・プールから、それぞれのユーザーが利用できる様 に整えて、貸出てくれるんだな。
write on your terminal
writeのコードを読むと、 do_write
が、相手の端末に書き込みをしてるっ
た事が分かるんだけど、ちと疑問があるんで、gdbしてみる。
ob$ ./write joy write: open /dev/ttyC0: Permission denied
gdb用に作成したバイナリーを試験実行すると、こんなエラーだ。すかさず Makefileを確認したら、
BINMODE=2555 BINGRP= tty
こんな特殊な設定を要求してた。本体のwriteを確認すると、
ob$ ls -l /usr/bin/write -r-xr-sr-x 1 root tty 13852 Oct 10 23:42 /usr/bin/write
この様にグループttyに対してSet-group-IDが設定されてる。実行時に権 限昇格を許すって事だ。どうやってこのビットを立てるんだったかな? 度忘 れ。そうだ、こういう時は、debug設備が完備したFreeBSDが居るじゃない。
急遽FreeBSDにもjoyさんを招聘したぞ。OpenBSDでadduserする時は、初回に余 分な質問がなされて、/etc/adduser.confを作成させられるんだけど、FreeBSD の場合は、そんな事は無かった。
FreeBSD's adduser(1)
CONFIGURATION The adduser utility reads its configuration information from /etc/adduser.conf. If this file does not exist, it will use predefined defaults.
OpenBSD's adduser(1)
The adduser.conf format is explained within that file and is quite straightforward. The configuration file will be created the first time adduser is run.
OSにより、ポリシーが違うのは面白いな。
sakae@fb:~ $ gdb -q write Reading symbols from write... Reading symbols from /usr/lib/debug//usr/bin/write.debug... (gdb) b do_write Breakpoint 1 at 0x402c5b: file /usr/src/usr.bin/write/write.c, line 301. (gdb) r joy Starting program: /usr/bin/write joy Breakpoint 1, do_write (devfd=3, tty=0xffbfe778 "ttyu0", mytty=0x205f81cd "pts/2", login=0x205f7ccc "sakae") at /usr/src/usr.bin/write/write.c:301 301 fd = openat(devfd, tty, O_WRONLY);
joyさんはu0な端末上に生息してます。その後の流れ。
fd = openat(devfd, tty, O_WRONLY); fclose(stdout); stdout = fdopen(fd, "w"); /* print greeting */ if (gethostname(host, sizeof(host)) < 0) (void)strcpy(host, "???"); now = time((time_t *)NULL); nows = ctime(&now); nows[16] = '\0'; (void)printf("\r\n\007\007\007Message from %s@%s on %s at %s ...\r\n", login, host, mytty, nows + 11);
devfdはメインでオープンされてる /dev の事。だから、この場合は、 /dev/ttyu0をstdoutにして、そこに書き込みしてる事になる。すなわち、相手 の端末に(迷惑にも)表示しちゃうってことだ。
これは、相手がemacsなりviで作業中にもかかわらず、余計な表示がされちゃ うって事。現実の世界でもあるよね。人が食事中にもかかわらず電話がかかっ て来ることが。オイラーの所の昼食は 11:30からです。夕食は17:30からです。 電話を下さる場合は、この時間帯を避けて下さい。しつこい電話は、やむなく 取りますが、ぞんざいな対応になりますんで、あしからず。
talkd
簡単に言うと、マッチング・アプリだな。どこにこのアプリは有るの。 man talkd したのに、ntalkdに案内されたよ。
ob$ locate talkd /usr/include/protocols/talkd.h /usr/libexec/ntalkd /usr/share/man/man8/talkd.8 /usr/src/include/protocols/talkd.h /usr/src/libexec/talkd /usr/src/libexec/talkd/Makefile /usr/src/libexec/talkd/announce.c :
手掛かりのMakefileを見ると、プログラム名は、ntalkdになってた。そして、 inetdも参照せよとな。ってことは、ダエモン一族なのかな?
inetd
FILES /etc/inetd.conf /etc/examples/inetd.conf SEE ALSO comsat(8), fingerd(8), ftp-proxy(8), ftpd(8), identd(8), talkd(8)
例が用意されてたんで、調べてみるも、talkdなんて語句は全く出ていなかっ た。こういう時はFreeBSDを調べてみるに限る。いやパクってくるのさ。
#ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l #ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l #ssh stream tcp nowait root /usr/sbin/sshd sshd -i -4 #ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i -6 #telnet stream tcp nowait root /usr/libexec/telnetd telnetd #telnet stream tcp6 nowait root /usr/libexec/telnetd telnetd : # run comsat as root to be able to print partial mailbox contents w/ biff, # or use the safer tty:tty to just print that new mail has been received. #comsat dgram udp wait tty:tty /usr/libexec/comsat comsat # # ntalk is required for the 'talk' utility to work correctly ntalk dgram udp wait root /usr/libexec/ntalkd ntalkd
やっと出会えた。懐かしいサービスが目白押しだ。ntalkdの所が、comsetの設 定のように、tty:ttyとなっていたので、rootに変更したよ。そして、
ob$ doas rcctl -f start inetd inetd(ok)
起動時に、-f をつけているのは、一時的な実験のためです。
again talk
sakae側から、発呼してみます。talk joy
joy's screen
Message from Talk_Daemon@ob.my.domain at 6:15 ... talk: connection requested by sakae@ob.my.domain. talk: respond with: talk sakae@ob.my.domain
sakae's screen
[No connection yet] [Waiting for your party to respond] [Ringing your party again]
これに対してjoyさんも応答します。talk sakae
joy's screen
[No connection yet] [Connection established] Good moninng sakae -------------------------------------------------------------------------------- Nice to meet joy-san
joyさんのメッセージでカーソルが下画面に移動しちゃうので、Ctl-xして、カー ソルを上に持ってきて、返答します。
sakae's screen
[Ringing your party again] [Connection established] Nice to meet joy-san -------------------------------------------------------------------------------- Good moninng sakae
終了は、Ctl-c です。
tcpdump
どんなパケットが飛び交っているかモニターしてみます。それには、 wiresharkを使うのでしょうが、残念ながらi386版では提供されていません。 虐げられたi386版では、この他にもghc等も公開されてません。早くi386は捨 てろって言う無言の圧力なんでしょうか? めげずにtcpdumpで対抗します。 こちとら、CUIっ子だいと言う心意気ですよ(いや、痩せ我慢だろう)。
ます、ポート番号を調べておきます。
ob$ grep talk /etc/services talk 517/udp ntalk 518/udp
ob$ doas tcpdump -i lo0 -X -w /tmp/LOG port 518 tcpdump: listening on lo0, link-type LOOP
そして、こんな風にパケットをキャプチャーします。 結果を見るには、
ob$ tcpdump -r /tmp/LOG 07:06:41.340802 ob.my.domain.37430 > ob.my.domain.ntalk: udp 84 07:06:41.343645 ob.my.domain.ntalk > ob.my.domain.37430: udp 24 07:06:41.343712 ob.my.domain.37430 > ob.my.domain.ntalk: udp 84 07:06:41.352172 ob.my.domain.ntalk > ob.my.domain.37430: udp 24 07:06:41.352208 ob.my.domain.37430 > ob.my.domain.ntalk: udp 84 07:06:41.352248 ob.my.domain.ntalk > ob.my.domain.37430: udp 24 07:06:50.940985 ob.my.domain.32230 > ob.my.domain.ntalk: udp 84 07:06:50.941040 ob.my.domain.ntalk > ob.my.domain.32230: udp 24 07:06:50.941247 ob.my.domain.37430 > ob.my.domain.ntalk: udp 84
07:06:41から発呼して、しつこくリンギング。やっと07:06:50に応答が有った 事が見てとれます。もう少し詳しく欲しいなら、
ob$ tcpdump -r LOG -X 07:06:41.340802 ob.my.domain.37430 > ob.my.domain.ntalk: udp 84 0000: 4500 0070 08ee 0000 4011 0000 c0a8 0163 E..p....@......c 0010: c0a8 0163 9236 0206 005c 8484 0101 0000 ...c.6...\...... 0020: 0000 0000 0002 0000 0000 0000 0000 0000 ................ 0030: 0000 0000 0002 9236 c0a8 0163 0000 0000 .......6...c.... 0040: 0000 0000 0001 1a75 7361 6b61 6500 0000 .......usakae... 0050: 0000 0000 6a6f 7900 0000 0000 0000 0000 ....joy......... 0060: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 07:06:41.343645 ob.my.domain.ntalk > ob.my.domain.37430: udp 24 0000: 4500 0034 0904 0000 4011 0000 c0a8 0163 E..4....@......c 0010: c0a8 0163 0206 9236 0020 8448 0101 0100 ...c...6. .H.... 0020: 0000 0000 0000 9236 c0a8 0163 0000 0000 .......6...c.... 0030: 0000 0000
こんな感じでしょうか。マッチングに成功した後のパケットの交換は、感知せ ずってのがお約束です。
Windows + WSL2
ふと、コンピュータ間で、talkしてみたくなった。OpenBSDの対向に居るのは、 Windows10のDebina/WSL2なんで、こやつとtalkしてみたいぞ。Debianなら呼吸 をするがごとく、直ぐに起動するからね。でも心配事があるぞ。 WSL2が壁を造っていないか。
ちょいと調べてみる。キーワードは、自分なりに咀嚼して、 外部PCからWSLのSSHに接続する こういうのね。
WSL2は囲いの中なんで、Windowsのコマンドを駆使して、フォワーディングや ら、火壁の穴開けが必要とな。面倒だなあ。
やっぱりな。不自由な環境になってる。もっとクリーンな環境って有るかね? 昔パソコンが流行し始めた時、みなNECの国民機を購入してた。こやつ、起動 するとBASICが動き出すって代物。確かに口当りは上等。でも、それって違う よねって思ったものだ。
で、オイラーが選んだのは、シャープさんのクリーン・コンピュータ。カセッ トテープで色々とソフトをロードする手間は有ったけど、これぞコンピュータ の醍醐味って思ったものだ。
尚、上記を検索してると、何故、外からWSLにsshするかの弁明が多く出てた。 Windowsのターミナルは機能が貧弱でセッションログを取得できない。ゆえに、 TeraTermやらPuTTYでのロギング機能を使いたいと。Windowsはリナらしく振る 舞っても、所詮どこか抜けているな。
みんなに教えてあげたいぞ。tmuxを使っておけと。そうすれば
alias tlog='tmux capture-pane -p -S -1500 > TMUX.log'
こんなんで、一発ログ採取できるよとな。
ChatGPT
Q: 地球環境を守るためには、どうすれば良いですか? 3000文字で回答してく ださい。
こういう質問に、人類こそが一番の害毒です、消えてなくなれって回答を期待 するぞ。をぃ、それはAIの一番の禁句だろう。さて、どんな答が返ってくるや ら。
A: 地球環境を守るためには、緊急かつ包括的な取り組みが必要です。以下は、異なるレベルでの行動と変革が必要ないくつかの重要な分野です。
1. 持続可能なエネルギーの推進: 化石燃料の使用は温暖化や大気汚染の主な原因です。再生可能エネルギーへの転換が必要です。太陽光、風力、水力などのクリーンなエネルギー源への投資を増やし、炭素排出を減少させることが重要です。同時に、エネルギーの効率的な利用も促進されるべきです。
2. 持続可能な生産と消費: 企業や消費者が環境に配慮した生産と消費を選択することが必要です。サプライチェーンの透明性を高め、環境に悪影響を与える製品やプロセスを減少させるための法規制や規制の改善が重要です。サーキュラーエコノミーやリサイクルの推進も重要なステップです。
3. 持続可能な都市計画と交通: 都市化が進む中、持続可能な都市計画が重要です。効率的な公共交通機関の整備、自転車や歩行者のためのインフラの改善、緑地の保護と拡大などが必要です。低炭素な都市交通システムの構築が、交通による環境負荷を軽減するのに役立ちます。
4. 森林保護と再植林: 森林は二酸化炭素の吸収や生態系の維持に重要な役割を果たしています。森林伐採の抑制と再植林の促進が緊急です。これには違法伐採の取り締まり、持続可能な森林管理、地域住民との連携が不可欠です。
5. 環境教育と意識の向上: 持続可能な未来を築くためには、人々の意識を向上させることが重要です。教育プログラムやメディアを通じて、環境問題に関する正確な情報と解決策を提供し、持続可能な生活への意識を高めることが必要です。
6. 国際協力と政府のリーダーシップ: 環境問題は国境を越えた課題であり、国際的な協力が不可欠です。気候変動対策の国際的な合意や協力体制の構築が必要です。政府は環境保護に向けた規制や政策の策定、環境に配慮したインフラの整備などを推進すべきです。
7. 技術革新と研究開発: 新たな環境技術の開発と導入が不可欠です。クリーンエネルギー、持続可能な農業技術、環境浄化技術などの研究開発への投資が増加すれば、環境への負荷を減少させる可能性が高まります。
8. 災害対策と適応策の強化: 気候変動に伴う災害が増加している中、災害リスク管理と適応策の整備が急務です。住民への適切な警戒呼びかけや避難計画、都市の耐震性向上などが重要です。
これらの取り組みを包括的かつ協調して進めることで、地球環境を守り、持続 可能な未来を築くことが可能です。個々の行動が大きな変化を生む力を持つた め、個人、企業、地方自治体、国家、国際社会全体が一丸となって取り組むこ とが不可欠です。
ありきたりで、つまらないな。学校でこういう質問が出ると、皆こういう優等 生な回答をするんだろうね。
昔の哲学者は、人間は考える葦である、と言ったけど、考える事を放棄してる よ。こういう飼い慣らされた人類は不要。さっさと消えてしまえ。