代码改变世界

Linux中以其它用户身份执行脚本或命令总结

2025-12-19 08:30  潇湘隐者  阅读(11)  评论(0)    收藏  举报

在Linux中以其他用户身份执行命令或脚本是一个常见的需求,最近工作中碰到了这个需求,在这里简单总结一下.假如我们在root用户下想以其它用户(例如oracle,mysql)身份执行一些脚本或命令,那么有哪一些方法呢?

su命令(switch user)

su命令的使用方式有两种, 如下所示:

  1. 切换用户只执行一条命令的可以用:
su - oracle -c shell_command

-c "<命令>": -c 参数告诉 su执行完后面的命令后就退出,而不是启动一个新的交互式shell。

  1. 切换用户执行一个shell脚本
su - oracle -s /bin/bash oracle_start.sh

需要注意的是, 这里使用su切换用户有两种方式,即带"-"与不带"-"的方式, 如下所示:

su oracle -c <shell_command>
或
su - oracle -c <shell_command>

两者的区别

su <用户名> (不带横杠)

这是非登录式切换。

  • 行为:它会切换当前的用户身份(UID 和 GID),但不会改变当前的shell环境。
  • 环境变量:大部分环境变量(如 PATH, HOME, USER, PS1 等)仍然保持为切换之前的用户的环境变量。
  • 工作目录:当前的工作目录(PWD)也不会改变。
  • 本质:你只是 “穿上了另一个用户的马甲”,但所处的 “房间”(环境)还是原来的。

适用场景:当你需要临时以另一个用户身份执行一个或几个命令,并且希望利用当前的环境(比如当前目录、已经设置好的变量)时。
缺点: 如果是非root用户,需要知道目标用户的密码. 不适合自动化脚本.

su - <用户名> (带横杠)

这是登录式切换。

  • 行为:它会模拟一个完整的、全新的用户登录流程。
  • 环境变量:它会加载目标用户(例如oracle)的所有环境变量配置文件(如 /etc/profile, ~/.bash_profile, ~/.bashrc 等),并使用这些变量来构建一个全新的环境。
  • 工作目录:工作目录会自动切换到目标用户的主目录(/home/oracle)。
  • 本质:你完全"进入了另一个用户的房间",使用的是它的所有配置和环境。

适用场景:当你需要完全进入另一个用户的角色,执行一系列操作,或者运行依赖于该用户特定环境变量的脚本时。这是更常见和推荐的用法。

sudo 命令

sudo命令,它的作用是“excute a command as another user",默认为root用户,可以用 -u 指定用户名

你有目标用户的 sudo 权限,且只想临时以该用户身份运行脚本。

sudo -u <用户名> <命令或脚本>

与 su 类似,sudo 也可以用来获取一个目标用户的交互式 shell。命令格式:

sudo -u <用户名> -i
# 或者
sudo -u <用户名> -s

-i (模拟初始登录,--login):行为与 su - <用户名> 非常相似,会加载目标用户的环境变量并切换到其主目录。
-s (启动 shell, --shell):启动一个 shell,但不一定会完全加载登录环境,行为可能略有不同。通常推荐使用 -i。

不会加载目标用户的完整环境(如 .bashrc),但会加载其基本环境变量(如 $HOME)。

优点:

  • 安全性高:执行命令时验证的是执行者自己的密码,而不是目标用户的密码。
  • 权限控制精细:通过 /etc/sudoers 可以精确控制哪个用户能以哪个身份执行哪些命令。
  • 易于审计:所有 sudo 操作都会被记录在系统日志中(通常在 /var/log/auth.log 或 /var/log/secure)。

缺点:

  • 需要管理员预先配置 /etc/sudoers 文件,对于临时一次性操作可能略显繁琐。
  • 这些方式也不适合在脚本中使用.

runuser 命令

runuser 是一个相对小众但非常有用的命令,它与 su 类似,但设计初衷是让 root 用户在切换到其他用户身份时无需输入密码,并且不通过PAM(Pluggable Authentication Modules)进行认证。这使得它比su更快,并且更适合在脚本中使用。

runuser -u <用户名> -- <命令或脚本路径>

优点:

  • root 用户使用时无需密码,非常适合在自动化脚本(如 cron, systemd service)中使用。
  • 性能比 su 稍好。

缺点:

  • 功能不如 sudo 强大和灵活。
  • 通常只有 root 用户可以使用 runuser 切换到其他用户。