用sudo设置其他用户的gsettings

Xu *_*ang 11 bash shell ubuntu sudo

在Ubuntu 13.10上,我将所有gsettings放在一个文件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']"
Run Code Online (Sandbox Code Playgroud)

我有一个主安装脚本,我必须使用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
Run Code Online (Sandbox Code Playgroud)

这些都不起作用(它们运行时没有错误并更改设置[我在脚本中用gsetting get检查]但不是用户"wang").

当我从命令行运行mygset.sh(没有sudo :) bash ./mygset.sh.它完美地运作.为什么会有这种差异,我该怎么做才能解决它masterinstall.sh

小智 10

在尝试了很多不同组合的东西之后,这是唯一对我有用的命令:

sudo -H -u <user> DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<uid>/bus gsettings set...
Run Code Online (Sandbox Code Playgroud)

在 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 Code Online (Sandbox Code Playgroud)

像这样使用它:

run-in-user-session gsettings set...
Run Code Online (Sandbox Code Playgroud)


Gre*_*HNZ 5

默认情况下,sudo将uid和gid设置为您指定的用户,但它不会更改环境设置等.

建议您-H先尝试,将$HOME变量设置为目标用户:

sudo -u "wang" -H ./myget.sh
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试-i模拟初始登录.

稍微不同的大头针,我发现有时可以使用,是使用su:

sudo su - wang
/full/path/to/myget.sh
exit
Run Code Online (Sandbox Code Playgroud)

您需要使用脚本的完整路径,因为su命令会更改当前工作目录.


ssn*_*ody 4

我建议您编写一个“父”脚本,然后可以在以本地用户身份再次运行 myget 之前使用 sudo 启动 masterinstall。示例如下:

#!/bin/bash

sudo ./masterinstall.sh
./mygset.sh
Run Code Online (Sandbox Code Playgroud)