Linux下以其他⽤户⾝份运⾏程序——su、sudo、runuser
本⽂综合分析了Linux系统下,如何使⽤runuser命令、su命令和sudo命令以其他⽤户⾝份来运⾏程序,以及这三个命令的运⾏效率⽐较。
⼀、su 命令临时切换⽤户⾝份
SU:( Switch user切换⽤户),可让⼀个普通⽤户切换为超级⽤户或其他⽤户,并可临时拥有所切换⽤户的权限,切换时需输⼊欲切换⽤户的密码;也可以让超级⽤户切换为普通⽤户,临时以低权限⾝份处理事务,切换时⽆需输⼊欲切换⽤户的密码。
zai Linux 系统中,有时候普通⽤户有些事情是不能做的,除⾮是 root ⽤户才能做到。这时就需要⽤ su 命令临时切换到 root ⾝份来做事了。
1、su 的语法
su [OPTION选项参数] [⽤户]
-, -l, –login
linux执行shell命令
切换⽤户时,使环境变量(home,shell,user,logname,path等)和欲切换的⽤户相同、不使⽤则取得⽤户的临时权限,不加载环境变量。⽤su命令切换⽤户后,可以⽤ exit 命令或快捷键[Ctrl+D]可返回原登录⽤户;
-c, –command=COMMAND
使⽤ -c 传递单个命令到 shell 中,执⾏命令后,就恢复原来的⽤户⾝份,退出所切换到的⽤户环境;
–session-command=COMMAND
使⽤ -c 传递单个命令到 shell 中,并且不创建新的会话;
-f, –fast
通过 -f 参数到 shell (针对 csh 或 tcsh);
-m, –preserve-environment
不重置环境变量;
-s, –shell=SHELL
指定执⾏命令的shell;
–help
显⽰帮助信息;
–version
显⽰版本信息;
2、su 的范例:
1 2 3 4 5su-
su- root
su- root -c "ls -l /root"
su- oracle -c "ulimit -aHS"
su-s /bin/sh-c "/usr/local/nginx/sbin/nginx"
3、su 的优缺点
su 的确为管理带来⽅便,通过切换到 root 下,能完成所有系统管理⼯具,只要把 root 的密码交给任何⼀个普通⽤户,他都能切换到root 来完成所有的系统管理⼯作。但通过 su 切换到 root 后,也有不安全因素;⽐如系统有10个⽤户,⽽且都参与管理。如果这10个⽤户都涉及到超级权限的运⽤,做为管理员如果想让其它⽤户通过 su 来切换到超级权限的 root,必须把 root 权限密码都告诉这10个⽤户。如果这10个⽤户都有 root 权限,通过 root 权限可、以做任何事,这在⼀定程度上就对系统的安全造成了威协,想想 Windows 吧,简直就是恶梦。
“没有不安全的系统,只有不安全的⼈”,我们绝对不能保证这10个⽤户都能按正常操作流程来管理系统,其中任何⼀⼈对系统操作的重⼤失误,都可能导致系统崩溃或数据损失,所以 su ⼯具在多⼈参与的系统管理中,并不是最好的选择,su 只适⽤于⼀两个⼈参与管理的系统,毕竟 su 并不能让普通⽤户受限的使⽤;超级⽤户 root 密码应该掌握在少数⽤户⼿中,这绝对是真理!所以集权⽽治的存在还
是有⼀定道理的。
⼆、sudo 命令
1、sudo 的适⽤条件
由于su 对切换到超级权限⽤户 root 后,权限的⽆限制性,所以 su 并不能担任多个管理员所管理的系统。如果⽤ su 来切换到超级⽤户来管理系统,也不能明确哪些⼯作是由哪个管理员进⾏的操作。特别是对于服务器的管理有多⼈参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使⽤哪些⼯具来完成与其相关的⼯作,这时我们就有必要⽤到 sudo。通过 sudo,我们能把某些超级权限有针对性的下放,并且不需要普通⽤户知道 root 密码,所以 sudo 相对于权限⽆限制性的 su 来说,还是⽐较安全的,所以 sudo 也能被称为受限制的 su。另外 sudo 是需要授权许可的,所以也被称为授权许可的 su。
sudo 执⾏命令的流程是当前⽤户切换到root(或其它指定切换到的⽤户),然后以root(或其它指定的切换到的⽤户)⾝份执⾏命令,执⾏完成后,直接退回到当前⽤户,⽽这些的前提是要通过sudo的配置⽂件/etc/sudoers来进⾏授权。默认只有 root ⽤户能使⽤ sudo 命令,普通⽤户想要使⽤ sudo,是需要 root 预先设定的,默认 root 能够 sudo 是因为这个⽂件中有⼀⾏”root ALL=(ALL) ALL”。
2、sudo 配置⽂件
我们可以⽤他的专⽤编辑⼯具 visodu ,此⼯具的好处是在添加规则不太准确时,保存退出时会提⽰给我们错误信息;配置好后,可以⽤切换到您授权的⽤户下,通过sudo -l 来查看哪些命令是可以执⾏或禁⽌的。
/
etc/sudoers ⽂件中每⾏算⼀个规则,前⾯带有 # 号可以当作是说明的内容,并不执⾏;如果规则很长,⼀⾏列不下时,可以⽤ \ 号来续⾏,这样看来⼀个规则也可以拥有多个⾏。
/etc/sudoers 的规则可分为两类:⼀类是别名定义,另⼀类是授权规则;别名定义并不是必须的,但授权规则是必须的。
sudo授权规则(sudoers配置):
1授权⽤户主机=命令动作
这三个要素缺⼀不可,但在动作之前也可以指定切换到特定⽤户下,在这⾥指定切换的⽤户要⽤( )号括起来,如果不需要密码直接运⾏命令的,应该加 NOPASSWD: 参数,但这些可以省略。举例说明:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)      ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)      ALL
## Same thing without a password
# %wheel        ALL=(ALL)      NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
执⾏visudo之后,可以看见缺省只有⼀条配置:
root    ALL=(ALL) ALL
那么你就在下边再加⼀条配置:
admin ALL=(ALL) ALL
这样,普通⽤户 admin 就能够执⾏ root 权限的所有命令。
让普通⽤户support只能在某⼏台服务器上,执⾏root能执⾏的某些命令,⾸先需要配置⼀些Alias,这样在下⾯配置权限时,会⽅便⼀些,不⽤写⼤段⼤段的配置。Alias主要分成4种:
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias
配置Host_Alias:就是主机的列表
Host_Alias      HOST_FLAG = hostname1, hostname2, hostname3
配置Cmnd_Alias:就是允许执⾏的命令的列表,命令前加上 ! 表⽰不能执⾏此命令。命令⼀定要使⽤绝对路径,避免其他⽬录的同名命令被执⾏,造成安全隐患 ,因此使⽤的时候也是使⽤绝对路径!
Cmnd_Alias      COMMAND_FLAG = command1, command2, command3 ,!command4
配置User_Alias:就是具有sudo权限的⽤户的列表
User_Alias USER_FLAG = user1, user2, user3
配置Runas_Alias:就是⽤户以什么⾝份执⾏(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
Host_Alias      EPG = 192.168.1.1, 192.168.1.2
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of
Cmnd_Alias      SQUID = /opt/vtbin/squid_refresh, !/sbin/service, /bin/rm
Cmnd_Alias      ADMPW = /usr/bin/passwd[A-Za-z]*, !/usr/bin/passwd, !/usr/bin/passwd root ## Allow root to run any commands anywhere
root    ALL=(ALL)      ALL
admin EPG=(ALL) NOPASSWD: SQUID
admin EPG=(ALL) NOPASSWD: ADMPW
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)      ALL
## Same thing without a password
# %wheel        ALL=(ALL)      NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
当然新⽤户的配置也可以放到,/etc/sudoers.d/ 下的⽂件⾥,也会⽣效,修改也⽅便。
3、sudo 语法
sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command
1 2 3 4 5 6 7 8-V      显⽰版本编号
-h      会显⽰版本编号及指令的使⽤⽅式说明
-l      显⽰出⾃⼰(执⾏ sudo 的使⽤者)的权限
-v      因为 sudo 在第⼀次执⾏时或是在 N 分钟内没有执⾏(N 预设为五)会问密码,这个参数是重新做⼀次确认,如果超过 N 分钟,也会问密码-k      将会强迫使⽤者在下⼀次执⾏ sudo 时问密码(不论有没有超过 N 分钟)
-b      将要执⾏的指令放在背景执⾏
-p      prompt 可以更改问密码的提⽰语,其中 %u 会代换为使⽤者的帐号名称, %h 会显⽰主机名称
-u      username/#uid 不加此参数,代表要以 root 的⾝份执⾏指令,⽽加了此参数,可以以 username 的⾝份执⾏指令(#uid 为该 username 的使⽤者号码)
9 10 11-s      执⾏环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd ⾥所指定的 shell
-H      将环境变数中的 HOME (家⽬录)指定为要变更⾝份的使⽤者家⽬录(如不加 -u 参数就是系统管理者 root )command  要以系统管理者⾝份(或以 -u 更改为其他⼈)执⾏的指令
三、runuser 命令
runuser命令使⽤⼀个替代的⽤户或者组ID运⾏⼀个Shell。这个命令仅在root⽤户时有⽤。
仅以会话PAM钩⼦运⾏,并且没有密码提⽰。如果⽤⼀个⾮root⽤户,并且该⽤户没有权限设置user ID,这个命令将会因为程序没有setuid⽽失败。因runuser不会运⾏认证和账户PAM钩⼦,它⽐su更底层。
1、runuser 语法
语法与 su 命令基本⼀样:
-, -l, –login
让shell成为登录shell,⽤ runuser -l PAM ⽂件替代默认的;
-g –group=group
指定主要的组;
-G –supp-group=group
指定追加组
-c, –command=COMMAND
使⽤ -c 传递单个命令到 shell 中,执⾏命令后,就退出到 root;
–session-command=COMMAND
通过⼀个单⼀的命令⽤ -c 参数到 shell ,不创建⼀个新的会话;
-f, –fast
通过 -f 参数到 shell (针对 csh 或 tcsh);
-m, –preserve-environment
不重置环境变量;
-p    same as -m
-s, –shell=SHELL
指定执⾏命令的shell;
2、runuser 样例
1 2 3runuser -l userNameHere -c '/path/to/command arg1 arg2' runuser -l oracle -c 'ulimit -SHa'
runuser -s /bin/sh-c "/usr/local/nginx/sbin/nginx"
有时,root⽤户由于权限(安全)问题不能浏览NFS挂载的共享:
1ls-l /nfs/wwwroot/http
1cd/nfs/wwwroot/http
可能的输出:
1-bash: cd: /nfs/wwwroot/http/: Permission denied
尽管如此,apache⽤户被允许浏览或访问挂载在/nfs/wwwroot/http/下基于nfs的系统:1runuser -l apache -c 'ls -l /nfs/wwwroot/http/'
1runuser -l apache -c 'cd /nfs/wwwroot/http/; vi index.php'
使⽤runuser命令,⽆需使⽤密码,并且,只能在root⽤户下使⽤。
四、总结:su VS su VS dorunuser
命令
root
到⽤户
⽤户
到 root
任意⽤
户到
任意⽤
认证
⽅式
⽇志⽂件备注
runuser Y N N⽆⽆因 runuser 不会运⾏认证和账户 PAM 钩
⼦,它⽐ su 更底层。
su Y Y Y ⽬标
⽤户
的密
/
var/log/auth.log
/var/log/secure
你必须与其它⽤户分享你的密码或 root 密
码。
sudo Y Y Y 认证
⽤户
使⽤
他们
⾃⼰
的密
码,
⽽不
是⽬
标⽤
户。
/var/log/auth.log
/var/log/secure
允许系统管理员委托授权给⼀个特定的⽤
户(或⽤户组),让其在提供审计跟踪命
令后可以以 root 或其它⽤户运⾏某些(或
全部)命令。
su 与 runuser 都可以⽤来写系统⾃启动脚本,如 Tomcat 服务使⽤系统⽤户启动的⾃启动脚本。什么时候使⽤哪种命令,根据使⽤场景⾃⼰来决定吧。