问题场景
在Slurm中,作业是可以在计算节点与控制节点同时提交的。对于非root用户提交的作业,可以使用一些命令,比如说scancel
是可以成功的,但是scontrol update
之类的命令会出现问题,即使把普通用户加到/etc/sudoers
,加上sudo
命令也会出现问题(离谱的是,第一遍不会出错,第二遍就出错)。
现在的问题场景就是,不允许使用root用户,但是Slurm支持的好多操作比如sacctmgr
都得在root下,允许将普通用户加到/etc/sudoers
文件中(虽然很怪,但只能这么办),使用普通用户来完成所有slurm操作。
解决过程
根据已有的经验,普通Linux用户要想使用root权限,可以将用户名放到/etc/sudoers
文件中,但是会出现上面的问题,看到/etc/sudoers
里有关于下图描述的:
就尝试在配置文件添加Defaults env_keep += "HOME"
与%jinlu ALL=(ALL) ALL
,然后再次尝试普通用户操作敏感命令 - 失败
后来使用sudo -s + 需要执行的敏感命令
,竟然成功了,我使用root用户提交了一个作业,然后使用一个普通用户(当然这个用户放到了/etc/sudoers里面了),执行修改作业运行时间、取消作业的命令,结果都成功了!!!
有必要重温sudo与su了
经过前面的问题,发现对于sudo以及su理解不是很深刻,印象中就知道sudo是使用管理员权限,su是切换用户使用的,没了。今天才发现不一样,值得探讨探讨。
sudo (superuser do),以超级用户名义执行命令。当前用户必须在sudo对应用户组中,redhat和centos中是wheel用户组,Ubuntu和Debian是sudo用户组。sudo su命令通过输入当前用户的密码,切换至root用户。su命令也可以切换至root用户,但需要root用户密码,这样会带来root用户密码暴露的问题。所以sudo su的使用场景之一就是避免root用户密码暴露,另外一个场景是审计,sudo执行的操作都会被记录下来。su如果后面什么用户都不跟,默认省缺是root。一个用户能否使用 sudo 命令,取决于 /etc/sudoers 文件的设置。
sudo -s简单来说就是指定目标shell。可以显示指定,也可以是SHELL环境变量指定的shell。
sudo bash以root用户打开一个bash命令行。sudo无法执行内置命令,通过这种方式可以解决这个问题。不但如此,任意命令都可以执行,所以管理员应该谨慎将shell给sudo成员。
su意思是switch user表示切换用户
su <user_name> 或
su - <user_name>
- 如果加入了 - 参数,那么是一种 login-shell 的方式,意思是说切换到另一个用户 <user_name> 之后,当前的 shell 会加载 <user_name> 对应的环境变量和各种设置;
- 如果没有加入 - 参数,那么是一种 non-login-shell 的方式,意思是说我现在切换到了 <user_name>,但是当前的 shell 还是加载切换之前的那个用户的环境变量以及各种设置。
前面的方法中,是先切换到另一个用户(root 或者别的用户),在哪个用户的状态下执行命令,最后输入 exit 返回当前用户。
还有一种方式是:不需要先切换用户再执行命令,可以直接在当前用户下,以另一个用户的方式执行命令,执行结束后就返回当前用户。这就得用到 -c 参数。
su - -c "你要执行的命令"
su - -c "scancel 2153" # 获取root权限执行取消作业之后,返回到当前用户
sudo 与su 区别
- 使用 su - ,提供 root 账户的密码,可以切换到 root 用户;
- 使用 sudo su - ,提供当前用户的密码,也可以切换到 root 用户