su で切り替わったユーザーで $ screen を実行すると
“Cannot open your terminal ‘/dev/pts/0’ – please check.”
というようなエラーが発生する。
エラーが発生する原因
screen (やそのリライトである tmux) は擬似ターミナルへの read/write を行うことで実現されており、この擬似ターミナルはログイン時にログインユーザー向けに作成される。
su でユーザーが切り替わっても新規に擬似ターミナル(pty)が作られるわけではないので、新規に起動する screen と既存 pty の実行ユーザーが異なり、権限のない pty に R/W しようとして上記の様なエラーが発生する。
解決策
一人で使っているサーバーなら
- root 権限で screen を起動してその後、各ユーザになる
- pty の権限を chmod で変える
といった豪快な解決案もなくもない。
多くの環境下で現実的なのは、切り替わったユーザで script コマンドを実行してユーザー向けに新規に擬似ターミナルを作成した上で、screen を起動する。
再現手順
$ tty /dev/pts/0 $ echo test > $(tty) test # john ユーザーに切り替わる $ sudo su - john $ screen Cannot open your terminal '/dev/pts/0' - please check. $ tty /dev/pts/0 # ユーザー切り替え前の tty を使いまわしている $ echo test > $(tty) -su: 3: cannot create /dev/pts/0: Permission denied $ ls -l /dev/pts # 0 番は切り替え前の hoge ユーザーがオーナー total 0 crw--w---- 1 hoge tty 136, 0 Aug 11 15:39 0 c--------- 1 root root 5, 2 Aug 11 14:27 ptmx
script コマンド(本来はターミナルの作業内容を記録するコマンド)で無理やり擬似ターミナルを作成
$ script /dev/null # create a new pseudo terminal Script started, file is /dev/null $ ls -l /dev/pts # 新規に john ユーザーがオーナーの 1 番の pty が作成された total 0 crw--w---- 1 hoge tty 136, 0 Aug 11 15:40 0 crw--w---- 1 john tty 136, 1 Aug 11 15:40 1 # <- new pty c--------- 1 root root 5, 2 Aug 11 14:27 ptmx $ echo my pseudo terminal is $(tty) > $(tty) my pseudo terminal is /dev/pts/1 $ screen ... $ ls -l /dev/pts total 0 crw--w---- 1 hoge tty 136, 0 Aug 11 15:41 0 crw------- 1 john tty 136, 1 Aug 11 15:41 1 crw--w---- 1 john tty 136, 2 Aug 11 15:41 2 c--------- 1 root root 5, 2 Aug 11 14:27 ptmx
Reference
Reblogged this on Sandbox and commented:
ServerMania VPSでのRootログイン時でのScreen実行時に必要だった。対策が必要