SSH X11 轉發不起作用。為什麼?
這是一個調試問題。當您要求澄清時,請確保以下內容尚未涵蓋。
我有 4 台機器:Z、A、N 和 M。
要到達 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
安裝在/usr/bin/xauth
A 和 M 上。
xauth
登錄 A 時正在執行,但登錄 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
安裝
lsh-server
而不是openssh-server
M 修復了 X 轉發,但這是一個不可接受的解決方案。
您沒有指定是否在 M 上
X11Forwarding
設置為yes
in/etc/ssh/sshd_config
,這肯定可以解釋為什麼它不起作用。
在我的情況下,防火牆預設策略設置為“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