以 root 身份在启动时运行脚本有问题?

以 root 身份在启动时运行脚本有问题?

主要问题:

有没有一种方法,当 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 才会以不同用户身份运行程序:

  1. 指定了 NOPASSWD 选项
  2. 用户输入了正确的目标密码
  3. 用户输入了正确的源密码

由于选项 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 时不会加载网络服务。

相关内容