[software development] 脚本如何实现root检测当前普通用户运行脚本
Tofloor
poster avatar
Zeta.
deepin
2024-01-09 10:46
Author

我写了个不管用 su切换不行shell

postinst哪里要用普通用户运

有没有大佬帮我写个脚本 谢谢啦

这是要运行的脚本代码

#!/bin/bash  
  
# 获取连接的显示器名称  
MONITOR_NAME=$(xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)  
  
# 设置壁纸的函数  
set_wallpaper() {  
    local monitor_name="$1"  
    local image_file="$2"
    dbus-send --session --print-reply=literal --dest=com.deepin.daemon.Appearance /com/deepin/daemon/Appearance com.deepin.daemon.Appearance.SetMonitorBackground string:"$monitor_name" string:"file:///usr/share/wallpapers/deepin/{wallpaper_file_name}"  
}  
  
# 调用函数设置壁纸  
set_wallpaper "$MONITOR_NAME"
Reply Favorite View the author
All Replies
yanjuner
Super Moderator
2024-01-09 10:48
#1

我不会

@longlong@Ziggy

Reply View the author
安洛
deepin
2024-01-09 11:02
#2

我没太看懂你的需求

如果你是希望脚本中的命令以特定用户身份运行,可以试试 sudo -u

Reply View the author
爱开发
deepin
2024-01-09 11:11
#3

你这函数,第二个参数没传进去。image_file 没法取到数据(不过你后面也没用到)
不知道是不是你后面的 wallpaper_file_name 要用上。如果是要用,那么就少了$,而且变量也没赋值。

string:"file:///usr/share/wallpapers/deepin/{wallpaper_file_name}"
Reply View the author
Zeta.
deepin
2024-01-09 12:25
#4
爱开发

你这函数,第二个参数没传进去。image_file 没法取到数据(不过你后面也没用到)
不知道是不是你后面的 wallpaper_file_name 要用上。如果是要用,那么就少了$,而且变量也没赋值。

string:"file:///usr/share/wallpapers/deepin/{wallpaper_file_name}"

wallpaper_file_name塞python的 f-write语法要用的 主要是想以普通用户的权限运行这个脚本 su命令试过不行 只能来求助了

Reply View the author
Zeta.
deepin
2024-01-09 12:27
#5
安洛

我没太看懂你的需求

如果你是希望脚本中的命令以特定用户身份运行,可以试试 sudo -u

想让普通用户运行这个脚本试过了sudo 和 su这些 都不管用 想让脚本检测当前普通用户在root⬇️切换到这里

Reply View the author
neko
deepin
Ecological co-builder
2024-01-09 13:29
#6
sudo -u $USER env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus dbus-send --session --dest=org.deepin.dde.Appearance1 --type=method_call --print-reply /org/deepin/dde/Appearance1 org.deepin.dde.Appearance1.SetMonitorBackground string:"eDP" string:"/usr/share/wallpapers/deepin/desktop.jpg"

添加DBUS_SESSION_BUS_ADDRESS变量就可以了

Reply View the author
观摩
deepin
2024-01-09 13:55
#7

大家都喜欢自己折腾换壁纸啊

Reply View the author
dgmenghuan
deepin
2024-01-09 14:34
#8

tail

Reply View the author
爱开发
deepin
2024-01-09 16:15
#9
Zeta.

wallpaper_file_name塞python的 f-write语法要用的 主要是想以普通用户的权限运行这个脚本 su命令试过不行 只能来求助了

这个我就不了解了。
我是单纯针对你这 shell 脚本中说的。因为按纯 shell 语法来说,这个是错误的。

Reply View the author
Zeta.
deepin
2024-01-09 19:01
#10
neko
sudo -u $USER env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus dbus-send --session --dest=org.deepin.dde.Appearance1 --type=method_call --print-reply /org/deepin/dde/Appearance1 org.deepin.dde.Appearance1.SetMonitorBackground string:"eDP" string:"/usr/share/wallpapers/deepin/desktop.jpg"

添加DBUS_SESSION_BUS_ADDRESS变量就可以了

大佬!检测显示屏内快用root也不行能不能给个解决办法 谢谢大佬

Reply View the author
neko
deepin
Ecological co-builder
2024-01-09 19:41
#11
Zeta.

大佬!检测显示屏内快用root也不行能不能给个解决办法 谢谢大佬

试试加env DISPLAY=:0 环境变量

Reply View the author
Zeta.
deepin
2024-01-09 19:46
#12
neko

试试加env DISPLAY=:0 环境变量

MONITOR_NAME=$(xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1) 试过了不行,得用这个变量好用还是得不能root只能普通用户 要写在postinst里

Reply View the author
neko
deepin
Ecological co-builder
2024-01-09 19:54
#13

MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)

Reply View the author
Zeta.
deepin
2024-01-09 19:55
#14
neko

MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)

谢谢大佬我去试试

Reply View the author
Zeta.
deepin
2024-01-09 20:00
#15
neko

MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)

大概这样就行了吧

#!/bin/bash  
  
# 获取连接的显示器名称  
MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)  
  
# 设置壁纸的函数  
set_wallpaper() {  
    local monitor_name="$1"  
    sudo -u $USER env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus dbus-send --session --dest=org.deepin.dde.Appearance1 --type=method_call --print-reply /org/deepin/dde/Appearance1 org.deepin.dde.Appearance1.SetMonitorBackground string:"$monitor_name" string:"/usr/share/wallpapers/deepin/{wallpaper_file_name}"
}  
  
# 调用函数设置壁纸  
set_wallpaper "$MONITOR_NAME
Reply View the author
neko
deepin
Ecological co-builder
2024-01-09 20:01
#16
Zeta.

大概这样就行了吧

#!/bin/bash  
  
# 获取连接的显示器名称  
MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)  
  
# 设置壁纸的函数  
set_wallpaper() {  
    local monitor_name="$1"  
    sudo -u $USER env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus dbus-send --session --dest=org.deepin.dde.Appearance1 --type=method_call --print-reply /org/deepin/dde/Appearance1 org.deepin.dde.Appearance1.SetMonitorBackground string:"$monitor_name" string:"/usr/share/wallpapers/deepin/{wallpaper_file_name}"
}  
  
# 调用函数设置壁纸  
set_wallpaper "$MONITOR_NAME

Reply View the author
Zeta.
deepin
2024-01-09 20:09
#17
neko

MONITOR_NAME=$(env DISPLAY=:0 sudo -u $USER xrandr | grep connected | grep -v disconnected | cut -d ' ' -f 1)

运行了提示这个

Failed to open connection to "session" message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

Reply View the author
曾经uos一员
deepin
2024-01-15 12:56
#18
Zeta.

运行了提示这个

Failed to open connection to "session" message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

报错,你得声明你的user变量吧,(如:USER=$(getent passwd who | head -n 1 | cut -d : -f 1))才能获取到变量值!

Reply View the author