Как автоматически установить переменную $DISPLAY для текущего сеанса

Я вижу, что $display установлен на localhost: 0,0, если я запускаю сервер vnc, это может быть неверно, есть ли способ автоматически установить его в моем login script?

Ответ 1

используете ли вы Bash? Перейдите в файл .bashrc в своем домашнем каталоге и установите переменную, а затем экспортируйте ее.

DISPLAY = localhost: 0.0; экспорт DISPLAY

вы можете использовать /etc/bashrc, если хотите сделать это для всех пользователей.

Вы также можете посмотреть в ~/.bash_profile и /etc/profile

EDIT:

function get_xserver ()
{
    case $TERM in
       xterm )
            XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(' )    
            XSERVER=${XSERVER%%:*}
            ;;
        aterm | rxvt)           
            ;;
    esac  
}

if [ -z ${DISPLAY:=""} ]; then
    get_xserver
    if [[ -z ${XSERVER}  || ${XSERVER} == $(hostname) || \
      ${XSERVER} == "unix" ]]; then 
        DISPLAY=":0.0"          # Display on local host.
    else
        DISPLAY=${XSERVER}:0.0  # Display on remote host.
    fi
fi

export DISPLAY

Ответ 2

Здесь что-то я только что сбил. Он проверяет среду последнего запуска процесса "gnome-session" (DISPLAY устанавливается правильно, когда VNC запускает диспетчер сеанса/окна). Замените "gnome-session" именем любого процесса, запускаемого вашим VNC-сервером при запуске.

PID=`pgrep -n -u $USER gnome-session`
if [ -n "$PID" ]; then
    export DISPLAY=`awk 'BEGIN{FS="="; RS="\0"}  $1=="DISPLAY" {print $2; exit}' /proc/$PID/environ`
    echo "DISPLAY set to $DISPLAY"
else
    echo "Could not set DISPLAY"
fi
unset PID

Вы можете просто удалить это в своем .bashrc файле.

Ответ 3

Я предполагаю здесь, основываясь на проблемах, которые у меня были в прошлом, которые я решил:

  • вы подключаетесь к серверу vnc на машине B, отображая его с помощью клиента VNC на машине A
  • вы запускаете консоль (xterm или ее эквивалент) на машине B и используете ее для подключения к машине C
  • вы хотите запустить приложение на основе X на компьютере C, отображая его на сервере VNC на машине B, чтобы вы могли видеть его на машине A.

Я закончил с двумя решениями. Мое первоначальное решение было основано на использовании rsh. С тех пор на большинстве наших серверов был установлен ssh, что упростило это.

Используя rsh, я собрал таблицу машин против OS vs custom options, которая будет определять этот процесс в perl. Оболочка Bourne была недостаточной, и у нас нет bash на машинах Sun или HP (и в то время не было bash в AIX) - AIX 5L еще не вышел). Оболочка Korn не была большой опцией, так как большинство наших ящиков Linux не установлены pdksh. Но, если вы не сталкиваетесь с этими ограничениями, вы можете реализовать идею в ksh или bash, я думаю.

Во всяком случае, я бы в основном запускал "rsh $machine -l $user" $cmd ", где $machine, конечно же, был машиной, в которую я входил, $user, тоже очевидно (хотя, когда я собирался как" корень ", это имело некоторую дисперсию, поскольку у нас есть несколько корней на некоторых машинах по причинам, которые я не совсем понимаю), а $cmd в основном" DISPLAY = $DISPLAY xterm ", хотя если бы я запускал консоль, например, $cmd будет" konsole - disisplay = $DISPLAY". Поскольку $DISPLAY оценивался локально (где он был установлен правильно) и не передавался буквально через rsh, дисплей всегда был бы правильно настроен.

Я также должен был убедиться, что никто не сделал ничего глупого, как reset DISPLAY, если он уже был установлен.

Теперь я просто использую ssh, убедитесь, что для X11Forwarding установлено значение yes на сервере (sshd_config), а затем я могу просто ssh на компьютере, пусть команды X перейдут через зашифрованный провод, и он всегда будет вернитесь в нужное место.

Ответ 4

В вашем vncserver есть файл конфигурации, который устанавливает номер дисплея. Чтобы сделать это автоматически, одним из решений является анализ этого файла, извлечение номера и его правильное определение. Проще (лучше) состоит в том, чтобы этот номер дисплея был установлен в config script и использовать его как в конфигурации вашего VNC-сервера, так и в ваших сценариях инициализации.

Ответ 5

Вам нужно будет сообщить клиенту vnc экспортировать правильный $DISPLAY после входа в систему. Как вы это сделаете, вероятно, будет зависеть от вашего клиента vnc.