答案是使用sudo -u或su -c命令。sudo -u通过sudoers配置授权执行,无需目标用户密码,适合权限控制和自动化;su -c需目标用户密码,模拟完整登录环境,适合临时切换和交互操作。选择依据是权限管理需求与环境模拟要求。

在Linux系统中,要以另一个用户的身份执行指定命令,最常见且直接的方法主要有两种:使用
sudo -u
su -c
当我们需要以不同于当前用户的身份执行命令时,这背后往往隐藏着权限管理、环境隔离或安全性考量。
1. 使用 sudo -u <目标用户名> <命令>
这是我个人在日常运维和开发中用得最多的一种方式,尤其是在需要以服务账户(如
www-data
nginx
sudo
例如,如果你想以
testuser
ls -l /home/testuser
sudo -u testuser ls -l /home/testuser
当你执行这个命令时,系统会要求你输入当前用户的密码(如果
sudo
testuser
/etc/sudoers
testuser
ls
2. 使用 su - <目标用户名> -c "<命令>"
su
-c
例如,以
testuser
ls -l /home/testuser
su - testuser -c "ls -l /home/testuser"
这里需要注意的是,执行此命令后,系统会要求你输入
testuser
root
su -
testuser
testuser

这其实是个很实际的问题,我在工作中就遇到过不少这样的场景。说白了,就是出于以下几个核心目的:
www-data
nginx
root
www-data
root
PATH
.bashrc
.profile

sudo -u
su -c
这两种方式虽然都能达到目的,但其背后的机制和适用场景却大相径庭。理解它们之间的差异,能帮助你做出更明智的选择。
核心差异点:
认证机制:
sudo -u
sudoers
sudo
sudoers
root
su -c
testuser
testuser
root
su
环境变量与环境:
sudo -u
sudo
sudoers
PATH
HOME
USER
sudo -i -u <目标用户名>
su -c
su - <目标用户名> -c
-
.bashrc
.profile
HOME
权限粒度:
sudo -u
/etc/sudoers
devuser
www-data
apache
su -c
root
我该选哪个?
选择 sudo -u
root
sudoers
www-data
mysql
sudo -u
选择 su -c
root
su - <目标用户名>
su -c

如果你需要以另一个用户的身份执行一系列命令,或者需要一个交互式的shell环境,仅仅使用
-c
1. 获取一个交互式Shell:
这是最直接的方式,让你仿佛真的登录到了目标用户账户。
使用 sudo -i -u <目标用户名>
-i
--login
.bashrc
.profile
sudo -i -u testuser # 此时你已经切换到testuser,可以执行任意命令 pwd whoami ls -l exit # 退出testuser的shell,返回到原来的用户
这种方式非常适合需要在一个“干净”的目标用户环境中进行多步操作的场景。
使用 su - <目标用户名>
sudo -i -u
su
root
su - testuser # 输入testuser的密码 # 此时你已经切换到testuser,可以执行任意命令 pwd whoami ls -l exit # 退出testuser的shell,返回到原来的用户
我个人在知道目标用户密码的情况下,或者作为
root
su -
2. 在单个命令中执行多个命令(脚本化):
如果你不想进入交互式shell,但又需要以特定用户身份执行一系列命令,可以把这些命令组合起来。
使用 sudo -u <目标用户名> bash -c "命令1; 命令2; 命令3"
bash -c
sh -c
bash -c
sudo -u testuser bash -c "cd /home/testuser/project; git pull; make build"
这种方式的好处是,所有命令都在一个子shell中按顺序执行,并且都以
testuser
结合Here Document (<<EOF
su
sudo
sudo -u testuser bash << EOF # 这里是testuser要执行的一系列命令 echo "Current user is $(whoami)" cd /home/testuser/data ls -l mkdir new_dir_by_script EOF
或者使用
su
su - testuser << EOF # 输入testuser的密码 echo "Current user is $(whoami)" cd /home/testuser/data ls -l EOF
这种方法在编写自动化脚本时非常方便,可以将复杂的逻辑封装在一个块中,清晰明了。
选择哪种方式,取决于你的具体需求:是需要一个临时的、完全独立的用户环境来交互,还是仅仅需要以特定用户身份运行一个预定义的命令序列。在实际工作中,灵活运用这些方法,能大大提高工作效率和系统的安全性。
以上就是Linux怎么切换用户执行指定命令的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号