screenの”Cannot open your terminal ‘/dev/pts/0′”対策

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

Advertisements
Tagged with: ,
Posted in linux
One comment on “screenの”Cannot open your terminal ‘/dev/pts/0′”対策
  1. ayukuns says:

    Reblogged this on Sandbox and commented:
    ServerMania VPSでのRootログイン時でのScreen実行時に必要だった。対策が必要

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: