2019年6月17日月曜日

wallを超えたチャットツール

あるLinuxマシンにssh等でリモートログインしている全員に対し
メッセージを送ることができるwallというコマンドがあります。
$ wall <メッセージ>
とかするとメッセージが伝わります。引数なしの
$ wall
だと続けて複数行のメッセージを入れ、
その後[Ctrl]+[D]キーを押せばまるごと伝わりますし、
標準入力が使えるので、
$ wall < readme.txt
$ ls -l  | wall
のような使い方も可能です。
リモートログインしてる側からもwallは使えるので、
オープンでかつ他人への迷惑を顧みない
テキストチャットとして使えなくもないのですが、
ローカルで開いているターミナルには送られないため
片通話状態になる欠点があります。
まあ想定される用途は管理者が何かする時に
予め皆に通知しておく程度のことなのでやむを得ません。
ということで私もあることは知っていますが、
有用に使ったことはないコマンドだったりします。

ところがwallそのものではないのですが同様のスタイルで
個別にメッセージが送れ、返事ももらえる方法を知った、
というか編み出しました。方法は以下の通りです。
まず、"who"コマンドを実行して
$ who
<アカウント名>  :0           <ログイン日時> (:0)
<アカウント名>  pts/<番号>        <ログイン日時> (<ログイン元IPアドレス>)
結果のアカウント名とログイン元IPアドレスから相手を特定し、
$ echo '<メッセージ>' > /dev/pts/<番号>
を実行して相手にメッセージを送ります。同時に
$ tty > /dev/pts/<番号>
で相手に対して返信先を知らせます。
なんならメッセージを送る際に
$ echo `tty`:'<メッセージ>' > /dev/pts/<番号>
として、よくあるチャットソフト的な表示にしてもいいでしょう。
なお相手には
/dev/pts/<送り元番号>:<メッセージ>
のメッセージが送られているので、その相手は
$ echo '<メッセージ>' > /dev/pts/<送り元番号>
で返事ができます。
シェル内でのテキストチャットが実現できます。

ただしちょっと問題が。
リモートログインユーザからローカルターミナルへ
会話を開始する際、宛先がわかりません。
なぜって"who"コマンドでptsデバイス番号が表示されないから。
そんな時は"who"と"ls -l /dev/pts/*"の実行結果から
推理するぐらいでしょうか。
間違った相手にまずいメッセージを
送らないよう注意が必要ですが。

0 件のコメント:

コメントを投稿