主要问题:
有没有一种方法,当 ubuntu 的桌面出现时,无论是 root、管理员、桌面用户还是非特权用户登录,我都可以“完全”运行我的一个脚本?
该脚本起什么作用?
该脚本会挂载一个分区,在该分区中查找文件,最后根据该文件决定是否将一个分区复制到另一个分区。复制是通过
dd if=/dev/sda2 of=/dev/sda5
脚本什么时候运行良好?
当我通过以下方式从终端运行脚本时,脚本运行顺利
sudo ./my_copying_script
此命令要求我输入当前登录用户的密码。我输入密码后,脚本开始运行。
脚本什么时候运行不正常?
我想在启动时运行该脚本。我使用以下命令将其设置为启动程序启动应用程序Ubuntu 实用程序。脚本在启动时运行,但在 dd 命令处退出并返回以下错误:
dd: opening '/dev/sda2': Permission denied
在埃德克的建议我将my_copying_script的所有者设置为root,并设置SUID。现在my_copying_script的权限是(-rwsr-sr-x)。埃德克的观点是,一旦我设置了 suid,启动程序就会以其所有者的权限运行。我这样做了,但还是出现了相同的 /dev/sda2 权限被拒绝错误。
然后我在 dd 前面加上 sudo ,如下所述
sudo dd if=/dev/sda2 of=/dev/sda5
但这返回了以下错误:
sudo: no tty present and no askpass program specified
答案1
乌斯曼,我认为你至少有我已经提到的两个选择。
最简单的方法
制作一个设置 UID 的二进制文件,它将(检查谁启动了它,如果父进程所有者可以运行它,则允许使用)运行准备好的脚本并退出。将其放入桌面管理器的启动中,就是这样。请注意,这不是最好的方法,它需要一点 C 编码。基本上,您需要制作类似此示例的代码:
int main(){
setuid(0);
system("/bin/sh /root/bin/mounts.sh");
}
请注意,这实际上是一种黑客攻击,而不是解决方案。并且一定要使用 root:allowed_group 和 4750 权限二进制如果您不需要每个人都运行它。请记住将所有可能启动它的用户添加到允许组中(选择您的名称)。
一个好方法
其他更好的方法是创建一种守护进程,在系统启动时生成(例如,从 init 脚本),但我不确定你究竟如何检测新的 X 会话何时启动,我还没有进入这个话题,我不能给出任何清除这里的建议。
答案2
然后在安装的驱动器路径上设置正确的权限,然后就完成了。
答案3
仅当满足以下 3 个条件之一时(就密码而言),sudo 才会以不同用户身份运行程序:
- 指定了 NOPASSWD 选项
- 用户输入了正确的目标密码
- 用户输入了正确的源密码
由于选项 2 和 3 需要 TTY(sudo 不会从管道读取),如果找不到 TTY,它将无法运行。如果您在任何时候使用 ssh 远程运行脚本,请检查您的脚本,因为它可能不会为非交互式远程命令分配 TTY。
引自:这里
答案4
一种可能的解决方案是使用 NOPASSWD 参数将您的用户及其尝试调用的命令添加到 /etc/sudoers。从 /etc/sudoers 剪切:
# 取消注释以允许 sudo 组成员不需要密码 #(请注意,后面的条目会覆盖此条目,因此您可能需要移动 # 进一步向下) #%sudo ALL=NOPASSWD: ALL
因此也许你需要类似这样的东西:
myuser ALL=NOPASSWD: mount
我不太清楚具体的语法,你最好用谷歌搜索一下。
编辑:如果您尝试挂载网络驱动器,则向 /etc/fstab 添加记录可能不起作用,因为在执行 fstab 时不会加载网络服务。