Установка gsettings другого пользователя с sudo

В Ubuntu 13.10 у меня есть все мои настройки в файле mygset.sh. Например, mygset.sh содержит много строк, таких как

gsettings set com.canonical.Unity.Launcher favorites "['application://nautilus.desktop', 'application://firefox.desktop', 'application://chromium-browser.desktop', 'unity://running-apps', 'unity://expo-icon', 'unity://devices']"

У меня есть главная установка script, которую я должен запускать с помощью sudo (например, sudo apt-get install). От этого мастера установите script Я хочу позвонить mygset.sh. Однако, как бы я ни называл это, он не меняет настройки для моего пользователя. Я думаю, что он меняет настройки root. Я пробовал это как (от masterinstall.sh, который выполняется как sudo ./masterinstall.sh):

sudo -u "wang" ./mygset.sh
sudo -u "wang" bash -c ./mygset.sh

Ни одна из этих работ не работает (они запускаются без ошибок и изменяют настройку [я проверяю внутри script с gsetting get], но не для пользователя "wang" ).

Когда я запускаю mygset.sh из командной строки (без sudo: bash ./mygset.sh). Он работает отлично. Почему существует эта разница и что я могу сделать для ее решения в masterinstall.sh?

Ответ 1

Я рекомендую вам написать родительский script, который затем может запустить masterinstall с помощью sudo, прежде чем снова запустить myget в качестве локального пользователя. Примеры:

#!/bin/bash

sudo ./masterinstall.sh
./mygset.sh

Ответ 2

По умолчанию sudo устанавливает uid и gid указанному пользователю, но не меняет настройки среды и т.д.

Предложите сначала попробовать -H, который устанавливает переменную $HOME целевому пользователю:

sudo -u "wang" -H ./myget.sh

Если это не сработает, попробуйте -i, который должен имитировать начальный логин.

Несколько другой способ, который я нашел, иногда работает, заключается в использовании su:

sudo su - wang
/full/path/to/myget.sh
exit

Вам нужно будет использовать полный путь к script, потому что команда su изменяет текущий рабочий каталог.

Ответ 3

Может быть, вы должны запускать каждый gsettings set ... в качестве пользователя, чьи настройки должны измениться:

sudo -u wang dbus-launch --exit-with-session gsettings set com.canonical.Unity.Launcher favorites "['application://nautilus.desktop', 'application://firefox.desktop', 'application://chromium-browser.desktop', 'unity://running-apps', 'unity://expo-icon', 'unity://devices']" >/dev/null 2>&1

Может возникнуть ошибка в том, что вы не создаете .dbus/session-bus. Добавление >/dev/null 2>&1 приведет к их подавлению.

Помните, что изменение настроек для размонтирования зашифрованных домов не будет работать.

При использовании pam_mount для автоматической сопоставления удаленных общих ресурсов script остановится и ждет пароль pam_mount. Вы можете обходить это путем временного деактивации pam_mount:

# deactivate pam_mount   
sed 's/@include common-session-noninteractive/#@include common-session-noninteractive/g' -i /etc/pam.d/sudo 
sed 's/session\toptional\tpam_mount.so/#session\toptional\tpam_mount.so/g' -i /etc/pam.d/common-session

# do your settings

# reactivate pam_mount   
sed 's/#@include common-session-noninteractive/@include common-session-noninteractive/g' -i /etc/pam.d/sudo 
sed 's/#session\toptional\tpam_mount.so/session\toptional\tpam_mount.so/g' -i /etc/pam.d/common-session

Ответ 4

У меня есть POST-Install script, который устанавливает мое gsetting. Поскольку я запускаю script как sudo, EUID равен 0, я должен найти $RUID (Real User ID).

вот мой подход:

#!/usr/bin/env bash
# Get the Real Username
RUID=$(who | awk 'FNR == 1 {print $1}')

# Translate Real Username to Real User ID
RUSER_UID=$(id -u ${RUID})

# Set gsettings for the Real User
sudo -u ${RUID} DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${RUSER_UID}/bus" gsettings set org.gnome.desktop.interface clock-show-date false

exit

Ответ 5

После многих попыток в разных комбинациях это единственная команда, которая сработала для меня:

sudo -H -u <user> DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<uid>/bus gsettings set...

В bash-скрипте вы можете использовать следующую функцию для автоматического определения пользователя и среды текущего сеанса:

function run-in-user-session() {
    _display_id=":$(find /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
    _username=$(who | grep "\(${_display_id}\)" | awk '{print $1}')
    _user_id=$(id -u "$_username")
    _environment=("DISPLAY=$_display_id" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$_user_id/bus")
    sudo -Hu "$_username" env "${_environment[@]}" "[email protected]"
}

Используйте это так:

run-in-user-session gsettings set...