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)
默认情况下,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命令会更改当前工作目录.
我建议您编写一个“父”脚本,然后可以在以本地用户身份再次运行 myget 之前使用 sudo 启动 masterinstall。示例如下:
#!/bin/bash
sudo ./masterinstall.sh
./mygset.sh
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5058 次 |
| 最近记录: |