su命令和sudo及runuser命令
sudo、su和su -的区别
https://linux.cn/article-8404-1.html
su
参数 | 解释 |
---|---|
-m,-p | 执行su时不会改变环境变量 |
-s | 指定要执行的shell(bash csh tcsh 等) |
-c | 变更账号为USER的使用者并在执行完command后变为原使用者 |
-f | 不需要读启动档,仅用于 csh 或 tcsh |
su
su
命令在切换用户时,仅切换root用户身份,但shell环境
仍为普通用户
;
root
切换普通用户
不需要密码;
普通用户
切换用户
是需要输入密码的
# 切换用户,但保留当前用户的变量信息
su 用户名
su -
su -
su –
命令在切换用户时,用户身份和shell环境
都会切换为root
用户;
su -
表示完全变更
,不保留
原用户的任何原始属性
;
是完全切换到新用户,包括环境变量
也是变更
的.
# 完全切换用户
su - 用户名
sudo
sudo
命令可以允许普通用户执行
管理员账户才能执行的命令
。
su
命令有一个致命的问题:一定要输入密码
,这时候用sudo
命令;
如果其他同事用su
命令切换你的账户,你必须得把密码告诉他
,他才能切换成功;
如果即想其他用户完成这个工作,又不想要他完全变更到你的账号身份下,这时候用sudo
命令可以解决这个问题.
sudo
可以精确的控制其他用户可以提权
到某个命令
进行放行;
sudo
是个服务,需要编辑配置文件/etc/sudoers
;
或者使用visduo
命令进行配置sudo
服务.
参数 | 解释 |
---|---|
-h | 显示版本号以及指令的使用说明 |
-k | 使使用者在下次执行sudo时询问密码 |
-l | 显示使用者的权限 |
-L | 显示sudos设置 |
sudo -s
参考: https://www.v2ex.com/t/885106#reply3
sudo -s
不会执行 profile
;会执行 rc
.
sudo -i
-i 参数(即 sudo -i ),在 sudo 的 man page 里指明了,会加载 .profile
,.bash_profile
或 .login
,root变量
将被shell
读取 , 同时呢,会跳到 /root
目录。
sudo -u以指定用户运行命令
sudo -u 用户名 要执行的命令
sudo -l验证 SUDOERS 组成员
# 验证 SUDOERS 组成员
sudo -l -U 用户名
runuser命令
用法:
runuser [选项] -u <USER> COMMAND
runuser [选项] [-] [USER [参数]...]
以有效 <USER> 用户 id 和组 id 运行 COMMAND 命令。如果未给出 -u,
将退而使用与 su(1) 兼容的语法并执行 shell。
-l、-c、-f、-s 与 -u 相互排斥。
选项:
-u, --user <用户> 用户名
-m, -p, --preserve-environment 不重置环境变量
-g, --group <组> 指定主组
-G, --supp-group <组> 指定一个辅助组
-, -l, --login 使 shell 成为登录 shell
-c, --command <命令> 使用 -c 向 shell 传递一条命令
--session-command <命令> 使用 -c 向 shell 传递一条命令
而不创建新会话
-f, --fast 向shell 传递 -f 选项(csh 或 tcsh)
-s, --shell <shell> 若 /etc/shells 允许,则运行 shell
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
以指定用户运行某个命令
# root用户下指定admin执行命令
# runuser -l 指定用户 -c '要执行的命令'
## -l 指定用户
## -c 要执行的命令
runuser -l admin -c 'id'
# 示例:
sudo runuser -l USER1 --group=GROUP1 -c "cd WD && ENVFILE_CONTENTS ENV COMMAND"
配置visudo
https://blog.51cto.com/chenfage/1830424
在大约99行
添加配置信息
第一段
表示允许提权的用户
第二段
ALL=(ALL) 这里第一个ALL
可以指定主机来源,参数有localhost
和IP地址
,ALL
第三段
允许放行的命令(绝对路径),多个命令可以用逗号(,)隔开
例如:
# 允许lisi用户通过sudo 执行poweroff命令
## 没有NOPASSWD:表示要输入密码
lisi ALL=(ALL) /usr/sbin/poweroff
# 允许bai用户执行iptables命令
## NOPASSWD:/usr/sbin/iptables表示执行iptables不需要输入密码
bai ALL=(ALL) NOPASSWD:/usr/sbin/iptables
代授权的用户或组 | 来源机器= (授权角色) | 是否免密码:可以执行的命令 |
---|---|---|
lisi | ALL= (ALL) | /usr/sbin/poweroff |
bai | ALL= (ALL) | NOPASSWD:/usr/sbin/iptables |
仅允许字符终端登陆(tty)–授权localhost
非ssh可执行的命令
# 用户名 本地登陆用localhost=命令绝对路径
## 没有NOPASSWD:表示要输入密码
## user1用户允许localhost登录,能通过sudo 运行yum命令,需要输入密码
user1 localhost=/usr/bin/yum
代授权的用户或组 | 来源机器= | (授权角色) | 可以执行的命令 | 免密码 |
---|---|---|---|---|
zhangsan | localhost= | /usr/bin/yum |
允许图形和tty登陆–授权all
ssh和localhost登录都可以执行
# 用户名 要执行的命令 免密码
## user1用户允许本地和ssh登录,能通过sudo允许yum命令不需要输入密码
user1 ALL=/usr/bin/yum NOPASSWD:ALL
代授权的用户或组 | 来源机器= | (授权角色) | 可以执行的命令 | 免密码 |
---|---|---|---|---|
user1 | ALL= | /usr/bin/yum | NOPASSWD:ALL |
用户组提权-示例配置
用户组提权配置只需要在用户组前加上%
# %组名 ALL=(主机来源) 命令绝对路径
%gourp ALL=(ALL) /usr/bin/yum
%组名 | 来源机器= | (授权角色) | 可以执行的命令 | 免密码 |
---|---|---|---|---|
%sudo | ALL= | (ALL) | /usr/bin/yum | NOPASSWD:ALL |
在sudoers.d
目录下创建授权文件–推荐
sudoers.d目录下文件权限一定要
0440
# sudoers.d目录下文件设为0440
chmod 0440 /etc/sudoers.d/*
示例:
# 创建hadoop用户
## -d 指定用户登入时的起始目录
## -m 自动创建用户的登入目录
sudo useradd -d /home/hadoop -m hadoop
# 配置hadoop用户的权限
echo "hadoop ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/hadoop
# 配置hadoop的sudo配置文件权限
sudo chmod 0440 /etc/sudoers.d/hadoop
代授权的用户或组 | 来源机器= (授权角色) | 免密码:可以执行的命令 |
---|---|---|
hadoop | ALL = (root) | NOPASSWD: ALL |
五段式配置
# 给devops创建授权文件,设置文件权限0400
cd /etc/sudoers.d && touch devops && chmod 0440 devops && vim devops
# 将配置文件添加到devops文件中,当执行sudo updatedb命令时免密码
devops ALL=(ALL) NOPASSWD:/usr/bin/updatedb
代授权的用户或组 | 来源机器= | (授权角色) | 可以执行的命令 | 免密码 |
---|---|---|---|---|
devops | ALL= | (ALL) | /usr/bin/updatedb | NOPASSWD: /usr/bin/updatedb |
第一段
: 表示允许提权的用户,%sudo
代表sudo组
第二段
: ALL=(ALL) 这里第一个ALL
可以指定主机来源,参数有localhost
和IP地址
,ALL
第三段
:表示sudo可以切换到什么用户。ALL
表示所有用户
第四段
:表示sudo可以切换到哪些组下的用户。ALL
表示所有组
第五段
:表示sudo之后能够执行的命令(绝对路径
)。NOPASSWD:ALL
表示执行任意命令都不需要密码
代授权的用户或组 | 来源机器= | (授权角色) | 可以执行的命令 | 免密码 |
---|---|---|---|---|
devops | ALL= | (ALL) | NOPASSWD: ALL |
三段式配置
第一段
: 表示允许提权的用户,%sudo
代表sudo组
第二段
: ALL=(ALL) 这里第一个ALL
可以指定主机来源,参数有localhost
和IP地址
,ALL
第三段
: 允许放行的命令(绝对路径
),多个命令可以用逗号(,)隔开
# 允许执行所有sudo命令不需要输入密码
devuser ALL=(ALL) NOPASSWD:ALL
代授权的用户或组 | 来源机器= (授权角色) | 免密码:可以执行的命令 |
---|---|---|
devops | ALL= (ALL) | NOPASSWD: ALL |
检查sudoers配置是否有误
https://www.linuxcool.com/visudo
# 检查文件格式是否有误
visudo -c /etc/sudoers.d/devops
# 严格检查sudoers文件
visudo -s
如何在sudo运行的命令中
防止使用参数
参考: https://linux.cn/article-15106-1.html
visudo
以root
用户身份编辑/etc/sudoers
文件.
命令行后添加 ""防止使用参数
# 命令行后添加 ""防止使用参数
user1 ALL=(root) /usr/bin/ls ""
# 用户设为ALL命令行后添加 ""防止使用参数
ALL ALL=(root) /usr/bin/ls ""
代授权的用户或组 | 来源机器= (授权角色) | 免密码:可以执行的命令 |
---|---|---|
user1 | ALL = (root) | /usr/bin/ls “” |