使一个脚本获得root权限,运行或调用此脚本时不再需要输入密码!

本文介绍如何通过Sudo权限配置文件实现指定命令无密码执行,包括配置文件创建、权限设置、错误处理及注意事项。同时,提供了解决特定命令自身需要sudo权限时的配置方法。
部署运行你感兴趣的模型镜像
步骤:
     1、建立sudoer文件:
vim /etc/sudoers.d/ovs_sudoers
          写入:
#!/etc/sudoers.d/bash
msj ALL = (root) NOPASSWD: /usr/bin/test.sh

     2、上面的脚本使得目录文件 /usr/bin/test.sh文件不再需要使用密码访问及执行
     3、此时可能会有如下报错:
          sudo: /etc/sudoers.d/ovs_sudoers is mode 0644, should be 0440  

     4、更改权限:
          
sudo chmod 440 /etc/sudoers.d/ovs_sudoers

     5、OK,此时在其他地方通过sudo调用test.sh时不再需要输入密码啦!
注意:
     以上的这种做法实际上是有问题的,那就是只要文件的名称是test.sh,那么都不再需要输入密码了!
     Pay attention please!

但是:当test.sh里面的命令本身需要sudo权限时,这样做的话并不能解决问题。解决方案如下:
步骤:
     1、首先你需要确定里面的命令的启动路径,使用如下命令:
whereis ovs-vsctl

          得到:ovs-vsctl: /usr/local/bin/ovs-vsctl //这就是这条shell命令的路径。(我居然一直以为要整条命令都敲上去。。蠢哭了。。)
     2、然后更改上面的ovs_sudoers文件:
          
#!/etc/sudoers.d/bash
msj ALL = (root) NOPASSWD: /usr/local/bin/ovs-vsctl

     3、这样你执行ovs相关的命令都不再需要输入密码啦!但是注意请输入命令的时候加上“sudo”


您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think> 我们参考上述引用并结合Linux系统(包括国产系统)的通用知识来回答。 国产系统通常基于Linux(如Ubuntu、CentOS等),因此开机自启的方法类似。常见方法有: 1. 使用/etc/rc.local文件(需确保该服务存在且可执行权限) 2. 使用systemd服务(现代Linux发行版的标准方法) 引用[^2]和[^3]提到了rc.local方法,引用[^5]提到了使用systemd服务的方法。 具体实现方法: 方法一:使用rc.local(适合简单的脚本) 步骤: 1. 编写需要自启的脚本(假设为/path/to/script.sh),并确保该脚本有可执行权限(chmod +x /path/to/script.sh) 2. 编辑/etc/rc.local文件(如果没有则创建,并确保其有可执行权限) 3. 在/etc/rc.local文件中添加一行:/path/to/script.sh 4. 保存并退出。 注意:在有些系统中,rc.local默认不启用,需要手动启用。 方法二:使用systemd服务(推荐,更灵活且功能强大) 步骤: 1. 创建一个服务单元文件,例如:/etc/systemd/system/myservice.service 2. 编辑该文件,内容示例: [Unit] Description=My custom service After=network.target [Service] Type=simple ExecStart=/path/to/script.sh Restart=on-failure User=root # 以root用户运行 Group=root # 以root运行 [Install] WantedBy=multi-user.target 3. 给脚本添加可执行权限:chmod +x /path/to/script.sh 4. 重新加载systemd配置:sudo systemctl daemon-reload 5. 启用服务开机自启:sudo systemctl enable myservice.service 6. 启动服务:sudo systemctl start myservice.service 注意:在国产系统中,如果使用的是systemd,则推荐此方法。 方法三:使用crontab(利用@reboot) 步骤: 1. 编辑root用户的crontab:sudo crontab -e 2. 添加一行:@reboot /path/to/script.sh 3. 保存退出。 但注意:crontab的@reboot在系统启动运行一次,但运行机较早,可能没有完成系统初始化(如网络等),所以需要谨慎。 根据引用[^5],在国产系统中配置开机自启docker容器使用了systemd,所以我们可以推断国产系统支持systemd。 因此,推荐使用systemd方式,因为它更标准、功能更全面(支持依赖关系、重启策略等)。 关于脚本需要root权限的问题: 在systemd的服务文件中,我们已经指定了User=root和Group=root,所以会以root权限运行。 在rc.local方法中,由于rc.local本身就是以root运行的,所以其中运行脚本也会以root运行。 在crontab方法中,如果是root用户的crontab,那么也是以root运行。 因此,三种方法都可以实现以root权限运行,但推荐systemd。 下面提供一个具体的systemd服务文件示例(假设我们要自启一个名为`myapp`的服务): 1. 创建服务文件:`/etc/systemd/system/myapp.service` 2. 内容如下: [Unit] Description=My Custom Application After=network.target # 如果需要网络,则等待网络就绪 [Service] Type=simple User=root Group=root ExecStart=/usr/bin/bash /path/to/your_script.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target 3. 然后执行: sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service 这样,脚本就会在每次开机root权限自动运行。 注意:脚本中如果涉及环境变量,可能需要特别注意。因为systemd服务不会加载用户的环境变量,所以最好在脚本中设置必要的环境变量,者使用绝对路径。 另外,引用[^4]提供了一个脚本的例子,它通过接受参数(start/stop/restart)来控制一个Java应用的启动,我们可以将其作为一个服务脚本来使用。我们可以将这样的脚本放在指定的路径,然后在systemd服务的ExecStart中调用这个脚本并传递参数(例如:ExecStart=/path/to/autodeploy.sh start)。 但是,更常见的做法是直接在systemd服务中运行命令(如上面的示例),而不是通过一个中间脚本去控制。当然,如果已经有成熟的管理脚本,也可以直接调用。 总结:在国产系统中,推荐使用systemd方式来设置开机自启的root权限脚本。 </think> 在国产Linux系统中(如统信UOS、麒麟OS等),实现以root权限开机自启shell脚本的推荐方法如下,结合系统引用和通用实践: ### 📌 方法1:通过systemd服务(推荐) **适用场景**:需要精细控制服务依赖、重启策略的场景 **步骤**: 1. 创建服务文件(需root权限): ```bash sudo vim /etc/systemd/system/custom.service ``` 2. 写入配置(示例): ```ini [Unit] Description=自定义开机服务 After=network.target # 网络就绪后启动 [Service] Type=simple User=root # 关键:指定root权限 ExecStart=/path/to/your_script.sh # 脚本绝对路径 Restart=on-failure # 失败自动重启 [Install] WantedBy=multi-user.target ``` 3. 启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable custom.service # 设置开机自启 sudo systemctl start custom.service # 立即启动 ``` **优势**:支持日志监控(`journalctl -u custom.service`)、依赖管理、资源限制(参考引用[^5])✅ ### ⚙️ 方法2:利用rc.local(传统方案) **适用场景**:简单脚本且兼容旧系统 **步骤**: 1. 赋予脚本执行权限: ```bash sudo chmod +x /path/to/your_script.sh ``` 2. 编辑`rc.local`: ```bash sudo vim /etc/rc.local ``` 3. 在`exit 0`前添加(自动root运行): ```bash /path/to/your_script.sh & ``` 4. 启用服务(部分系统需手动): ```bash sudo systemctl enable rc-local.service # 激活rc.local(参考引用[^2][^3]) ``` **注意**:若`/etc/rc.local`不存在,需创建并赋予可执行权限(`chmod +x`) ### 🔐 权限关键点 1. **脚本所有权**:确保脚本属于root ```bash sudo chown root:root /path/to/your_script.sh ``` 2. **敏感操作**:避免在脚本中硬编码密码,建议使用`sudoers`授权特定命令 3. **环境变量**:在脚本中显式声明路径(如`/usr/sbin:/sbin`),避免开机PATH缺失(参考引用[^4]) ### ⚠️ 常见问题解决 - **启动顺序问题**:若依赖网络/数据库,在`systemd`中添加`After=network.target mysql.service` - **日志调试**: ```bash ExecStart=/bin/bash -c "/path/to/script.sh > /var/log/custom.log 2>&1" ``` - **国产系统适配**:麒麟/UOS默认支持`systemd`,若遇兼容问题可检查`/etc/init.d/`目录的SysVinit脚本 > 示例脚本头需声明解释器:`#!/bin/bash` > 完整systemd教程见:[systemd.service中文手册](https://www.freedesktop.org/software/systemd/man/systemd.service.html) [^1] --- ### 📚 相关问题 1. 如何在systemd服务中限制脚本的内存/CPU使用? 2. 开机自启脚本执行失败如何查看日志? 3. 国产系统如何实现非root用户的开机自启服务? 4. `systemd`与`rc.local`的优缺点对比及适用场景?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值