sudo -u username command与sudo -i -u username后执行command的差异及适用场景咨询
sudo -u username command与sudo -i -u username后执行command的差异及适用场景咨询
嘿,这个问题问得挺到位的,我之前也琢磨过这俩命令的区别,给你掰扯清楚哈~
先拆解每个命令的参数含义
先把两个命令的参数逐个拆解开,理解了参数就更容易搞懂差异:
sudo -u username command
-u username:核心作用是指定后续命令的执行用户身份,简单说就是让后面的command以username的权限跑起来。- 执行时,大部分环境变量还是你当前用户的(比如
PATH、PWD),只有少数和用户身份强绑定的变量会切换成目标用户的(比如USER、HOME),而且不会加载目标用户的shell配置文件(比如.bashrc、.profile)。
sudo -i -u username
-i(全称--login):这个参数会让sudo模拟目标用户的完整登录会话,效果和你执行su - username切换用户几乎一模一样。- 配合
-u username使用时,会自动完成这些操作:- 把工作目录切换到目标用户的家目录(比如
/home/username) - 完全替换成目标用户的登录环境变量(继承目标用户登录时的所有环境配置)
- 加载目标用户的所有登录相关配置文件(包括
.bash_profile、.bashrc里的别名、自定义函数都会生效) - 开启一个交互式shell会话,你可以在里面输入多个命令,直到输入
exit才会回到原来的用户身份。
- 把工作目录切换到目标用户的家目录(比如
核心差异对比
直接列点对比更直观:
- 环境变量:
sudo -u ...:保留当前用户的大部分环境,仅切换必要的身份相关变量sudo -i -u ...:完全使用目标用户的登录环境,和直接登录目标用户的状态完全一致
- 工作目录:
sudo -u ...:在你当前的工作目录执行命令sudo -i -u ...:自动切换到目标用户的家目录
- 配置文件加载:
sudo -u ...:不加载目标用户的shell配置sudo -i -u ...:加载目标用户的所有登录配置(别名、自定义脚本都会生效)
- 会话模式:
sudo -u ...:单次命令执行,执行完立刻回到当前用户sudo -i -u ...:开启交互式会话,需要手动输入exit才能退出
适用场景推荐
优先用sudo -u username command的情况
- 只需要执行单个命令,不需要目标用户的完整环境:比如给网站用户
www-data创建一个文件,直接sudo -u www-data touch /var/www/html/new_file.txt就搞定,不用切换环境。 - 想避免目标用户的配置干扰命令执行:比如目标用户的
.bashrc里有自定义的PATH或者别名,你不想让这些影响当前命令的运行,就用这个方式。 - 要保持当前工作目录不变:比如你正在自己的项目目录下,需要以目标用户身份修改当前目录里的某个文件,不用切换到家目录再操作。
优先用sudo -i -u username的情况
- 需要执行多个连续命令,且依赖目标用户的环境:比如要在目标用户的环境下编译代码、安装依赖,或者运行只有目标用户环境才有的程序,这时候开启完整会话更方便。
- 需要模拟目标用户的登录状态:比如测试目标用户的登录配置是否正常,或者排查目标用户环境变量相关的问题,用这个方式就能完全复现目标用户登录后的状态。
- 需要使用目标用户的别名、自定义脚本:比如目标用户定义了很多方便的shell别名,你想在操作时用上,就需要加载他们的配置文件,这时候
-i就很有用。
备注:内容来源于stack exchange,提问作者joyoy




