LINUX.ORG.RU

Экспортировать DISPLAY и XAUTHORITY при выполнении su -

 ,


1

1

На одной машине:

vadim@host3:~$ echo $DISPLAY $XAUTHORITY 
:0.0 /media/work/home/vadim/.Xauthority
vadim@host3:~$ su -
Пароль: 
[root@host3 ~]# echo $DISPLAY $XAUTHORITY 
:0.0 /media/work/home/vadim/.Xauthority
[root@host3 ~]#
DISPLAY и XAUTHORITY сохраняют свои значения при выполнении su -

На другой машине не сохраняют:

vadim@alderamin:~$ echo $DISPLAY $XAUTHORITY 
:0.0 /media/work/home/vadim/.Xauthority
vadim@alderamin:~$ su -
Пароль: 
[root@alderamin ~]# echo $DISPLAY $XAUTHORITY 
[root@alderamin ~]#

Как это исправить?

Настройки в /etc и /root на обеих машинах практически идентичны. (Вторая система скопирована с первой.) На второй системе хомяк пользователя создан с нуля, но .profile и .bashrc там идентичны первой. (Вытягиваются из git-а.)

Получается, что отличия только в версиях пакетов — на второй машине свежий Арч, на первой 2 месяца без обновлений.

Гуглёж даёт ссылки на бредовые обсуждения на разных форумах с советами вытаскивать переменные анализом /proc и т.п.

★★

Последнее исправление: cetjs2 (всего исправлений: 3)

               If --login is used, the $TERM, $COLORTERM, $DISPLAY, and
               $XAUTHORITY environment variables are copied if they were set.

Вероятно, баг.

Homura_Akemi
()
Ответ на: комментарий от sdio

Одинаковы.

#%PAM-1.0
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		required	pam_unix.so
account		required	pam_unix.so
session		required	pam_unix.so

geekless ★★
() автор топика

Здравствуйте, дорогие любители ФГМа в багтрекерах. С вами очередной выпуск рубрики «Linux катится в сраное говно».

Баг: FS#31720 - [util-linux] Cannot running GUI Application from «su -l» and «gksu -l»

Closed by Dave Reisner (falconindy)
Friday, 28 September 2012, 22:29 GMT
Reason for closing: Not a bug
Additional comments about closing: Working as described by the manual.

Comment by Lorenzo Mureu (azzka) - Friday, 28 September 2012, 17:15 GMT
Maybe it could be useful to read this http://ubuntuforums.org/showpost.php?p=11905175&postcount=6 . AFAIK you're not supposed to run GUI programs as root but here ( http://forums.opensuse.org/english/get-technical-help-here/applications/47677... ) and here ( http://www.unix.com/man-page/OpenSolaris/1/gksu/ ) it seems you can with gksu.
AFAIK you should do «gksu thunar», maybe I'm wrong.
Also I cannot test it, just suggesting.

Comment by Gerardo Exequiel Pozzi (djgera) - Friday, 28 September 2012, 19:04 GMT
This is the right behaviour. See su(1) manpage. Previous «su» works because was included a patch for coreutils to make pam-compliant, that apart from other things, preserves $DISPLAY and $XAUTHORITY.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

С вами очередной выпуск рубрики «Linux катится в сраное говно».

Похоже проблема только в Арче. Не?

sdio ★★★★★
()
Ответ на: комментарий от sdio

Раньше использовался su из coreutils, который патчился для поддержки pam.

Теперь в util-linux запилили su с поддержкой pam, но без поддержки экспорта окружения для иксов, и это называется теперь «правильным поведением».

geekless ★★
() автор топика
Последнее исправление: geekless (всего исправлений: 1)
Ответ на: комментарий от sdio

pam_env никак не позволит сохранить старые значения, но только позволяет поставить новые. А в сорцах вот так всё гвоздями прибито:

/* Update `environ' for the new shell based on PW, with SHELL being
   the value for the SHELL environment variable.  */

static void
modify_environment (const struct passwd *pw, const char *shell)
{
  if (simulate_login)
    {
      /* Leave TERM unchanged.  Set HOME, SHELL, USER, LOGNAME, PATH.
         Unset all other environment variables.  */
      char const *term = getenv ("TERM");
      if (term)
	term = xstrdup (term);
      environ = xmalloc ((6 + !!term) * sizeof (char *));
      environ[0] = NULL;
      if (term)
	xsetenv ("TERM", term, 1);
      xsetenv ("HOME", pw->pw_dir, 1);
      xsetenv ("SHELL", shell, 1);
      xsetenv ("USER", pw->pw_name, 1);
      xsetenv ("LOGNAME", pw->pw_name, 1);
      set_path(pw);
    }
  else
    {
      /* Set HOME, SHELL, and if not becoming a super-user,
	 USER and LOGNAME.  */
      if (change_environment)
        {
          xsetenv ("HOME", pw->pw_dir, 1);
          xsetenv ("SHELL", shell, 1);
	  if (getlogindefs_bool ("ALWAYS_SET_PATH", 0))
	    set_path(pw);

          if (pw->pw_uid)
            {
              xsetenv ("USER", pw->pw_name, 1);
              xsetenv ("LOGNAME", pw->pw_name, 1);
            }
        }
    }

  export_pamenv ();
}

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Отчего не поменять на

  if (simulate_login)
    {
      /* Leave TERM unchanged.  Set HOME, SHELL, USER, LOGNAME, PATH.
         Unset all other environment variables.  */
      char const *term = getenv ("TERM");
      char const *displ = getenv ("DISPLAY");
      char const *xauth = getenv ("XAUTHORITY");
      if (term) term = xstrdup (term);
      if (displ) displ = xstrdup (displ);
      if (xauth) xauth = xstrdup (xauth);
      environ = xmalloc ((6 + !!term + !!displ + !!xauth) * sizeof (char *));
      environ[0] = NULL;
      if (term) xsetenv ("TERM", term, 1);
      if (displ) xsetenv ("DISPLAY", displ, 1);
      if (xauth) xsetenv ("XAUTHORITY", xauth, 1);
      xsetenv ("HOME", pw->pw_dir, 1);
      xsetenv ("SHELL", shell, 1);
      xsetenv ("USER", pw->pw_name, 1);
      xsetenv ("LOGNAME", pw->pw_name, 1);
      set_path(pw);
    }
не сделать патч и не пользоваться как раньше?

bormant ★★★★★
()
Ответ на: комментарий от bormant

Так и сделаю. Только никакой радости не доставляет пересобирать пакет при каждом обновлении на 3-х машинах.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Зачем на 3-х пересобирать? Собирать на одной, класть в общую локальную репу, из которой обновлять остальные.

bormant ★★★★★
()
Ответ на: комментарий от bormant

Здесь основная проблема не в пересобирать (пересобирать-то как раз удобнее раздельно, потому что «локального репа» может и не быть, а доступ к AUR-у всегда есть), а в своевременном обновлении PKGBUILDов. Становиться мейтенером еще одного пакета... мне вот это, если по хорошему-то?

geekless ★★
() автор топика
Ответ на: комментарий от bormant

Пожалуй, стоит добавить ещё и COLORTERM по аналогии.

Меня вообще удивляет, почему список сохраняемых переменных давно в конфиг не засунули.

Привычка прибивать всё гвоздями медленно расползается из гнома по всему остальному софту.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

удивляет, почему список сохраняемых переменных давно в конфиг не засунули

Вот и повод появился. Переписать с добавлением анализа, например, ENV_SAVE (string list) из /etc/login.defs, и можно предлагать в апстрим...

bormant ★★★★★
()
Ответ на: комментарий от geekless

Вот козлы!

И как сделать?

Можно, конечно, в bashrc прописать export DISPLAY=:0.0, а юзеру в автозагрузку — xhost +, но ведь в этом случае если я зайду рутом из консоли, DISPLAY все равно экспортируется...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я пока никак не делал, времени нет копаться. Благо, мне из гуёвых приложений от рута надо запускать только gparted и meld, а пока надобности нет. Можно через полисикит запускать, например: pkexec gparted.

Если приспичит, можно и костылём однократно воспользоваться: echo $DISPLAY $XAUTHORITY ; su - , после чего вручную прописываем эти значения переменных в оболочке рута.

// И вообще, я щас пишу из горящего танка. С винта поперли ICRC Error-ы, система автоматически перемонтировала разделы в ro от греха подальше, и бегаю вот ищу теперь запасной sata-шлейф. Во всяком случае, надеюсь, это именно шлейф косячит, а не контроллеры на материнке или винте.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Я вот что сделал:

  • xhost + в автозагрузку IceWM
  • проверку TERM на == xterm у рута в .bashrc, если истинно — export DISPLAY=:0.0

Можно и без xhost +, а добавить export XAUTHORITY.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.