su root,su -, su - root的区别
前提:
su:切换用户;如果不指定用户,默认切到 root-(也可以写成-l / --login):代表 登录式切换
1. su root或直接写su
su root
- 只切换 UID/GID ,但是:保留原来用户的环境变量、PATH、当前工作目录
- 不会加载 root 的
~/.bashrc / .bash_profile - 提示符、环境还是上一个用户那套,很容易踩环境变量坑
- 需要输入:root 的密码
示例:你是 weihuopr,su root,pwd 还在 /home/weihuopr
2. su -
等价:su - root
su -
-= login shell- 切换身份 + 清空原有环境,加载目标用户完整登录环境
- 切到 root 的家目录
/root,加载/root/.bash_profile、.bashrc - 需要输入:root 的密码
- 日常运维标准写法
3. su - root
和 su - 效果完全一样 ,只是显式写出目标用户 root;如果要切别的用户,就写 su - nginx
极简对比表
| 命令 | 是否登录 shell | 当前目录 | 环境变量 | 密码 |
|---|---|---|---|---|
su root |
❌ | 不变(保留原来目录) | 继承原用户 | root 密码 |
su - |
✅ | 跳到 /root |
root 完整登录环境 | root 密码 |
su - root |
✅ | 跳到 /root |
root 完整登录环境 | root 密码 |

ansible -u weihuopr 10.243.230.136 -m shell -a 'fdisk -l' -k -K -S
第一个k: weihuopr这个用户的登录密码
第二个K: 后面是-S,表示su,输入root密码
-K要输入什么密码,完全由提权方式(这里就是-S/--become-method)决定:
- 如果是
-s(--sudo):-K要输入 weihuopr 的sudo密码- 如果是
-S(--su):-K要输入目标用户(默认 root)的密码
第三个-S :旧参数,走 su 方式,同样废弃,改用 become
- 底层:
su root -c "cmd" - 校验:目标用户(默认 root)的密码
原来
-S=--su,等价于--become-method=su
改成 -b 体系有两种写法:
① 保持原来行为(还是 su root,要 root 密码)
ansible -u weihuopr 10.243.230.136 -m shell -a 'fdisk -l' -k -K -b --become-method=su
-k:输入weihuopr的 SSH 登录密码-K:输入 root 的密码 (和之前-S的效果一模一样)
② 默认 become(默认是sudo,最常用)
如果换成 sudo 方式(不再是 su):
ansible -u weihuopr 10.243.230.136 -m shell -a 'fdisk -l' -k -K -b
-k:输入weihuopr的 SSH 密码-K:输入 weihuopr sudo密码- 如果这台机器配置了 sudo NOPASSWD,直接去掉
-K
对照速记
-b只是开启提权开关;真正决定是 sudo /su,靠--become-method
-b****:打开提权
- 如果不写
--become-method→sudo- 如果不写
--become-user→root- -b 后面啥也不写的话,等价于:--become-method=sudo --become-user=root

格式规则:node01是别名,别名后面不能直接裸写 IP;IP 必须放在
ansible_host=后面。
你现在第 2 行:
# ❌ 错
node02 192.168.31.129 ansible_password="flyfly123"
Ansible 把 192.168.31.129 当成一个变量名,它不认,直接解析失败。
改成:
# ✅ 正确
[web]
node02 ansible_host=192.168.31.129 ansible_password="flyfly123"
node01 ansible_host=192.168.31.128 ansible_user=fengliyang ansible_password="123456"
几种写法:
1.ip在hosts文件配置过


如果ansible.cfg指定了用户,可以改成

如果不写-u, 默认使用ansible.cfg里指定的remote_user
这时候默认是查询user2用户的whoami
2**.ip没在hosts文件配置**
