xrdpにUSキーボードを接続した日本語Windows環境から接続すると、日本語キーボードとして認識されて記号がまともに打てないなどの問題が起きることは広く知られている。
https://gist.github.com/udnp/7d5697093cc94b473d53fdb4f8cdf41b
などなど。
よくわからないが、日本語WindowsからRDPをするとUSキーボードをつないでいても日本語キーボードの情報をサーバーに送ることが問題らしい…がそれだと対Windowsで問題が起きない理由がわからない。
そんなこと言っても仕方ないので、巷ではいろんな回避策があるのだが、全ユーザーに影響が及ぶことがあるため、日本語キーボードユーザーと同居した環境でこの問題を回避するのは比較的難しい。特にセッションを再開したときに日本語にリセットされる問題は ReconnectScript
、デフォルトでは /etc/xrdp/reconnectwm.sh
にレイアウト変更を記述することになるが、各ユーザーの事情をシステムグローバルの設定に押し込むのは影響が無駄に大きいうえに、万一構文エラー等を起こすと巻き添えで他のユーザーもログインできなくなる。
というわけで、 .bash_profile
にバックグラウンドでキーボードマップを監視して、定期的に us
に書き直すというスクリプトを記述するワークアラウンドをここに示す。なお、ログインシェルは /bin/bash
とする。
if [ -v XRDP_SESSION ] && [[ "$0" == *startwm-bash.sh ]]; then
setxkbmap -layout us
(
while true
do
sleep 5;
if [ ! -d /proc/$PPID ]; then
break
fi
if (setxkbmap -query | grep "^layout:" | grep -q "jp"); then
setxkbmap -layout us
fi
done
) &
fi
なお、冒頭のifでそのbashがメインのウィンドウマネージャーの立ち上げようシェルだと判定しているが、ファイル名で検知していて若干ガバである。使う場合は注意されたい。