図にすると以下の様な感じ。
+---------+ +--------+ +--------+ | c00 | | s00 | | s01 | +---------+ +--------+ +--------+ | Windows | | Debian | | Debian | +---------+ +--------+ +--------+ | PuTTY |===| sshd | +=| sshd | +---------+ +--------+ | +--------+ | | | bash | | | bash | +---------+ +--------+ | +--------+ | | | screen | | | screen | +---------+ +--------+ | +--------+ | | | bash | | | bash | +---------+ +--------+ | +--------+ | | | ssh |=+ | xeyes | +---------+ +--------+ +--------+
以下のようにすれば、c00 に s01 で起動した xeyes が表示される。
********@c00:~$ ssh -X user@s00 ********@s00:~$ echo $DISPLAY localhost:10.0 ********@s00:~$ screen -D -RR ********@s00:~$ DISPLAY=localhost:10.0 ssh -X user@s01 ********@s01:~$ echo $DISPLAY localhost:11.0 ********@s01:~$ screen -D -RR ********@s01:~$ DISPLAY=localhost:11.0 xeyes
TL;DR;
c00 の PuTTY から s00 にログインする前に既存の xauth list を確認。現在リストされているクッキーを削除するには xauth remove 。とりあえずすべてのクッキーを削除。
********@s00:~$ xauth list s00/unix:10 MIT-MAGIC-COOKIE-1 ******************************** ********@s00:~$ xauth remove s00/unix:10 ********@s00:~$ xauth list
c00 の PuTTY から s00 にログインした後に xauth list を確認。この状態で xeyes を実行すれば Windows 側に xeyes の画面が表示される。xauth の使うファイルは ~/.Xauthority。別のsshセッションからでもxauth list は参照できる。
********@s00:~$ xauth list s00/unix:11 MIT-MAGIC-COOKIE-1 dd9ab9a1************************ ********@s00:~$ echo $DISPLAY && xauth list $DISPLAY localhost:11.0 s00/unix:11 MIT-MAGIC-COOKIE-1 dd9ab9a1************************ ********@s00:~$ xeyes
別の ssh セッションから xauth list を参照すると以下。先に作られたクッキーを参照できるが、このセッションは先のセッションと違う (DISPLAY 環境変数が違う) ので、xauth list $DISPLAY した時には何も表示されない。このことはxeyesを実行してみるとよくわかる(ディスプレイを開けないと言われる)。これを解決するにはxeyesの実行時にDISPLAY環境変数をすでに持っているクッキーに対応するディスプレイで上書きする。こうすることで実行できる。この状態下(DISPLAY変数が適切でない状態)でssh を使ってs00 から s01 に接続
********@s00:~$ xauth list cuwefx/unix:11 MIT-MAGIC-COOKIE-1 dd9ab9a1************************ ********@s00:~$ echo $DISPLAY && xauth list $DISPLAY localhost:10.0 ********@s00:~$ xeyes PuTTY X11 proxy: Unsupported authorisation protocol Error: Can't open display: localhost:10.0 ********@s00:~$ DISPLAY=localhost:11.0 xeyes [1]+ Done DISPLAY=localhost:11.0 xeyes ********@s00:~$ ssh -X -l ******** s01
ssh 接続直後のxauth list の結果は以下。xeyes も起動する。
********@s01:~$ xauth list s01/unix:10 MIT-MAGIC-COOKIE-1 b016de3************************* ********@s01:~$ echo $DISPLAY && xauth list $DISPLAY localhost:10.0 s01/unix:10 MIT-MAGIC-COOKIE-1 b016de3************************* ********@s01:~$ xeyes
ここで一旦クッキーを削除する。これでディスプレイが開けなくなる。
********@s01:~$ xauth remove s01/unix:10 ********@s01:~$ xauth list ********@s01:~$ echo $DISPLAY && xauth list $DISPLAY localhost:10.0 ********@s01:~$ xeyes X11 connection rejected because of wrong authentication. Error: Can't open display: localhost:10.0
問題はここから新たなsshセッションを起動することなく、クッキーを生成できるか。
| +---------------------------------------+ +---------------------------------------+ +-----------------------------------------+ | | lxchost (Debian) | | con00_sid_amd64 (Debian) | | con01_sid_amd64 | | +--------------+------------+-----------+ +--------------+------------+-----------+ +--------------+--------------+-----------+ | | 192.168.12.5 | | 127.0.0.1 | | 192.168.12.8 | | 127.0.0.1 | | 192.168.12.4 | Debian | 127.0.0.1 | | +--------------+------------+-----------+ +--------------+------------+-----------+ +--------------+--------------+-----------+ | | | | | +===| tcp/22 | 137 (sshd) | tcp/6011 |===+ +=| tcp/22 | 129 (sshd) | tcp/6011 |===+ | +--------------+------------+-----------+ | +--------------+ +-----------+ | | +--------------+ +-----------+ | | | | X | | | | | | tcp/6011 |=+ | | | | | tcp/6011 |=+ | | +--------------+------------+-----------+ | +--------------+------------+-----------+ | | | +--------------+--------------+-----------+ | | | +=| tcp/35753 | 7578 (ssh) | | | +=| tcp/39381 | 145 (ssh) | tcp/53000 |=+ | | | | 138 (xeyes) | tcp/52999 |=+ | | | +--------------+ | | | | +--------------+ +-----------+ | | +--------------+--------------+-----------+ | | | | | | | | | | | | tcp/53002 |===+ | | | 139 (xclock) | tcp/53001 |===+ | | +--------------+------------+-----------+ | | +--------------+------------+-----------+ | +--------------+--------------+-----------+ | | | | | | +===========================================+ +===============================================+
| lxchost | 7578 | ssh | TCP@192.168.12.5:3575 | con00_sid_amd64 | 137 | sshd | TCP@192.168.12.8:22 | con00_sid_amd64 | 137 | sshd | TCP@127.0.0.1:6011 | con00_sid_amd64 | 137 | sshd | TCP@127.0.0.1:6011 | con00_sid_amd64 | 145 | ssh | TCP@127.0.0.1:53000 | con00_sid_amd64 | 145 | ssh | TCP@127.0.0.1:53002 | con00_sid_amd64 | 145 | ssh | TCP@192.168.12.8:53002 | con01_sid_amd64 | 129 | sshd | TCP@192.168.12.4:22 | con01_sid_amd64 | 129 | sshd | TCP@127.0.0.1:6011 | con01_sid_amd64 | 129 | sshd | TCP@127.0.0.1:6011 | con01_sid_amd64 | 138 | xeyes | TCP@127.0.0.1:52999 | con01_sid_amd64 | 139 | xclock | TCP@127.0.0.1:53001
lxchost上で起動したsshのpidが540の場合、以下でそのプロセスのネットワーク状態がわかる。
root@lxchost:~# lsof -n -p 7578 -a -i TCP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 7578 hoge 3u IPv4 226922 0t0 TCP 192.168.12.5:35753->192.168.12.8:ssh (ESTABLISHED) root@lxchost:~# lsof -n -p 7578 -a -U COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 7578 hoge 7u unix 0xffff880036cb3040 0t0 227106 socket ssh 7578 hoge 8u unix 0xffff88003d0ce840 0t0 227123 socket
上の結果からlxchostはtcp/35753を使ってcon00_sid_amd64にssh接続している。これをcon00_sid_amd64から確認するには以下。上記のLocalとForeignが逆転していることが見て取れる。
root@con00_sid_amd64:~# lsof -n -i TCP:35753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 135 root 3u IPv4 226923 0t0 TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED) sshd 137 hoge 3u IPv4 226923 0t0 TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED) root@con00_sid_amd64:~# lsof -n -p 135,137 -a -i TCP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 135 root 3u IPv4 226923 0t0 TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED) sshd 137 hoge 3u IPv4 226923 0t0 TCP 192.168.12.8:ssh->192.168.12.5:35753 (ESTABLISHED) sshd 137 hoge 8u IPv6 226979 0t0 TCP [::1]:6011 (LISTEN) sshd 137 hoge 9u IPv4 226980 0t0 TCP 127.0.0.1:6011 (LISTEN) sshd 137 hoge 11u IPv6 227105 0t0 TCP [::1]:6011->[::1]:53000 (ESTABLISHED) sshd 137 hoge 14u IPv6 227122 0t0 TCP [::1]:6011->[::1]:53002 (ESTABLISHED)
con00_sid_amd64上で起動したsshのpidが145の場合、以下でそのプロセスのネットワーク状態がわかる。
root@con00_sid_amd64:~# lsof -n -p 145 -a -i TCP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 145 hoge 3u IPv4 227012 0t0 TCP 192.168.12.8:39381->192.168.12.4:ssh (ESTABLISHED) ssh 145 hoge 7u IPv6 227104 0t0 TCP [::1]:53000->[::1]:6011 (ESTABLISHED) ssh 145 hoge 8u IPv6 227121 0t0 TCP [::1]:53002->[::1]:6011 (ESTABLISHED) root@con00_sid_amd64:~# lsof -n -p 145 -a -U root@con00_sid_amd64:~# lsof -n -i TCP:6011 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 137 hoge 8u IPv6 226979 0t0 TCP [::1]:6011 (LISTEN) sshd 137 hoge 9u IPv4 226980 0t0 TCP 127.0.0.1:6011 (LISTEN) sshd 137 hoge 11u IPv6 227105 0t0 TCP [::1]:6011->[::1]:53000 (ESTABLISHED) sshd 137 hoge 14u IPv6 227122 0t0 TCP [::1]:6011->[::1]:53002 (ESTABLISHED) ssh 145 hoge 7u IPv6 227104 0t0 TCP [::1]:53000->[::1]:6011 (ESTABLISHED) ssh 145 hoge 8u IPv6 227121 0t0 TCP [::1]:53002->[::1]:6011 (ESTABLISHED)
上の結果からcon00_sid_amd64はtcp/39381を使ってcon01_sid_amd64にssh接続している。これをcon01_sid_amd64から確認するには以下。上記のLocalとForeignが逆転していることが見て取れる。
root@con01_sid_amd64:~# lsof -n -i TCP:39381 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 127 root 3u IPv4 227013 0t0 TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED) sshd 129 hoge 3u IPv4 227013 0t0 TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED) root@con01_sid_amd64:~# lsof -n -p 127,129 -a -i TCP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 127 root 3u IPv4 227013 0t0 TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED) sshd 129 hoge 3u IPv4 227013 0t0 TCP 192.168.12.4:ssh->192.168.12.8:39381 (ESTABLISHED) sshd 129 hoge 8u IPv6 227067 0t0 TCP [::1]:6011 (LISTEN) sshd 129 hoge 9u IPv4 227068 0t0 TCP 127.0.0.1:6011 (LISTEN) sshd 129 hoge 11u IPv6 227098 0t0 TCP [::1]:6011->[::1]:52999 (ESTABLISHED) sshd 129 hoge 14u IPv6 227117 0t0 TCP [::1]:6011->[::1]:53001 (ESTABLISHED)
con01_sid_amd64上で起動したXクライアントであるxeyesとxclockの使うネットワークを確認するには以下(ループバックのポート番号はディスプレイ番号11+6000)。
root@con01_sid_amd64:~# lsof -n -i TCP:6011 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 129 hoge 8u IPv6 227067 0t0 TCP [::1]:6011 (LISTEN) sshd 129 hoge 9u IPv4 227068 0t0 TCP 127.0.0.1:6011 (LISTEN) sshd 129 hoge 11u IPv6 227098 0t0 TCP [::1]:6011->[::1]:52999 (ESTABLISHED) sshd 129 hoge 14u IPv6 227117 0t0 TCP [::1]:6011->[::1]:53001 (ESTABLISHED) xeyes 138 hoge 3u IPv6 227097 0t0 TCP [::1]:52999->[::1]:6011 (ESTABLISHED) xclock 139 hoge 3u IPv6 227116 0t0 TCP [::1]:53001->[::1]:6011 (ESTABLISHED)