これはデバッグの質問です。説明を求めるときは、それがまだ以下でカバーされていないことを確認してください。
Z、A、N、Mの4台のマシンがあります。
Aに到達するには、最初にZにログインする必要があります。
Mに到達するには、最初にNにログインする必要があります。
次の作品:
ssh -X Z xclock
ssh -X Z ssh -X Z xclock
ssh -X Z ssh -X A xclock
ssh -X N xclock
ssh -X N ssh -X N xclock
しかし、これはしません:
ssh -X N ssh -X M xclock
Error: Can't open display:
Mにログインするときに$ DISPLAYが明らかに設定されていません。問題はなぜですか?
ZとAは同じNFS-homedirを共有します。 NとMは同じNFS-homedirを共有します。 Nのsshdは、非標準ポートで実行されます。
$ grep X11 <(ssh Z cat /etc/ssh/ssh_config)
ForwardX11 yes
# ForwardX11Trusted yes
$ grep X11 <(ssh N cat /etc/ssh/ssh_config)
ForwardX11 yes
# ForwardX11Trusted yes
N:/etc/ssh/ssh_config
== Z:/etc/ssh/ssh_config
およびM:/etc/ssh/ssh_config
== A:/etc/ssh/ssh_config
/etc/ssh/sshd_config
は、4台すべてのマシンで同じです(特定のグループのポートおよびログイン権限を除く)。
Mのsshポートをローカルマシンに転送しても、それでも機能しません。
terminal1$ ssh -L 8888:M:22 N
terminal2$ ssh -X -p 8888 localhost xclock
Error: Can't open display:
A:.XauthorityにはAが含まれていますが、M:.XauthorityにはMが含まれていません。
xauth
は、AとMの両方の/usr/bin/xauth
にインストールされます。
xauth
はAにログインすると実行されますが、not Mにログインすると実行されます。
ssh -vvv
は、AとMにログインするときにX11またはxauthについて文句を言いません。どちらも次のように述べています。
debug2: x11_get_proto: /usr/bin/xauth list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
debug2: channel 0: request x11-req confirm 0
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.
この問題は、M:.XauthorityにMがないことに関連している可能性がある(xauth
が実行されていないことが原因)、または$ DISPLAYがログインスクリプトによって何らかの理由で無効になっていると感じていますが、何が原因かわかりません違う。
--20110628を更新
sshrc
について知らなかったので、それは良い推測でした。しかし、残念ながら、ここでの問題ではありません。 4台のマシンのいずれにも存在しません。
$ ls ~/.ssh/rc /etc/ssh/sshrc
ls: cannot access /home/tange/.ssh/rc: No such file or directory
ls: cannot access /etc/ssh/sshrc: No such file or directory
前述のように、$ DISPLAY変数はMには設定されていませんが、Aでは問題ありません。
$ ssh -X N ssh -X M 'echo \$DISPLAY'
<<empty>>
$ ssh -X Z ssh -X A 'echo \$DISPLAY'
localhost:14.0
動作中のセッションと非動作中のセッションからの出力の違い(注:非動作中のセッションでのX転送またはxauthに関する警告はありません):
$ stdout ssh -X Z ssh -vX A 'echo \$DISPLAY' >/tmp/a
$ stdout ssh -X N ssh -vX M 'echo \$DISPLAY' >/tmp/b
$ diff /tmp/a /tmp/b
4c4
< debug1: Connecting to A [1.1.1.5] port 22.
---
> debug1: Connecting to M [1.1.3.3] port 22.
23,24c23,24
< debug1: Host 'A' is known and matches the RSA Host key.
< debug1: Found key in /home/tange/.ssh/known_hosts:35
---
> debug1: Host 'M' is known and matches the RSA Host key.
> debug1: Found key in /home/tange/.ssh/known_hosts:1
43d42
< debug1: Sending env LC_ALL = en_US.UTF-8
46c45
< localhost:14.0
---
>
53,54c52,53
< Transferred: sent 2384, received 2312 bytes, in 0.2 seconds
< Bytes per second: sent 10714.8, received 10391.2
---
> Transferred: sent 2336, received 2296 bytes, in 0.0 seconds
> Bytes per second: sent 54629.1, received 53693.7
Mにlsh-server
の代わりにopenssh-server
をインストールすると、X転送が修正されますが、受け入れられない解決策です。
MのX11Forwarding
で/etc/ssh/sshd_config
がyes
に設定されているかどうかを指定しません。これは、それが機能しない理由を明確に説明します。
私の場合、「DROP」に設定されたのはファイアウォールのデフォルトポリシーでした。
どのポートがリッスンされているかを確認し(通常は6000 + $ DISPLAY環境変数の値)、適切なルールを設定する必要があります。 rootとして実行:
# echo $DISPLAY
localhost:10.0
# netstat -altnp | grep LIST
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 13670/sshd
# iptables -A INPUT -i lo -p tcp -m tcp --dport 6010 -j ACCEPT
# iptables -A INPUT -i lo -p tcp -m tcp --sport 6010 -j ACCEPT
# iptables -A OUTPUT -o lo -p tcp -m tcp --dport 6010 -j ACCEPT
# iptables -A OUTPUT -o lo -p tcp -m tcp --sport 6010 -j ACCEPT