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

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

Ответы [ 5 ]

8 голосов
/ 29 июня 2009

ты используешь 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
7 голосов
/ 22 июля 2009

Вот кое-что, что я только что сбил. Он проверяет среду последнего запущенного процесса "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.

1 голос
/ 17 июля 2009

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

1 голос
/ 29 июня 2009

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

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

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

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

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

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

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

0 голосов
/ 29 июня 2009

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

...