Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Запуск GUI-приложения от имени другого польз&  (Прочитано 4906 раз)

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

Оффлайн dr.Faust

  • Автор темы
  • Активист
  • *
  • Сообщений: 435
    • Просмотр профиля
Иногда возникают вопросы как запустить GUI-приложения от имени другого пользователя.
Нужно это для самых разнообразных вещей - от вопросов безопасности (запуск браузера, Skype и т.п.) до администрирования учётки другого реального юзера (настроить Oper'у жене).
А есть ещё вот такие необходимости https://forum.ubuntu.ru/index.php?topic=72693.0
Всякие советы разрешить доступ к иксам всем просто достали при этом.
Вобщем для себя написал универсальный скрипт.
Вот он:
#!/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


# Справка
if [ "$1" = "-h"  -o "$1" = "--help" ]     # Request 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

by dr.Faust aka Suntechnic
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 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 -rf "$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
Кладу его в /usr/sbin, обозвав tudo, и юзаю примерно так (относительно настройки gdm):
tudo gdm dbus-launch gnome-appearance-propertiesМожет кому пригодится...
Если что-то непонятно, то tudo -h вам в помощь.
« Последнее редактирование: 23 Ноября 2010, 11:00:11 от dr.Faust »

Оффлайн Charles Malaheenee

  • Активист
  • *
  • Сообщений: 756
  • Учтите, мы можем дать и вредный совет.
    • Просмотр профиля
Весьма интересно и познавательно, испробуем. Ту же задачу мы решаем с использованием ssh на localhost - тоже весьма недурно получается.
Все мы где-то, когда-то и в чем-то были новичками.

Оффлайн dr.Faust

  • Автор темы
  • Активист
  • *
  • Сообщений: 435
    • Просмотр профиля
Честно говоря я так и не понял в чем проблема с ssh - у меня с ключом -X (да и с -Y) иксы пробрасываются в полтычка.

 

Страница сгенерирована за 0.053 секунд. Запросов: 25.