0063. shell命令--su

目录

63. shell命令--su

功能说明

语法格式

选项说明

实践操作

注意事项

其它事项


63. shell命令--su

功能说明

        su 命令在 Linux 和 Unix 系统中用于切换当前用户到另一个用户,通常是切换到超级用户(root)。这个命令允许用户以另一个用户的身份执行命令,这对于执行需要更高权限的任务非常有用。

        su 命令来自英文单词 switch use r的缩写,其功能是切换用户身份。将管理员切换至任意用户身份时无须密码验证,而将普通用户切换至任意用户身份时均需密码验证。另外,添加单个减号(-)参数表示完全的身份变更,不保留之前用户的任何环境变量信‍息。

语法格式

su [选项] [用户名]

SYNOPSIS
       su [options...] [-] [user [args...]]

选项说明

- 或 -l 或 --login:以登录 shell 的方式启动目标用户的 shell 环境。这意味着会加载目标用户的 shell 配置文件(如 .bash_profile、.bashrc 等),并且环境变量也会切换到目标用户的配置。
-c <指令>或--command=<指令>:以指定用户的身份执行一个命令,然后退出。这对于执行需要更高权限的单次命令很有用。
--preserve-environment:尽量保持当前的环境变量不变,但在切换到 root 用户时,出于安全考虑,某些环境变量(如 PATH)可能会被覆盖。
-f 或 --fast:适用于csh与tsch,使shell不用去读取启动文件;

-m,-p或--preserve-environment:变更身份时,不要变更环境变量;
-s<shell>或--shell=<shell>:指定要执行的shell;
--help:显示帮助;
--version;显示版本信息。

实践操作

0. 环境准备
# 创建两个用户并设置密码为123456
seq 2|sed -r 's#(.*)#useradd MineGi-\1;echo '123456'|passwd --stdin MineGi-\1#g'|bash
tail -2 /etc/passwd

1. 由 root 用户切换到普通用户
whoami
pwd
env |grep "^PWD"
su - MineGi-1    #由 root 用户切换到普通用户不需要输入密码
env |grep "^PWD"    #家目录改变了
pwd

2. 由普通用户切换至普通用户
whoami
env |grep "^PWD"
su MineGi-2    #由普通用户切换至普通用户需要输入密码
env |grep "^PWD"    #家目录没改变,是因为没加选项 - 
pwd
ls
whoami

3. 普通用户使用 root 身份执行命令
ls -la /root    #没有权限查看
su -c 'ls -la /root'    #需要输入root密码

4. 由普通用户切换至 root 用户
su -    # root 可以省略,输入 root 密码
whoami
env |grep "^PWD"

5. 让系统开机时自动以普通用户启动指定的服务脚本
cp /etc/rc.local{,.bak}    #先备份一下
ll /etc/rc.local{,.bak}
echo "hostname -I" >/tmp/test.sh    #写个测试脚本
cat /tmp/test.sh    #看一下内容
sh /tmp/test.sh    #执行一下测试
echo "su - MineGi-1 -c '/bin/sh /tmp/test.sh' >/home/MineGi-1/file.txt" >>/etc/rc.local    #写到文件中
cat /etc/rc.local    #看一下内容
source /etc/rc.local    #直接加载该文件
ll /home/MineGi-1/file.txt
cat /home/MineGi-1/file.txt
cat /etc/rc.local.bak >/etc/rc.local    #还原文件内容
cat /etc/rc.local

6. 企业面试案例
使用用户登录到 Linux系统后,发现提示符为 "-bash-4.2$" 异常情况,请问该如何恢复到正常的 Linux 命令行提示符情况?

6.1 模拟故障
ls -la /home/MineGi-1/
rm -rf /home/MineGi-1/.bash*
ls -la /home/MineGi-1/
su - MineGi-1
exit 或 ctrl + D

6.2 解决方案
cp -ar /etc/skel/.bash* /home/MineGi-1/
su - MineGi-1
rm -rf .bash*
bash
cp -ar /etc/skel/.bash* ~
bash
# source ./.bash_profile ./.bashrc    #还未生效,则执行此命令  

# 若是没有权限复制文件,则切换到 root 用户下再复制
# su - root 
# cp -ar /etc/skel/.bash* /home/MineGi-1

注意事项

  • 使用 su 命令时,如果你已经以 root 身份登录,则可以直接切换到其他用户而无需输入密码。
  • 在生产环境中,由于 su 命令要求输入目标用户的密码,这可能会在某些自动化脚本中造成不便。为此,可以考虑使用 sudo 命令,它允许通过配置文件(/etc/sudoers)精细控制哪些用户能以哪些用户的身份执行哪些命令。
  • 出于安全考虑,建议仅在必要时才切换到 root 用户,并尽量使用 sudo 来执行需要更高权限的命令。
  • 使用 su 切换到 root 用户时,应特别小心,因为 root 用户拥有对系统的完全访问权限,可以执行任何操作,包括删除重要文件或修改系统配置。
  • 最小权限原则:总是尝试以最小必要的权限运行应用程序和用户账户。只有在确实需要时才提升权限。
  • 定期审计:定期检查和审计系统中su和sudo的使用情况,确保没有未经授权的访问或不当的配置。
  • 教育用户:培训用户了解su和sudo的正确使用方法,以及它们潜在的安全风险。
  • 使用强密码和两因素认证:为root账户和其他重要账户设置强密码,并考虑使用两因素认证来增加安全性。
  • 更新和维护:保持系统和所有已安装软件的更新,以修补已知的安全漏洞。

其它事项

记录会话

        在切换到 root 用户或其他用户时,可能希望记录会话以供审计或回溯。这可以通过在 su 命令中使用 script 命令实现。例如:

script -a /path/to/logfile.txt su -

        这将记录整个su会话到指定的日志文件中。-a 选项用于追加内容到现有文件,如果不希望覆盖原有日志。

避免使用 su 切换到 root 进行日常任务

        如前所述,由于 root 用户的权限过大,频繁使用它进行日常任务会增加误操作的风险。建议只在确实需要 root 权限时才使用,并通过 sudo 进行更细粒度的权限控制。

使用环境变量管理不同用户的配置

        虽然 su --preserve-environment 选项旨在保留环境变量,但在实践中,出于安全考虑,它可能不会保留所有变量。可以考虑在用户的shell配置文件中(如.bashrc或.bash_profile)设置需要的环境变量,以便在通过su切换到该用户时自动加载。

限制root登录

        对于大多数服务器环境,最好完全禁用 root 用户的直接登录,而是通过 sudo 从普通用户账户提权。这可以通过修改 SSH 配置文件(通常是 /etc/ssh/sshd_config )并设置 PermitRootLogin no 来实现。

审计su命令的使用

        大多数Linux发行版都配备了审计工具(如 auditd ),可以用来监控对关键文件和命令的访问,包括 su 命令。配置适当的审计规则可以帮助识别潜在的滥用或安全漏洞。

在 PowerShell 中,原命令 `adb shell "su -c /data/local/tmp/tcpdump -i wlan0 -s 0 -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -S -i -` 出现意外标记 `-k`、`-S` 以及“只允许表达式作为管道第一个元素”的错误,这是因为 PowerShell 的语法和传统 shell 有所不同。 可以尝试使用以下几种解决方案: ### 方案一:使用 `Start-Process` `Start-Process` 可以用来启动一个新进程,从而避免管道和引号等语法问题。下面是示例代码: ```powershell $tcpdumpCommand = 'su -c /data/local/tmp/tcpdump -i wlan0 -s 0 -w -' $adbProcess = Start-Process -FilePath adb -ArgumentList "shell $tcpdumpCommand" -PassThru -NoNewWindow $wiresharkPath = "C:\Program Files\Wireshark\Wireshark.exe" Start-Process -FilePath $wiresharkPath -ArgumentList "-k -S -i -" ``` ### 方案二:使用反引号转义引号 使用反引号(`)来转义引号,确保命令的正确解析。示例代码如下: ```powershell adb shell `"su -c /data/local/tmp/tcpdump -i wlan0 -s 0 -w -`" | & "C:\Program Files\Wireshark\Wireshark.exe" -k -S -i - ``` ### 方案三:将命令拆分成变量 将命令拆分成多个变量,这样可以更清晰地处理引号和参数。示例代码如下: ```powershell $tcpdumpCmd = 'su -c /data/local/tmp/tcpdump -i wlan0 -s 0 -w -' $adbCmd = "adb shell $tcpdumpCmd" $wiresharkPath = "C:\Program Files\Wireshark\Wireshark.exe" $wiresharkArgs = "-k -S -i -" Invoke-Expression $adbCmd | & $wiresharkPath $wiresharkArgs ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值