web-dev-qa-db-ja.com

SSHX11転送は機能しません。どうして?

これはデバッグの質問です。説明を求めるときは、それがまだ以下でカバーされていないことを確認してください。

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転送が修正されますが、受け入れられない解決策です。

1
Ole Tange

MのX11Forwarding/etc/ssh/sshd_configyesに設定されているかどうかを指定しません。これは、それが機能しない理由を明確に説明します。

2
Andy Smith

私の場合、「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
0
gummy