LINUX.ORG.RU
ФорумAdmin

Получить переменную окружения пользователя из под root

 , ,


0

1

Здравствуйте.

Подскажите, как из под root получить переменную окружения пользователя?

Немного контекста. Есть сервис VPN, который при запуске, для аутентификации(логин, пароль, отп) ходит в пользователельское хранилище паролей(pass) и получает необходимые данные. Для расшифрования паролей используется gpg-агент, который хранит ключи в памяти некоторое время, после которого он их забывает. Для обновления ключей используется программа pinentry, но ей для вызова диалогового окна нужна переменная окружения XAUTHORITY. Собственно остюда и вопрос, как метнуться от имени сервиса к пользователю и получить эту переменную окружения?

Обновление ключа не работает: su rav -c 'gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/LDAP.gpg 2>/dev/null'

Обновление ключа работает: su rav -c 'XAUTHORITY=/tmp/xauth_zjilik gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/LDAP.gpg 2>/dev/null'



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

Собственно остюда и вопрос, как метнуться от имени сервиса к пользователю и получить эту переменную окружения

eval "$(systemctl -M <USER>@.host --user show-environment | grep -E '^VAR_NAME=')"

Но это грязный костыль, не делай так.

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

Но это грязный костыль, не делай так.

Зато рабочий. А как его правильно вытаскивать? Кстати как оказалось одного XAUTHORITY мало для нормального запуска pinentry от сервиса, видимо окружение сервиса systemd и окружения процессов root гораздо сильнее отличаются чем я думал.

su без -l наследует часть окружения того пользователя, который её вызвал.

Спасибо поправил

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

Получился сервис, который толкает такой скрипт:

#!/nix/store/r9h133c9m8f6jnlsqzwf89zg9w0w78s8-bash-5.2-p15/bin/bash
set -e
MESSAGE=$(cat /run/systemd/ask-password/ask.* | grep 'Message=' | cut -b9-)
SOCKET=$(cat /run/systemd/ask-password/ask.* | grep 'Socket=' | cut -b8-)
XAUTHORITY=$(systemctl -M rav@.host --user show-environment | grep -E '^XAUTHORITY=')
echo $MESSAGE
echo $SOCKET
echo $XAUTHORITY
case "$MESSAGE" in
  "Enter Auth Username:" ) echo +$(echo "$(su - rav -c "XAUTHORITY=$XAUTHORITY gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/LDAP.gpg 2>/dev/null")" | grep "login:" | cut -b8-) | socat - UNIX-SENDTO:$SOCKET
  ;;
  "Enter Auth Password:" ) echo +$(echo "$(su - rav -c "XAUTHORITY=$XAUTHORITY gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/LDAP.gpg 2>/dev/null")" | head -n 1) | socat - UNIX-SENDTO:$SOCKET
  ;;
  "CHALLENGE: Enter OTP token" ) echo +$(oathtool --totp -b "$(echo $(su - rav -c "XAUTHORITY=$XAUTHORITY gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/OpenVPN.gpg 2>/dev/null") | grep "CloudVPN" | cut -b54-)") | socat - UNIX-SENDTO:$SOCKET
  ;;
esac
torm7
() автор топика
Ответ на: комментарий от torm7

Естественно. TERM же выставляется конкретно взятым терминалом/эмулятором терминала. А вообще pgrep -u USERNAME -n bash в помощь - скорее всего, там будет нужный тебе XAUTHORITY.

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

Я ж тебе говорил, что нет «переменных юзера» и везде будут переменные конкретного процесса. И эта «systemctl show-environment» тоже показывает переменные какого-то процесса, несмотря на название команды.

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

Так в том и вопрос был, как метнуться к пользователю(нужному процессу), и достать это от него.

Тема простая, пользователю дали логин, пароль, ОТП. Он сложил это в менеджер паролей. Менеджер паролей это процесс, который запускается для каждого пользователя свой. OpenVPN это системный сервис, который должен дойти до пользователя получить из менеджера паролей данные и предоставитьт этому пользователю диалоговое окно, в случае необходимости. Но как выяснилось для диалога системный сервис должен не только пнуть команду, но и передать этой команде некоторые переменные окружения пользовательского процесса. Я кстати досих пор ещё не до конца понял какие. strace говорит, но нет однозначного сопоставления между environment и тем что попадает софту

torm7
() автор топика
Последнее исправление: torm7 (всего исправлений: 1)