サーバ側にopenssh-server、xorg-x11-xauth、x11-dbusがインストールされている状態で、クライアント側からsshに-Xか-Yオプションを指定すると、X11を使わないコマンドがハングする問題の回避策について記載する。
1 問題
- sshで-Xや-Yオプションを指定しつつ、X11を使わないコマンドを実行すると、コマンド実行後にSSHのセッションが切れずにハングする。
$ ssh -Y lxd-centos-8-ssh-x11.hiroom2.com -- uname -a Warning: No xauth data; using fake authentication data for X11 forwarding. Linux lxd-centos-8-ssh-x11 5.10.52-1-lts #1 SMP Tue, 20 Jul 2021 16:46:09 +0000 x86_64 x86_64 x86_64 GNU/Linux (hang)
2 原因
- dbus-x11が/etc/profile.d/ssh-x-forwarding.shを含めるようになっており、sshで接続する度にこのシェルスクリプトが実行される。
$ rpm -ql dbus-x11 /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh /etc/profile.d/ssh-x-forwarding.csh /etc/profile.d/ssh-x-forwarding.sh /usr/bin/dbus-launch /usr/lib/.build-id /usr/lib/.build-id/4b /usr/lib/.build-id/4b/439e4019de8f19a66c1b6676d47dd121f684f3 /usr/share/man/man1/dbus-launch.1.gz
- sshで-Yか-Xオプションが指定された場合、/etc/profile.d/ssh-x-forwarding.shは dbus-launch –exit-with-x11を実行する。
- dbus-launch –exit-with-x11は、X11を使ったコマンドの終了時にdbus-launchを終了させるが、X11を使わないコマンドの終了時にはdbus-launchを終了させない。この残ったdbus-launchがSSHのコネクションが閉じずにハングする原因となる。
$ cat /etc/profile.d/ssh-x-forwarding.sh # DBus session bus over SSH with X11 forwarding [ -z "$SSH_CONNECTION" ] && return [ -z "$DISPLAY" ] && return [ "$SHLVL" -gt 1 ] && return GDK_BACKEND=x11; export GDK_BACKEND eval $(dbus-launch --sh-syntax --exit-with-x11)
3 回避策
- /etc/profile.d/ssh-x-forwarding.shを無効にする。
- D-Busが必要な場合はsshコマンド側でdbus-launchを実行するようにする (/etc/profile.d/ssh-x-forwarding.shが追加される前と同様の方法)。
#!/bin/sh sudo dnf install -y openssh-server xorg-x11-xauth dbus-x11 sudo systemctl enable sshd sudo systemctl start sshd firewall-cmd --add-service=ssh --permanent firewall-cmd --reload sudo mv /etc/profile.d/ssh-x-forwarding.sh \ /etc/profile.d/ssh-x-forwarding.sh.disabled