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. 災害対策と適応策の強化: 気候変動に伴う災害が増加している中、災害リスク管理と適応策の整備が急務です。住民への適切な警戒呼びかけや避難計画、都市の耐震性向上などが重要です。

これらの取り組みを包括的かつ協調して進めることで、地球環境を守り、持続 可能な未来を築くことが可能です。個々の行動が大きな変化を生む力を持つた め、個人、企業、地方自治体、国家、国際社会全体が一丸となって取り組むこ とが不可欠です。

ありきたりで、つまらないな。学校でこういう質問が出ると、皆こういう優等 生な回答をするんだろうね。

昔の哲学者は、人間は考える葦である、と言ったけど、考える事を放棄してる よ。こういう飼い慣らされた人類は不要。さっさと消えてしまえ。


This year's Index

Home