前置き
以前、元教え子から PHP を教えてほしいと依頼された時に、何度かもどかしい状態になったので、
「screen コマンドを使ってリモートで指導できたらなぁ」と考えたんだけど、忙しすぎて実現しなかった。
あの時は、VNC でターミナルの操作を奪って…とか、遠回りなことをしていた。
(夜中に VNC を電話でインストールさせてサーバに接続させるとか、ほんと無理。でも教え子の若い情熱に負けちゃったんだよね。もうやんない)
その時調査したのは「screen -x user/session」なんだけど、
よそ様の Web ページを拝見して「セキュリティに問題あるけど chmod u+s screen を実行しろ」のアドバイスを発見した。
(「大きな問題ではない」という意見の記述もあるけど、man に「Multiuser はループになっても検出できないから注意しろ」とも書いてある)
確かに、他人のソケットを覗くにはコマンドを root で実行する必要があるし、
実際に u+s せずに実行するとこう(↓)なる。でも、生徒に u+s したコマンドを使わせて余計なトラブルを招きたくない。
$ screen -x user/sessionならば、生徒に u+s されたコマンドを使わせないなら良んじゃね?。覗かれる側に u+s は必要ないじゃろ。訳: マルチユーザを使うには suid (u+s) を実行すべし。
Must run suid root for multiuser support.
答えは意外に簡単だった。あの時悩んだのは何だったんだろう。
1. 設定要件
種別 内容 備考 ソフト名 Screen version 4.08.00 (GNU) 05-Feb-20 本稿記述時の最新版 OS AlmaLinux release 9.4 (Seafoam Ocelot) アカウント padawan
ホームディレクトリ: /home/padawan/
screen セッション名: task生徒側 knight 先生側 master
2. 設定
2-1. 生徒側設定
• screen コマンドの設定ファイルを用意する。(screen が起動時に自動的に読み込む)2-2. 先生側設定
$ 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
*立ち入り属性を変更するときは、screen の中から aclchg root -w "#?" を実行する。
deflog on # 操作ログを記録する。 logfile ".screenlogs/%H_%Y%m%d_%0c_%p:%n.log" # 操作ログのファイル名を指定。 multiuser on # マルチユーザモードにする。 acladd root # 管理者の立ち入りを許可する。 #aclchg root -w "#?"# <-- なぜか最初から閲覧モードにすることができない*。
padawan / knight どちらからでも設定 / 解除が可能。
# mkdir /home/padawan/.screenlogs/• ログイン時に screen コマンドが自動起動するようにする。
# chown padawan:padawan /home/padawan/.screenlogs/
# cat >> /home/padawan/.bash_profile << EOF
/usr/bin/screen -d -R -S task
exit
EOF
# cat /home/padawan/.bash_profile | tail
-d -R: 切断されて残っていたセッションがあったら再接続する。なかったら新規作成する。
# User specific environment and startup programs /usr/bin/screen -d -R -S task exit
再接続時は一度デタッチされるため、knight も再接続が必要。
-S: セッション名を指定する。この名前に対して knight から接続する。
最後の exit は screen の終了後、それを呼び出した Bash も終了させる。(→ ログアウトさせる)
# exit
$
• 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. 生徒側の操作
3-2. 先生側の操作exit の実行で screen が終了すると、前述 2-1 で .bash_profile に記述した exit によってログアウトする。 でも可。
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]
knight$ sudo screen -x padawan/task
knight$
[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]
4. 付録
knight と同じ設定のユーザを複数作成すると、一つの padawan を中心に複数ユーザの立ち入りが可能になる。
このとき、誰がどこに接続しているかを確認するには をタイプする。displays でも可。
この画面が表示されるのは自分だけ。本稿では sudo をしているため、さらに interface の項でユーザを確認する必要がある。
黄色の行が自分の情報
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.]
で画面更新する。(誰かの接続/切断を反映させる)
で作業中の画面に戻る。
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