使用sudo设置其他用户的gsettings

问题描述 投票:11回答:6

在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中如何解决?

bash shell ubuntu sudo
6个回答
3
投票

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

#!/bin/bash

sudo ./masterinstall.sh
./mygset.sh

5
投票

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

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

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

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

我发现有时有用的一种稍微不同的方法是使用su

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

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


2
投票

也许您应该以应更改其设置的用户身份运行每个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

2
投票

我有一个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

1
投票

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

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...

0
投票

对于GNOME3中的脚本:您可以chmod xxx /home/user/.cache/dconf,以便可以访问gsettings。然后在完成后将其更改回]

© www.soinside.com 2019 - 2024. All rights reserved.