Shell脚本——su、sudo

本文详细介绍了Shell脚本中的su和sudo命令的使用。su命令用于临时切换到root用户,而sudo则为非root用户赋予执行特定命令的权限,以提高系统安全性。文章深入探讨了sudo的配置,包括一般用户赋权设置和多用户配置,如非同一群组和同一群组用户的不同配置方法,以及如何通过User_Alias、Cmnd_Alias、Host_Alias和Runas_Alias进行更复杂的权限设定。

· su

su命令临时切换到root用户;

su [option] [用户]

其中,

-后接用户名,表示登录并切换到用户环境;

-c后接命令,表示执行该命令再退出所切换的用户环境;


注:

su表示切换到root用户,但不改变root登录环境;

su -表示切换到root用户,并切换到root用户环境;


su命令的安全性低,使用sudo命令执行指定命令,此时输入的密码是用户自己密码,而非root用户密码;但并非所有用户都能使用sudo命令




· sudo

sudo命令为非root用户赋予一些合理的权利,执行一些只有root用户才能执行的命令,以减少root用户的登录次数和管理时间,提高系统安全性;

sudo执行命令的过程是当前用户切换到root用户,再以root用户执行命令,完成后直接退回到当前用户;

使用sudo的前提是通过sudo配置文件/etc/sudoers进行授权,可使用visudo命令编辑该配置文件;


一、一般用户赋权设置

[root@localhost ~]# visudo
... 省略 ...
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
... 省略 ...

其中,第一个字段表示能使用sudo命令的用户;第二个字段中等号左边表示允许使用sudo的主机,括号里表示使用sudo后以什么身份执行命令;第三个字段表示允许sudo执行的命令;

在"root ALL=(ALL) ALL"下一行添加"twc ALL=(root) /usr/sbin/useradd",表示允许twc用户从任何主机登录,以root身份执行useradd命令;


二、sudo深入配置

对于不同需求的用户,可按照一方法依次添加多行,每行对应一个用户;


1 多个用户的设置(非同一群组用户)

对于相同需求的用户,可使用"User_Alias UUU=user1, user2, ..."定义用户别名的方式;

[root@localhost ~]# visudo
... 省略 ...
# User_Alias ADMINS = jsmith, mikem
User_Alisa sudouser=user1,user2,user3,user4
... 省略 ...
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
sudouser   ALL=(root)    /usr/sbin/useradd
... 省略 ...


对于多个命令,可使用"Cmnd_Alias CCC=command1, command2, ..."定义命令别名的方式;

[root@localhost ~]# visudo
... 省略 ...
## Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
... 省略 ...
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
sudouser   ALL=(root)    NETWORKING
... 省略 ...


对于多个主机,可使用"Host_Alias HHH=host1, host2, ..."定义主机别名的方式;

对于多个登录用户,可使用"Runas_Alias RRR=role1, role2, ..."定义用户别名的方式;


2 多个用户的设置(同一群组用户)

使用"%GROUP_NAME"作为允许使用sudo命令的用户;

[root@localhost ~]# visudo
... 省略 ...
## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL
... 省略 ...


注:若希望不需密码验证,则在允许sudo执行的命令前接"NOPASSWORD:"

[root@localhost ~]# visudo
... 省略 ...
## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       NOPASSWORD: ALL
... 省略 ...


<think>首先,用户的问题是:“我想查找在shell本中切换到其他用户的方法 请问在shell本中使用su命令切换到其他用户的方法”。这是在询问如何在shell本中使用su命令切换到其他用户。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这个问题是关于shell本的,所以可能没有数学表达式,除非提到变量等。 - 独立公式用$$...$$,但这里可能不需要。 - LaTeX语法正确:确保如果有数学部分,正确使用LaTeX。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾,添加相关问题部分。 - 引用段落末尾添加引用标识:如[^1],但用户提供了参考站内引用,我需要整合这些。 参考站内引用: - 引用[1]: 提到在shell本中执行sudo su命令会导致卡顿,需要手动exit。 - 引用[2]: 提到使用su - username -c "command"来执行命令。 用户真正的需求是:在shell本中切换到其他用户的方法,特别是使用su命令。 我的回答结构应该清晰,帮助用户逐步解决问题。确保回答真实可靠。 回答大纲: 1. **介绍问题**:解释在shell本中切换用户的需求。 2. **常见方法**: - 使用su命令:如su - username -c "command"。 - 避免使用sudo su导致卡顿:引用[1]中提到的问题。 3. **详细步骤**: - 解释su命令的语法。 - 提供示例代码。 4. **注意事项**: - 密码问题:su命令可能需要密码,这在本中不方便。 - 使用sudo:如果用户有sudo权限,可以使用sudo -u username command。 5. **最佳实践**: - 推荐使用su -c或sudo -u以避免交互式问题。 - 提到在本中设置密码的风险。 6. **生成相关问题**:在末尾添加相关问题。 确保语言是中文。 生成相关问题: - 基于主题,如shell本、用户切换、权限管理。 最终回答格式: - 回答用户问题。 - 添加相关问题部分。 代码示例:使用shell本代码块,如示例中所示。 现在,构建回答。</think>### 在 Shell 本中使用 su 命令切换到其他用户的方法 在 Shell 本中切换到其他用户是一个常见需求,例如执行需要特定用户权限的任务(如管理文件或运行服务)。直接使用 `su` 命令可能导致本卡顿或交互式问题,因此需要采用安全高效的方法。以下我将逐步解释原理、推荐方法、注意事项,并提供实际示例。回答基于 Shell 本的最佳实践和常见问题分析[^1][^2]。 #### 1. **为什么需要切换到其他用户?** - 在 Shell 本中,当前用户可能没有权限执行某些操作(如修改系统文件或启动服务)。切换到目标用户(如 `tomcat` 或 `root`)可以避免权限错误。 - 直接使用 `su` 命令时,如果未正确处理,本会卡在交互式密码提示或会话中,需要手动退出(如 `exit`),这会导致本中断[^1]。 #### 2. **推荐方法:使用 `su - username -c "command"`** - **原理**:`su - username -c "command"` 允许在本中临时切换到目标用户执行特定命令,然后自动返回原用户。这避免了交互式会话卡顿问题。 - `su -`:切换到用户并加载其环境变量(`-` 表示完整登录)。 - `-c "command"`:指定要执行的命令,命令结束后自动退出目标用户会话。 - **优点**: - 非交互式:不会卡在密码提示或等待 `exit`。 - 安全:命令执行后立即恢复原用户上下文。 - 灵活:支持多命令组合(用 `&&` 或 `;` 连接)。 - **语法**: ```bash su - <目标用户名> -c "<要执行的命令>" ``` - 替换 `<目标用户名>` 为实际用户名(如 `tomcat` 或 `root`)。 - 替换 `<要执行的命令>` 为单条命令或命令序列。 #### 3. **实际示例** 以下是一个完整的 Shell 本示例,展示如何切换到 `tomcat` 用户执行命令,然后返回原用户: ```bash #!/bin/bash echo "当前用户: $(whoami)" # 切换到 tomcat 用户执行命令 su - tomcat -c "echo '在 tomcat 用户下执行:'; cd /home/tomcat && sh ./test.sh; echo '命令完成'" echo "已返回原用户: $(whoami)" ``` - **解释**: - 第一行:本以原用户(如 `root` 或普通用户)开始。 - `su - tomcat -c "..."`:切换到 `tomcat` 用户,执行 `echo`、`cd` 和 `sh ./test.sh` 命令,完成后自动退出。 - 最后一行:本继续以原用户执行。 - **输出效果**: - 如果原用户是 `root`,输出类似: ``` 当前用户: root 在 tomcat 用户下执行: # 这是 tomcat 用户执行的输出 命令完成 已返回原用户: root ``` #### 4. **注意事项** - **密码问题**: - `su` 命令通常需要输入目标用户密码。在本中硬编码密码(如 `su - username -c "command"` 后跟密码)是**不安全的**,可能导致安全风险。 - 替代方案:使用 `sudo` 命令(需配置 sudoers 文件),例如 `sudo -u username command`。这不需要密码(如果当前用户有 sudo 权限),更安全[^2]。 - **权限要求**: - 运行本的用户必须有权限切换到目标用户(如通过 `sudo` 或属于 `wheel` 组)。 - 如果本以非 root 用户启动,确保 `su` 命令前加 `sudo`(如 `sudo su - username -c "command"`)。 - **避免卡顿问题**: - 不要直接在本中使用 `su` 或 `sudo su` 而不加 `-c`,否则会进入交互式 shell本会卡住直到手动 `exit`[^1]。 - **环境变量**: - 使用 `su -`(带连字符)加载目标用户的环境变量(如 `~/.bashrc`),避免命令执行失败。 - **错误处理**: - 添加错误检查,例如: ```bash if ! su - tomcat -c "command"; then echo "切换用户执行失败" exit 1 fi ``` #### 5. **最佳实践总结** - **优先使用 `su - username -c "command"` 或 `sudo -u username command`**:这是本中最安全高效的方法。 - **测试环境**:先在终端测试命令,再集成到本。 - **安全建议**:避免在本中存储密码;使用 SSH 密钥或配置 `sudoers` 文件(通过 `visudo`)实现无密码切换。 - 如果目标用户是 `root`,推荐 `sudo -i -u root command` 替代 `su - root -c "command"`,以减少权限风险。 通过以上方法,您可以在 Shell 本中无缝切换用户,确保本可靠运行。如果您有具体场景(如切换到 `root` 或处理密码),请提供更多细节,我可以进一步优化建议。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值