Ответ 1
Я рекомендую вам написать родительский script, который затем может запустить masterinstall с помощью sudo, прежде чем снова запустить myget в качестве локального пользователя. Примеры:
#!/bin/bash
sudo ./masterinstall.sh
./mygset.sh
В 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
?
Я рекомендую вам написать родительский script, который затем может запустить masterinstall с помощью sudo, прежде чем снова запустить myget в качестве локального пользователя. Примеры:
#!/bin/bash
sudo ./masterinstall.sh
./mygset.sh
По умолчанию sudo устанавливает uid и gid указанному пользователю, но не меняет настройки среды и т.д.
Предложите сначала попробовать -H
, который устанавливает переменную $HOME
целевому пользователю:
sudo -u "wang" -H ./myget.sh
Если это не сработает, попробуйте -i
, который должен имитировать начальный логин.
Несколько другой способ, который я нашел, иногда работает, заключается в использовании su
:
sudo su - wang
/full/path/to/myget.sh
exit
Вам нужно будет использовать полный путь к script, потому что команда su изменяет текущий рабочий каталог.
Может быть, вы должны запускать каждый 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
У меня есть 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
После многих попыток в разных комбинациях это единственная команда, которая сработала для меня:
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...