無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

リモートホスト操作が便利になるscreenコマンド

screenコマンドとは

1つの物理ターミナルから仮想ターミナルを切り分けて使えるコマンドラインツールです。 物理ターミナルをひとつ開くとその中に別の(仮想)ターミナルを開けるようなツールです。 次のようなことができます。

  • 1つのターミナル上で、仮想ターミナルをを同時に開いてそれぞれで別の作業ができる。
  • 仮想ターミナルが起動したまま、物理ターミナルを終了し、再度ターミナルでログインして、screen を呼び出すことで起動したままの仮想ターミナルの作業を続けられる。

例えば、リモートホストsshで接続していくつかの作業を並行してしたいときに、別の物理ターミナル立ち上げて、ssh接続する必要がなくなります。

インストール

Ubuntu 14.04LTSでは次のようにして、インストールできます。

$ sudo apt-get install screen

使い方

リモートホスト(10.0.0.1)にsshで接続し、そこでscreenコマンドを使う場合を例にします。 この場合、10.0.0.1のホストにscreenがインストール済みである必要があります。

$ ssh rname@10.0.0.1
rname@remotehost:~$

screenのセッションを生成する

rname@remotehost:~$ screen

次のようなCopyrightの画面が表示されるので、Enterを押します。

Screen version 4.01.00devel (GNU) 2-May-06

Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury
...

セッション内で新しいウィンドウを作る

次の入力をすることで、セッション内に新しいウィンドウを作成することができます。

Ctrl-a c

試してみます。 まず現在のウィンドウで、echoでt1を表示しておきます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a c]

ウィンドウ2が作成されて画面が切り替わります。

rname@remotehost:~$ 

echoでt2を表示しておきます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$ [Ctrl-a c]

ウィンドウ3が作成されて画面が切り替わります。

rname@remotehost:~$ 

echoでt3を表示しておきます。

rname@remotehost:~$ echo t3
t3

セッション内でウィンドウを移動する

次の入力で、次(next)のウィンドウを画面に表示することができます。

Ctrl-a n

ウィンドウを戻る(previous)場合は次のように入力します。

Ctrl-a p

先ほどの続きから、試してみましょう。

rname@remotehost:~$ echo t3
t3
rname@remotehost:~$ [Ctrl-a n]

t1のウィンドウが表示されます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a n]

さらに、t2に切り替わります。

rname@remotehost:~$ echo t2
t2

逆に戻ってみます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$ [Ctrl-a p]

t1のウィンドウが表示されます。

rname@remotehost:~$ echo t1
t1

現在のウィンドウの一覧を見る

次のコマンドで、ウィンドウの一覧を見ることができます。

Ctrl-a "

次の内容が表示されます。カーソルをj, k キーで移動させて、一覧から表示するウィンドウを選択することができます。選択したらエンターキーを押すことで表示されられます。

 Num Name        Flags
   0 bash        $
   1 bash        $
   2 bash        $

ウィンドウに名前を付ける

ウィンドウ一覧を見ていると、それぞれのウィンドウは何をしているウィンドウだったかを記入したくなります。そこで次の入力して、現在のウィンドウに名前をつけることができます。

Ctrl-a A

t1のウィンドウで、echo-t1という名前をつけます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a A]
Set window's title to: echo-t1

一覧を表示すると、次のようになります。これでウィンドウと作業の内容を一致でき、一覧からウィンドウを選択しやすくなります。

 Num Name        Flags
   0 echo-t1     $
   1 bash        $
   2 bash        $

現在のウィンドウを閉じる

現在のウィンドウを閉じる場合、次のように入力します。

Ctrl-a k

t1のウィンドウを閉じてみます。

rname@remotehost:~$ echo t1
t1
rname@remotehost:~$ [Ctrl-a k]
Really kill this window [y/n] y

一覧を表示すると、echo-t1が閉じられていることがわかります。

 Num Name        Flags
   1 bash        $
   2 bash        $

現在のセッションをデタッチする

次の入力で現在のセッションをデタッチします。デタッチするとターミナルをログアウトできます。

Ctrl-a d

試してみます。

rname@remotehost:~$ [Ctrl-a d]

次の画面に切り替わります。下記の4946は、セッションのプロセス番号です。再度セッションにアタッチするときに使います。

[remote detached from 4946.pts-1.remotehost]
rname@remotehost:~$

この状態で、リモートホストからログアウトします。

rname@remotehost:~$ ログアウト
Connection to 10.0.0.1 closed.
lname@localhost:~$ 

これで、ターミナルを終了しても大丈夫です。

セッションにアタッチする

次の入力で、デタッチしたセッションに再びアタッチすることができます。

$ screen -r <pid>

先ほどの続きで、ターミナルを立ち上げ、リモートホストに接続します。

$ ssh rname@10.0.0.1
rname@remotehost:~$

先ほどデタッチしたセッション(4946)にアタッチします。

rname@remotehost:~$ screen -r 4946

t2のウィンドウが表示されます。リモートホストからログアウトして、ターミナルを終了しても残っていることが確認できます。

rname@remotehost:~$ echo t2
t2
rname@remotehost:~$

リモートホストに存在するscreenコマンドのセッション番号を確認する

前回デタッチしたセッション番号が何だったかわからない場合は、次のコマンドでscreenセッションの一覧を表示することができます。

$ screen -ls

次のような一覧が得られます。このリストの 4946 部分がプロセス番号なので、このプロセスにアタッチすれば、セッションに復帰でき、前回のデタッチ状態から作業を開始できます。

rname@remotehost:~$ screen -ls
There is a screen on:
        4946.pts-1.removehost        (2016年01月01日 12時00分00秒)   (Attached)
1 Socket in /var/run/screen/S-remotehost.

最低限知っておく必要のあるscreenコマンドは以上です。 screenコマンドは、他にも複数の人間が同じターミナルを共有できるらしいですが、これについてはまた次の機会にしようと思います。