Ошибка при запуске GUI приложения от дополнительного пользователя

Автор rrytr7778, 15 ноября 2018, 15:12:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

rrytr7778

Создан дополнительный пользователь, запускаю от него GUI приложение.
No protocol specified
Unable to init server: Не удалось подключиться к: В соединении отказано
Error: cannot open display: :0

Debian9, gdm3.

ecc83

Цитата: rrytr7778 от 15 ноября 2018, 15:12:56запускаю от него GUI приложение.

Вот это место очччень подробно нужно описать. Как вы запускаете "от него" приложение.

rrytr7778

Цитата: ecc83 от 15 ноября 2018, 15:25:53Вот это место очччень подробно нужно описать. Как вы запускаете "от него" приложение.
adduser user
su user
firefox


Cообщение объединено 15 ноября 2018, 16:28:38

Осознаю, что нужен дополнительный x-server от пользователя user. Не понятно как штатно запускать два x-servera от разных пользователей.

ecc83

Цитата: rrytr7778 от 15 ноября 2018, 15:33:42
Осознаю, что нужен дополнительный x-server от пользователя user.

Не нужен. Hужно правильно указать переменные:


$XAUTHORITY
$DISPLAY


Вот тебе скрипт, который всё будет устанавливать автоматически.
Сохрани его в директорию /usr/local/bin в текстовый файл с названием например: multiple

Для этого открой терминал и введи:

sudo nano /usr/local/bin/multiple

вставь код, который под спойлером и сохрани.

Потом выполни:

sudo chmod +x /usr/local/bin/multiple


Теперь запускай своё GUI приложение командой:

multiple user firefox

Подсказку по синтаксису можно получить командой:

multiple --help

Открыть содержимое (спойлер)


#!/bin/bash

# Коды завершения
UA_REQUEST=60 # Прервано пользователем
NO_REQUEST=61 # Нет одного или нескольких параметров
NU_REQUEST=62 # Указан несуществующий пользователь
NEH_REQUEST=63 # Не удалось создать папку пользователя
FCXA_REQUEST=64 # Не удалось создать файл авторизации
SUDOFAIL_REQUEST=65 # Ошибка авторизации супер-пользователя
UE_REQUEST=69 # Непредвиденная ошибка
HELP_REQUEST=70 # HELP

clear

# Справка
if [ "$1" = "-h"  -o "$1" = "--help" ]; then
    echo; echo "Порядок использования: $0 user [option] command"
    echo " $0 [-h|--help] - выводит эту справку"; echo
    sed --silent -e '/DOCUMENTATIONHELP$/,/^DOCUMENTATIONHELP/p' "$0" |
    sed -e '/DOCUMENTATIONHELP/d';
    exit $HELP_REQUEST;
fi

: << DOCUMENTATIONHELP
Запускает GUI-приложение от имени другого пользователя
Для правильной работы ваша система должна пробрасывать переменную XAUTHORITY через sudo
и вы должны иметь права на sudo - вам потребуется ввести свой пароль

    user - пользователь от имени которого необходимо выполнить command
    option - однобуквенный ключ указывающий в каком домашнем каталоге выполнять command

    если ключ опущен, то для пользователей с uid < 1000 будет созданн временный каталог в /tmp,
    а для пользователей с uid > 999 будет использоваться каталог указанный в /etc/passwd,

h - выполнить в домашнем каталоге пользователя указанном в /etc/passwd
t - создать временныый каталог для выполнения этой задачи

Коды завершения:

    60 - Прервано пользователем
    61 - Нет одного или нескольких параметров
    62 - Указан несуществующий пользователь
    63 - Не удалось создать папку позьзователя
    64 - Не удалось создать файл авторизации
    65 - Ошибка авторизации супер-пользователя
    69 - Непредвиденная ошибка
    70 - HELP

GNU/GPL 3 (2010)
DOCUMENTATIONHELP

# Обработка естественных ошибок
# Проверка параметров

if [ "$1" = "" -o "$2" = "" ]; then
    echo "$0: пропущен операнд"
    echo "Попробуйте '$0 --help' для получения более подробного описания."
    exit $NO_REQUEST
fi

# Проверка пользователя
PSWDNT=`cat /etc/passwd | grep "$1:x:"` # Запись о пользователе в /etc/passwd

if [ "$PSWDNT" = "" ]; then
    echo "$0: неизвестный пользователь: $1"
    exit $NU_REQUEST
fi

# Получаем переменные и устанавливаем home
# Окружение
DSPL=$DISPLAY
MYXA=$XAUTHORITY

TMPUSER=$1 # Пользователь
PLACE=$2 # Предположительно ключ home
# CMND=$3 # Команда

# Устанавливаем переменные
case $PLACE in
    ["h"])
# Выполняем операцию в домашнем каталоге из /etc/passwd
# Получаем информацию о пользователе
CMNDAWK=`echo 'BEGIN{ FS = ":" }{ print $6 }'`
    LCHOME=`echo $PSWDNT | awk "$CMNDAWK"`
CMNDAWK=`echo 'BEGIN{ FS = ":" }{ print $3 }'`
    LCUID=`echo $PSWDNT | awk "$CMNDAWK"`
if [ "$LCUID" -lt "1000" ]; then
    # Операция в домашнем каталоге пользователя с UID < 1000
    echo "Вы пытаетесь выполнить '$CMND' от имени пользователя '$TMPUSER' (UID: $LCUID) в его домашнем каталоге: $LCHOME"
    read -p "Всё равно продолжить? (Да - только 'y') [y/n]: " myyn
    if [ "$myyn" != "y" ]; then
echo "Прервано пользователем"
exit $UA_REQUEST
    fi
fi
shift
shift
CMND=$@
    ;;
    ["t"])
# Выполняем операцию во временном домашнем каталоге
LCHOME=/tmp/tudo-$TMPUSER
shift
shift
CMND=$@
    ;;
    *)
# Выполняем операцию в каком-то домашнем каталоге... ;)
# Получаем UID
CMNDAWK=`echo 'BEGIN{ FS = ":" }{ print $3 }'`
LCUID=`echo $PSWDNT | awk "$CMNDAWK"`
if [ "$LCUID" -lt "1000" ]; then
    PLACE="t"
    LCHOME=/tmp/tudo-$TMPUSER
else
    PLACE="h"
    CMNDAWK=`echo 'BEGIN{ FS = ":" }{ print $6 }'`
    LCHOME=`echo $PSWDNT | awk "$CMNDAWK"`
fi
shift
CMND=$@
esac

# Проверяем теперь уже окончательную команду
if [ "$CMND" = "" ]; then
    echo "$0: пропущен операнд"
    echo "Попробуйте '$0 --help' для получения более подробного описания."
    exit $NO_REQUEST
fi

# Собственно рабочий код
# Тут нам потребуется sudo
sudo true
if [ "$?" != "0" ]; then
    echo "$0: провал авторизации"
    exit $SUDOFAIL_REQUEST
fi

if [ "$PLACE" = "t" ]; then
    # Необходима временная домашняя папка
    # Создаём временный домашний каталог
    sudo mkdir $LCHOME
    if [ "$?" = "0" ]; then
# Если мы действительно создали временный домашний каталог, запишем путь к нему в файл - это потребуется в дальнейшем для безопасного его удаления
LCLCHOME="$LCHOME""_lc"
# Указатель на удачное создание каталога
sudo echo "$LCHOME" >> $LCLCHOME
sudo chmod 0777 $LCLCHOME
    fi
    sudo chown $TMPUSER $LCHOME
else
    if [ ! -d $LCHOME ]; then
# а каталога-то и нет...
sudo mkdir $LCHOME
if [ "$?" = "0" ]; then
    $PLACE="ht"
else
    echo "Домашний каталог '$LCHOME' не существует, а попытка его создания завершилась провалом"
    exit $NEH_REQUEST
fi
sudo chown $TMPUSER $LCHOME
    fi
fi

# Проверяем получили ли мы каталог
if [ ! -d $LCHOME ]; then
    echo "Домашний каталог '$LCHOME' не существует или его не удалось создать"
    exit $NEH_REQUEST
fi

# Отдаём файл авторизации
LXA=$LCHOME/.xauthority-tudo
sudo cp $MYXA $LXA
sudo chown $TMPUSER $LXA
# Проверяем получили ли файл авторизации
if [ ! -e $LXA ]; then
    echo "Не удалось создать файл авторизации"
    exit $FCXA_REQUEST
fi

# На всякий случай проверяем переменные
# Так как хомяк и файл авторизации будут удалятся, да ещё и от root - проверим что путь к хомяку не "" и не "/"
if [ "$LCHOME" = "" -o "$LCHOME" = "/" ]; then
    echo "Что-то пошло не так..."
    exit $UE_REQUEST
fi

# Экспортируем переменные
export XAUTHORITY=$LXA
export DISPLAY=$DSPL
export HOME=$LCHOME

# Запускаемся
echo "'$CMND' выполняется в следующем окружении:"
sudo -u $TMPUSER env
echo "------------ далее следует вывод выполняемой команды ------------"
sudo -u $TMPUSER $CMND
CMDEXIT_REQUEST=$?
echo "---------------- конец вывода выполняемой команды ----------------"
echo "'$CMND' завершилась с кодом: $CMDEXIT_REQUEST"

# Удаляем файл авторизации
# Тут нам потребуется судо
sudo true
if [ "$?" != "0" ]; then
    echo "$0: провал авторизации"
    echo "Файл авторизации X-сервера ($LXA) не будет удалён"
    if [ "$PLACE" = "t" ]; then
echo "Временная домашняя директория ($LCHOME) не будет удалёна"
echo "Файл-указатель ($LCLCHOME) не будет удалён"
    fi
    exit $SUDOFAIL_REQUEST
fi
sudo rm -f "$LXA"

if [ "$PLACE" = "t" ]; then
    # Удаляем домашний каталог
    sleep 8

    # Мы должны быть уверены что:
# 1 Переменная $LCHOME всё ещё указывает на созданный нами каталог
# 2 Нет больше ни одной копии tudo которая его использует
    if [ -e "$LCLCHOME" -a  -e "$LCHOME" ]; then
LCLCHOMECNT=`cat "$LCLCHOME"`
if [ "$LCHOME" = "$LCLCHOMECNT" -a "$LCHOME" != "" ]; then
    sudo rm -r -f "$LCHOME"
    rm -f "$LCLCHOME"
else
    echo "Что-то пошло не так при попытке удалить временный домашний каталог '$LCHOME' ..."
    echo "Удалите '$LCHOME' вручную если он действительно не нужен."
    exit $UE_REQUEST
fi
    else
echo "Что-то пошло не так при попытке удалить временный домашний каталог '$LCHOME' ..."
echo "Удалите '$LCHOME' вручную если он действительно не нужен."
exit $UE_REQUEST
    fi
fi

exit $CMDEXIT_REQUEST

[свернуть]

qupl

Форум автозамену в скрипте провел, так что он требует редактирования.

ecc83


qupl

Цитата: ecc83 от 15 ноября 2018, 19:28:29Перезаписал, проверил, всё работает.
Опасные команды заменяет на русский  ;)  15 строка снизу.

ecc83

Цитата: qupl от 16 ноября 2018, 15:03:55
Опасные команды заменяет на русский  ;)  15 строка снизу.

Починил. Очень ответственный форум какой то :)

rrytr7778

Может есть возможность запустить отдельный x-server для нового юзера?

ecc83

Цитата: rrytr7778 от 17 ноября 2018, 23:19:03
Может есть возможность запустить отдельный x-server для нового юзера?

Зачем это?
Ты же новую систему для нового юзера не ищешь возможность запускать, ты ведь знаешь что твоя система многопользовательская. То же самое и с xserver-ом.

А что не получается со скриптом запустить второй браузер?
Я надеюсь ты создал для нового пользователя домашний каталог и настроил для него шелл?

rrytr7778

Цитата: ecc83 от 18 ноября 2018, 00:26:34Зачем это?
Ты же новую систему для нового юзера не ищешь возможность запускать, ты ведь знаешь что твоя система многопользовательская. То же самое и с xserver-ом.

А что не получается со скриптом запустить второй браузер?
Я надеюсь ты создал для нового пользователя домашний каталог и настроил для него шелл?
Спортивный интерес. Вижу в процессах
/usr/libexec/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 7 -core
но не понятно откуда он запускается.