在 KDE 设置中,您可以指定快捷方式来执行任意命令。
要将命令分配给 KDE 中的快捷方式,您可以执行以下操作。在System Settings
-> Shortcuts
->中Custom Shortcuts
,右键单击,选择New
-> Global Shortcut
-> Command/URL
。转到Action
选项卡并填写命令。并在Trigger
选项卡中分配实际的快捷方式。这种机制对于非 sudo 命令正常工作。
但不幸的是,当我使用需要 root 权限的命令时(假设sudo systemctl start something
),它只是没有执行。
有没有办法绕过这个限制?我希望能够触发需要评估权限的操作。
答案1
一种解决方案是使用由 root 拥有并具有 SUID 位的可执行文件。
最有可能的是,您没有自己的二进制文件,而是想使用命令。如果您使用 suid 位制作 bash 脚本文件,suid 位将被忽略,请参阅为什么 setuid 不起作用?。
因此,对于您的命令,您需要编译一个二进制文件。
创建文件start_smth.c
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("systemctl start something");
return 0;
}
编译并设置权限:
$ gcc start_smth.c -o start_smth
$ sudo chown root:root start_smth
$ sudo chmod 4755 start_smth
在设置中的 Command/URL 字段中填写 start_smth 二进制文件的路径,例如/home/user/bin/start_smth
。
如果你有很多命令需要以这种方式准备,你可以使用这个脚本compile_and_set_permissions.sh
:
#!/bin/bash
FILE="$1"
FILE_NO_EXT="${FILE%.*}"
gcc "$FILE" -o "$FILE_NO_EXT"
sudo chown root:root "$FILE_NO_EXT"
sudo chmod 4755 "$FILE_NO_EXT"
然后将 ac 文件作为参数传递:
$ compile_and_set_permissions.sh stop_smth.c
答案2
使用您的终端模拟器的名称(例如 Konsole)带有 -e 标志,然后添加您的命令:
konsole -e sudo systemctl start something