在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']"
我有一个必须使用sudo运行的主安装脚本(例如,它执行sudo apt-get install)。从该主安装脚本中,我要调用mygset.sh
。但是,无论我怎么称呼它都不会更改用户的设置。我认为它正在更改root的设置。我已经尝试过了(从masterinstall.sh
(正在以sudo ./masterinstall.sh
的身份运行):
sudo -u "wang" ./mygset.sh
sudo -u "wang" bash -c ./mygset.sh
这些都不起作用(它们运行都没有错误并且更改了设置[我使用gsetting get在脚本中检查],但没有为用户“ wang”设置。
当我从命令行运行mygset.sh
时(没有sudo:bash ./mygset.sh
)。它运作完美。为什么会有这种差异?在masterinstall.sh
中如何解决?
我建议您编写一个'parent'脚本,然后可以使用sudo启动masterinstall,然后再次以本地用户身份运行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
您需要使用脚本的完整路径,因为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自动映射远程共享时,脚本将停止并等待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脚本来设置我的设置。因为我以sudo身份运行脚本,所以EUID为0,因此必须首先找到$ RUID(真实用户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[@]}" "$@"
}
像这样使用它:
run-in-user-session gsettings set...
对于GNOME3中的脚本:您可以chmod xxx /home/user/.cache/dconf,以便可以访问gsettings。然后在完成后将其更改回]