#!/bin/bash # # 2025.01.24 Version 2.1 # # Copyright: 2023-2025 Concurrent Real Time Inc. # # This software may be used and distributed according to the terms of # the GNU General Public License (GPL), version 2, or at your option # any later version. # usage="Usage: HeadLessVNC DISPLAY_NUMBER [mwm|mate|icewm|kde|gnome-flashback]" if test $# -eq 0; then echo "${usage}" 1>&2 exit 1 fi # TARGET=$1 USER_SESSION=$2 # #WindowSize=1920x1080 WindowSize=1024x768 # if [ ! -f /etc/X11/headless.conf ] then BUSID=`nvidia-xconfig --query-gpu-info|grep BusID|awk '{print $4}'` nvidia-xconfig -a --allow-empty-initial-configuration --use-display-device=None --virtual=$WindowSize --busid $BUSID -o /etc/X11/headless.conf cat >> /etc/X11/headless.conf << EOL # # The following definitions are mandatory for Headless VNC connections # do not delete # Section "InputClass" Identifier "Ignore libinput" Driver "libinput" Option "Ignore" "True" EndSection Section "ServerFlags" Option "AutoEnableDevices" "false" Option "AutoAddDevices" "false" EndSection # EOL fi # func_signal() { kill -0 $2 > /dev/null 2>&1 if [ $? -eq 0 ] then kill -$1 $2 return $? fi return 1 } # trap ' if [ -n $XSERVER ] then func_signal TERM $XSERVER echo -e "\nTRAP Xorg $XSERVER exited!" fi ' 2 3 15 # export GDM_LANG=$LANG #XLOG=/tmp/Xorg.$TARGET.log XLOG=/dev/null #VLOG=/tmp/x11vnc.$TARGET.log VLOG=/dev/null # export __GL_SYNC_TO_VBLANK=0 export __GLX_VENDOR_LIBRARY_NAME=nvidia # LIGHTDM=`echo $XAUTHORITY|grep lightdm` NEEDX11VNC=`grep -v "#" /etc/X11/headless.conf|grep vnc|grep Load` # if [ -n "$LIGHTDM" ] then #export __GL_ALLOW_FXAA_USAGE=0 #__GL_ConformantBlitFramebufferScissor=0 # unset DESKTOP_SESSION # unset GNOME_TERMINAL_SCREEN # # unset QT_IM_MODULE # unset XMODIFIERS # unset GNOME_TERMINAL_SERVICE # unset XDG_SESSION_TYPE # unset XDG_DATA_DIRS # unset XDG_SESSION_DESKTOP # unset XDG_CURRENT_DESKTOP # unset XDG_SEAT # unset XDG_RUNTIME_DIR # unset XDG_SEAT_PATH # unset XDG_SESSION_PATH # unset XDG_MENU_PREFIX # unset XDG_VTNR # unset XDG_SESSION_ID # unset SHLVL # unset GDK_BACKEND # unset GDMSESSION # unset GNOME_DESKTOP_SESSION_ID # unset DBUS_SESSION_BUS_ADDRESS # unset SESSION_MANAGER # unset DBUS_SESSION_BUS_ADDRESS # Xorg -ardelay 300 -arinterval 25 $TARGET -sharevts -config /etc/X11/headless.conf > $XLOG 2>&1 & XSERVER=$! else Xorg -ardelay 300 -arinterval 25 $TARGET -sharevts -auth $XAUTHORITY -config /etc/X11/headless.conf > $XLOG 2>&1 & XSERVER=$! fi # echo "Xorg PID $XSERVER" if [ -z "$NEEDX11VNC" ] then #gsettings set org.gnome.desktop.interface clock-show-seconds true # # -noncache スクロールバーが無くなる # -repeat key auto repeat on echo "Need x11vnc" NEEDX11VNC="YES" x11vnc -repeat -noxdamage -noscr -clip $WindowSize+0+0 -geometry $WindowSize -forever -shared -noncache -auth $XAUTHORITY -N -display $TARGET > $VLOG 2>&1 & #x11vnc -repeat -noxdamage -noscr -clip $WindowSize+0+0 -geometry $WindowSize -forever -shared -noncache -auth /run/user/0/gdm/Xauthority -N -display $TARGET > $VLOG 2>&1 & XVNC=$! echo "x11vnc PID $XVNC" sleep 3 else echo "Not Need x11vnc" NEEDX11VNC="NO" #if [ -f /root/.vnc/xstartup ] #then # mv /root/.vnc/xstartup /root/.vnc/xstartup.SAVE #fi echo "Window Manager PID $SESSION" sleep 1 echo "vncviewer -RemoteResize=0 -passwd /root/.vnc/passwd -geometry $WindowSize+0+0 --shared localhost$TARGET " vncviewer -RemoteResize=0 -passwd /root/.vnc/passwd -geometry $WindowSize+0+0 --shared localhost$TARGET & VIEWER=$! fi # Window Manager # gnome-session :gnome-flachback以外は(xrandrのlogical displayが存在しないため)動作しない # Open Motif :動作するが、タイトルの漢字コードは化ける # kde plasma :動作する # MATE :動作する # IceWM :動作する # setxkbmap -model pc106 -layout jp,us # #if [ -x ~/.vnc/xstartup ] #then # DISPLAY=$TARGET dbus-run-session -- ~/.vnc/xstartup & # SESSION=$! #else #################################################### if [ "$USER_SESSION" = "mate" -a -x /usr/bin/mate-session ] then /usr/bin/gnome-keyring-daemon --start --components=ssh # /usr/bin/ssh-agent -D -a /run/user/0/keyring/ssh DISPLAY=$TARGET dbus-run-session -- /usr/bin/mate-session --display=$TARGET & SESSION=$! fi #################################################### if [ "$USER_SESSION" = "mwm" -a -x /usr/bin/mwm ] then if [ $LANG = "ja_JP.utf8" -o $LANG = "ja_JP.UTF-8" ] then #################################################### # 仮想モードでは、['+space']による、かな漢字変換エンジンへの切り替えが、 # ホスト側のウィンドウマネージャによって、アクセプトされ、仮想モード側に認識されないため、 # 別のキーバイディングに変更します。 #################################################### gsettings set org.freedesktop.ibus.general.hotkey trigger "['+space', 'Zenkaku_Hankaku', 'Alt+Kanji', 'Alt+grave', 'Hangul', 'Alt+Release+Alt_R']" gsettings set org.freedesktop.ibus.general.hotkey triggers "['space']" #################################################### # かな漢字変換エンジンを起動します #################################################### DISPLAY=$TARGET /usr/bin/ibus-daemon -r --xim -d DISPLAY=$TARGET /usr/libexec/ibus-engine-kkc --ibus & DISPLAY=$TARGET /usr/libexec/ibus-engine-simple & sleep 3 fi DISPLAY=$TARGET xsetroot -solid gray20 DISPLAY=$TARGET dbus-run-session -- /usr/bin/mwm -multiscreen & SESSION=$! fi #################################################### if [ "$USER_SESSION" = "icewm" -a -x /usr/bin/icewm-session ] then unset GNOME_DESKTOP_SESSION_ID unset XDG_SESSION_ID unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS if [ $LANG = "ja_JP.utf8" -o $LANG = "ja_JP.UTF-8" ] then #################################################### # 仮想モードでは、['+space']による、かな漢字変換エンジンへの切り替えが、 # ホスト側のウィンドウマネージャによって、アクセプトされ、仮想モード側に認識されないため、 # 別のキーバイディングに変更します。 #################################################### gsettings set org.freedesktop.ibus.general.hotkey trigger "['+space', 'Zenkaku_Hankaku', 'Alt+Kanji', 'Alt+grave', 'Hangul', 'Alt+Release+Alt_R']" gsettings set org.freedesktop.ibus.general.hotkey triggers "['space']" #################################################### # かな漢字変換エンジンを起動します #################################################### DISPLAY=$TARGET /usr/bin/ibus-daemon -r --xim -d DISPLAY=$TARGET /usr/libexec/ibus-engine-kkc --ibus & DISPLAY=$TARGET /usr/libexec/ibus-engine-simple & sleep 3 fi DISPLAY=$TARGET dbus-run-session -- /usr/bin/icewm-session & SESSION=$! fi #################################################### if [ "$USER_SESSION" = "kde" -a -x /usr/bin/startplasma-x11 ] then DISPLAY=$TARGET dbus-run-session -- /usr/bin/startplasma-x11 & SESSION=$! fi #################################################### if [ "$USER_SESSION" = "gnome-flashback" -a -x /usr/bin/gnome-flashback ] then export XDG_CURRENT_DESKTOP="GNOME-Flashback:GNOME" #DISPLAY=$TARGET dbus-launch gnome-session --session=gnome-flashback-metacity & DISPLAY=$TARGET dbus-run-session gnome-session --session=gnome-flashback-metacity & SESSION=$! fi #################################################### #if [ "$USER_SESSION" = "gnome" ] #then # export GNOME_SHELL_SESSION_MODE=classic # export XDG_CURRENT_DESKTOP="GNOME" # DISPLAY=$TARGET dbus-launch gnome-session --session=gnome-classic & # SESSION=$! #fi #################################################### if [ "$USER_SESSION" = "gnome-classic" ] then export GNOME_SHELL_SESSION_MODE=classic export XDG_CURRENT_DESKTOP="GNOME-classic:GNOME" DISPLAY=$TARGET dbus-launch gnome-session --session=gnome-classic & SESSION=$! fi #################################################### if [ -z "$SESSION" -o "$USER_SESSION" = "metacity" ] then if [ -x /usr/bin/metacity ] then # Fail safe DISPLAY=$TARGET xsetroot -solid gray20 unset GNOME_DESKTOP_SESSION_ID unset XDG_SESSION_ID unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS if [ $LANG = "ja_JP.utf8" -o $LANG = "ja_JP.UTF-8" ] then #################################################### # 仮想モードでは、['+space']による、かな漢字変換エンジンへの切り替えが、 # ホスト側のウィンドウマネージャによって、アクセプトされ、仮想モード側に認識されないため、 # 別のキーバイディングに変更します。 #################################################### gsettings set org.freedesktop.ibus.general.hotkey trigger "['+space', 'Zenkaku_Hankaku', 'Alt+Kanji', 'Alt+grave', 'Hangul', 'Alt+Release+Alt_R']" gsettings set org.freedesktop.ibus.general.hotkey triggers "['space']" #################################################### # かな漢字変換エンジンを起動します #################################################### DISPLAY=$TARGET dbus-run-session -- /usr/bin/metacity --composite & SESSION=$! DISPLAY=$TARGET /usr/bin/ibus-daemon -r --xim -d DISPLAY=$TARGET /usr/libexec/ibus-engine-kkc --ibus & DISPLAY=$TARGET /usr/libexec/ibus-engine-simple & fi if [ -n "$LIGHTDM" ] then if [ "$NEEDX11VNC" = "YES" ] then DISPLAY=$TARGET dbus-run-session -- /usr/bin/metacity --composite & fi fi #alias logout='metacity-message restart' DISPLAY=$TARGET dbus-launch /usr/bin/gnome-terminal --display=$TARGET fi fi #fi # # if [ "$NEEDX11VNC" = "YES" ] then echo "Window Manager PID $SESSION" sleep 1 vncviewer -RemoteResize=0 -geometry $WindowSize+0+0 --shared localhost$TARGET & VIEWER=$! else if [ -f /root/.vnc/xstartup.SAVE ] then mv ~/.vnc/xstartup.SAVE ~/.vnc/xstartup fi fi # if [ -n $SESSION ] then wait $SESSION echo "Window Manager $SESSION exited!" func_signal TERM $SESSION else wait $XSERVER fi if [ -n $VIEWER ] then echo "vncviewer $VIEWER exited!" func_signal TERM $VIEWER fi # if [ -n $XSERVER ] then func_signal TERM $XSERVER echo "Xorg $XSERVER exited!" fi if [ -n $XVNC ] then func_signal KILL $XVNC echo "x11vnc $XVNC exited!" fi # sleep 2 # DBUS=`ps|grep dbus-daemon|awk '{print $1}'` if [ -n "$DBUS" ] then func_signal KILL $DBUS echo "dbus-daemon $DBUS exited!" fi if [ "$USER_SESSION" = "gnome-flashback" ] then PROCESS=`ps|grep ibus-engine-kkc|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "ibus-engine-kkc $PROCESS exited!" fi PROCESS=`ps|grep ibus-engine-sim|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "ibus-engine-sim $PROCESS exited!" fi PROCESS=`ps|grep nm-applet|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "nm-applet $PROCESS exited!" fi PROCESS=`ps|grep gnome-screensav|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "gnome-screensav $PROCESS exited!" fi PROCESS=`ps|grep tracker-miner-a|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "tracker-miner-a $PROCESS exited!" fi PROCESS=`ps|grep tracker-miner-f|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "tracker-miner-f $PROCESS exited!" fi PROCESS=`ps|grep baloo_file|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "baloo_file $PROCESS exited!" fi PROCESS=`ps|grep evolution-alarm|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "evolution-alarm $PROCESS exited!" fi PROCESS=`ps|grep abrt-applet|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "abrt-applet $PROCESS exited!" fi PROCESS=`ps|grep gsd-disk-utilit|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "gsd-disk-utilit $PROCESS exited!" fi PROCESS=`ps|grep gnome-session-b|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "gnome-session-b $PROCESS exited!" fi PROCESS=`ps|grep metacity|awk '{print $1}'` if [ -n "$PROCESS" ] then func_signal KILL $PROCESS echo "metacity $PROCESS exited!" fi fi