screen で画面共有
〜 GNU screen の小技 〜
2024-11-01 作成 福島
TOP > tips > screen-share
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob ]

前置き

以前、元教え子から PHP を教えてほしいと依頼された時に、何度かもどかしい状態になったので、
「screen コマンドを使ってリモートで指導できたらなぁ」と考えたんだけど、忙しすぎて実現しなかった。
あの時は、VNC でターミナルの操作を奪って…とか、遠回りなことをしていた。
(夜中に VNC を電話でインストールさせてサーバに接続させるとか、ほんと無理。でも教え子の若い情熱に負けちゃったんだよね。もうやんない)

その時調査したのは「screen -x user/session」なんだけど、
よそ様の Web ページを拝見して「セキュリティに問題あるけど chmod u+s screen を実行しろ」のアドバイスを発見した。
(「大きな問題ではない」という意見の記述もあるけど、man に「Multiuser はループになっても検出できないから注意しろ」とも書いてある)

確かに、他人のソケットを覗くにはコマンドを root で実行する必要があるし、
実際に u+s せずに実行するとこう(↓)なる。でも、生徒(何するか分からない人)に u+s したコマンドを使わせて余計なトラブルを招きたくない。
$ screen -x user/session
Must run suid root for multiuser support.
訳: マルチユーザを使うには suid (u+s) を実行すべし。
ならば、生徒に u+s されたコマンドを使わせないなら良んじゃね?。覗かれる側に u+s は必要ないじゃろ。
答えは意外に簡単だった。あの時悩んだのは何だったんだろう。


1. 設定要件

種別内容備考
ソフト名Screen version 4.08.00 (GNU) 05-Feb-20本稿記述時の最新版
OSAlmaLinux release 9.4 (Seafoam Ocelot)
アカウントpadawan
ホームディレクトリ: /home/padawan/
screen セッション名: task
生徒側
knight先生側
master


2. 設定

2-1. 生徒側設定
• screen コマンドの設定ファイルを用意する。(screen が起動時に自動的に読み込む)
$ su
# cat > /home/padawan/.screenrc <<EOF
deflog on
logfile ".screenlogs/%H_%Y%m%d_%0c_%p:%n.log"
multiuser on
acladd root
EOF

# cat /home/padawan/.screenrc
deflog on                                      # 操作ログを記録する。
logfile ".screenlogs/%H_%Y%m%d_%0c_%p:%n.log"  # 操作ログのファイル名を指定。
multiuser on            # マルチユーザモードにする。
acladd root             # 管理者の立ち入りを許可する。
#aclchg root -w "#?"    # <-- なぜか最初から閲覧モードにすることができない*
*立ち入り属性を変更するときは、screen の中から aclchg root -w "#?" を実行する。
 padawan / knight どちらからでも設定 / 解除が可能。

• 操作ログの格納先を用意する。
# mkdir /home/padawan/.screenlogs/
# chown padawan:padawan /home/padawan/.screenlogs/
• ログイン時に screen コマンドが自動起動するようにする。
# cat >> /home/padawan/.bash_profile << EOF
/usr/bin/screen -d -R -S task
exit
EOF

# cat /home/padawan/.bash_profile | tail

# User specific environment and startup programs /usr/bin/screen -d -R -S task
exit
-d -R: 切断されて残っていたセッションがあったら再接続する。なかったら新規作成する。
  再接続時は一度デタッチされるため、knight も再接続が必要。

-S: セッション名を指定する。この名前に対して knight から接続する。
最後の exit は screen の終了後、それを呼び出した Bash も終了させる。(→ ログアウトさせる)

# exit
$
2-2. 先生側設定
• knight に root としての実行を /bin/screen に限定して許可する。(ついでに master にも)
$ su
# visudo

## Allow root to run any commands anywhere root ALL=(ALL) ALL knight ALL=(ALL) /bin/screen master ALL=(ALL) /bin/screen ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL

# exit
$


3. 実施

同じ画面なので分かりにくい。
それぞれ中盤の 4 行が共有されている状態。
実際の画面でもリアルタイムで反映されるため、どちらが打鍵しているか分からない。

3-1. 生徒側の操作
padawan$ screen -ls
There is a screen on:
        5706.task       (Multi, attached)
1 Socket in /run/screen/S-padawan.

padawan$ # Hello, padawan # 共有: knight の打鍵 padawan$ # Please tell me Lord of the Ring. # 共有: padawan の打鍵 padawan$ # I can teach Load of the Linux. # 共有: knight の打鍵 padawan$ # May the force be with you. # 共有: padawan の打鍵
$ exit [screen is terminating]
exit の実行で screen が終了すると、前述 2-1 で .bash_profile に記述した exit によってログアウトする。 でも可。
3-2. 先生側の操作
knight$ sudo screen -x padawan/task
[sudo] knight のパスワード: **(自分のログインパスワード)**

padawan$ # Hello, padawan
# 共有: knight の打鍵 padawan$ # Please tell me Lord of the Ring. # 共有: padawan の打鍵 padawan$ # I can teach Load of the Linux. # 共有: knight の打鍵 padawan$ # May the force be with you. # 共有: padawan の打鍵
[detached from 5706.task]
knight$


4. 付録

knight と同じ設定のユーザを複数作成すると、一つの padawan を中心に複数ユーザの立ち入りが可能になる。
このとき、誰がどこに接続しているかを確認するには をタイプする。displays でも可。
この画面が表示されるのは自分だけ。
term-type   size         user interface           window       Perms
---------- ------- ---------- ----------------- ----------     -----
 xterm       80x24        root@/dev/pts/4          0(padawan@55) rwx
 xterm       80x24        root@/dev/pts/2          0(padawan@55) rwx
 xterm       80x24     padawan@/dev/pts/1          0(padawan@55) rwx


              [Press Space to refresh; Return to end.]
 黄色の行が自分の情報 
で画面更新する。(誰かの接続/切断を反映させる)
で作業中の画面に戻る。
本稿では sudo をしているため、さらに interface の項でユーザを確認する必要がある。
knight$ ps u | grep -v grep | grep pts/4
master   8449  0.0  0.4 224096  5504 pts/4    Ss   20:36   0:00 -bash