第29集:用户切换与切换环境

教学目标

  • 理解Linux系统中用户切换的基本概念
  • 掌握使用su命令切换用户
  • 掌握使用sudo命令执行特权命令
  • 了解sudo的配置方法
  • 理解环境变量的概念和作用
  • 掌握环境变量的设置和管理方法
  • 了解shell配置文件的作用和使用方法
  • 掌握用户环境的定制方法

核心知识点讲解

1. 用户切换概述

用户切换是Linux系统中常见的操作,它允许用户在不同的用户身份之间切换,以获取不同的权限和环境。

2. su命令

su(Switch User)命令用于切换到其他用户身份。

基本语法:

su [选项] [用户名]

常用选项:

选项 描述
- 切换用户时同时切换环境变量
-c 执行指定的命令后返回原用户
-l -,切换用户时同时切换环境
-m 切换用户时保持当前环境变量

3. sudo命令

sudo(Superuser Do)命令允许普通用户以超级用户或其他用户的身份执行命令。

基本语法:

sudo [选项] [命令]

常用选项:

选项 描述
-i 以目标用户身份登录并打开交互式shell
-s 以目标用户身份执行shell
-u 指定要以哪个用户身份执行命令
-l 列出当前用户可以执行的sudo命令
-k 使sudo令牌失效,下次使用需要重新输入密码

4. sudo配置

/etc/sudoers文件

sudo的配置文件是/etc/sudoers,通常使用visudo命令编辑,以确保语法正确。

基本配置格式:

用户或组 主机=(运行身份) 命令

示例:

# 允许wheel组的用户以任何用户身份执行任何命令
%wheel ALL=(ALL) ALL

# 允许user1以root身份执行指定命令
user1 ALL=(root) /usr/bin/apt,/usr/bin/systemctl

# 允许user2无需密码执行指定命令
user2 ALL=(root) NOPASSWD: /usr/bin/systemctl restart apache2

5. 环境变量

环境变量是存储系统和用户配置信息的变量,它们影响shell的行为和应用程序的运行。

常用环境变量

环境变量 描述
HOME 用户的主目录
PATH 可执行文件的搜索路径
SHELL 用户的默认shell
USER 当前用户名
LOGNAME 当前登录名
LANG 语言和地区设置
TERM 终端类型
PWD 当前工作目录
OLDPWD 上一个工作目录

6. 环境变量的设置

临时设置

# 临时设置环境变量
export VARNAME=value

# 查看环境变量
echo $VARNAME

# 或使用printenv命令
printenv VARNAME

永久设置

系统级设置

  • /etc/environment:系统级环境变量
  • /etc/profile:系统级shell配置
  • /etc/bash.bashrc:系统级bash配置(Debian/Ubuntu)
  • /etc/bashrc:系统级bash配置(CentOS/RHEL)

用户级设置

  • ~/.profile:用户级shell配置
  • ~/.bash_profile:用户级bash配置(登录shell)
  • ~/.bashrc:用户级bash配置(交互式非登录shell)
  • ~/.bash_login:用户级登录配置

7. Shell配置文件的执行顺序

登录shell

  1. /etc/profile
  2. ~/.bash_profile~/.bash_login~/.profile(按顺序查找,执行第一个找到的)
  3. ~/.bash_logout(退出时执行)

交互式非登录shell

  1. /etc/bash.bashrc/etc/bashrc
  2. ~/.bashrc

8. 用户环境定制

用户可以通过修改shell配置文件来自定义自己的工作环境,例如:

  • 设置别名
  • 定义函数
  • 设置环境变量
  • 定制命令提示符
  • 配置历史命令行为
  • 加载常用工具和脚本

9. 安全注意事项

  • su命令安全:su命令需要知道目标用户的密码,应谨慎使用
  • sudo安全:应根据最小权限原则配置sudo,避免过度授权
  • 密码保护:执行sudo命令时应注意周围环境,避免密码被窃取
  • 环境变量安全:避免在环境变量中存储敏感信息
  • 配置文件权限:确保shell配置文件的权限正确,避免被他人修改

操作示例

示例1:使用su命令切换用户

# 切换到root用户(需要输入root密码)
su

# 切换到root用户并同时切换环境
su -

# 切换到指定用户
su user1

# 切换到指定用户并同时切换环境
su - user1

# 以root身份执行单个命令后返回
su -c "apt update"

# 以指定用户身份执行单个命令
su -c "ls -la" user1

# 切换用户时保持当前环境变量
su -m user1

示例2:使用sudo命令

# 以root身份执行命令
sudo apt update

# 以指定用户身份执行命令
sudo -u user1 ls -la

# 以root身份登录并打开交互式shell
sudo -i

# 以root身份执行shell
sudo -s

# 列出当前用户可以执行的sudo命令
sudo -l

# 使sudo令牌失效
sudo -k

# 验证sudo权限
sudo whoami

示例3:配置sudo

# 使用visudo编辑sudo配置文件
sudo visudo

# 添加以下配置:
# 允许user1以root身份执行任何命令
user1 ALL=(ALL) ALL

# 允许user2无需密码执行指定命令
user2 ALL=(root) NOPASSWD: /usr/bin/systemctl restart apache2

# 允许wheel组的用户以任何用户身份执行任何命令
%wheel ALL=(ALL) ALL

# 保存并退出

示例4:环境变量的设置和管理

# 临时设置环境变量
export MY_VAR="Hello World"

# 查看环境变量
echo $MY_VAR
printenv MY_VAR

# 查看所有环境变量
env
printenv

# 永久设置环境变量(用户级)
echo "export MY_VAR=\"Hello World\"" >> ~/.bashrc

# 重新加载配置文件
source ~/.bashrc

# 或使用.
. ~/.bashrc

# 永久设置环境变量(系统级)
sudo echo "MY_VAR=\"Hello World\"" >> /etc/environment

# 查看PATH环境变量
echo $PATH

# 修改PATH环境变量
export PATH=$PATH:/new/path

# 永久修改PATH
echo "export PATH=\"$PATH:/new/path\"" >> ~/.bashrc

示例5:Shell配置文件的使用

# 编辑用户的bash配置文件
nano ~/.bashrc

# 添加以下内容:

# 设置别名
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ls='ls --color=auto'

# 定义函数
function mkcd() {
    mkdir -p "$1" && cd "$1"
}

# 设置环境变量
export EDITOR=nano
export VISUAL=nano
export HISTCONTROL=ignoreboth:erasedups
export HISTSIZE=1000
export HISTFILESIZE=2000

# 定制命令提示符
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# 保存并退出

# 重新加载配置文件
source ~/.bashrc

# 测试别名
ll

# 测试函数
mkcd test_directory
pwd

示例6:用户环境的定制

# 创建用户的bin目录
mkdir -p ~/bin

# 将用户的bin目录添加到PATH
echo "export PATH=\"$HOME/bin:$PATH\"" >> ~/.bashrc

# 创建一个自定义脚本
cat > ~/bin/mybackup.sh << 'EOF'
#!/bin/bash

# 简单的备份脚本
date=$(date +%Y%m%d)
backup_dir=~/.backup/$date

mkdir -p $backup_dir
cp -r ~/Documents $backup_dir/
echo "备份完成:$backup_dir"
EOF

# 使脚本可执行
chmod +x ~/bin/mybackup.sh

# 重新加载配置文件
source ~/.bashrc

# 测试脚本
mybackup.sh

# 配置命令历史
# 编辑~/.bashrc,添加:
export HISTCONTROL=ignoreboth:erasedups
export HISTSIZE=1000
export HISTFILESIZE=2000
shopt -s histappend

# 保存命令历史的时间戳
# 编辑~/.bashrc,添加:
export HISTTIMEFORMAT="%F %T "

# 重新加载配置文件
source ~/.bashrc

# 查看带时间戳的历史命令
history | tail

示例7:sudo和环境变量

# 默认情况下,sudo会重置环境变量
# 例如:
export TEST_VAR="test value"
echo $TEST_VAR
sudo echo $TEST_VAR  # 应该为空

# 要在sudo中保留环境变量,可以使用-E选项
sudo -E echo $TEST_VAR

# 或者在sudo配置中设置
# sudo visudo
# 添加:Defaults env_keep += "TEST_VAR"

# 保存并退出

# 再次测试
sudo echo $TEST_VAR

示例8:安全使用sudo

# 1. 遵循最小权限原则
# 只授权必要的命令
sudo visudo
# 添加:user1 ALL=(root) /usr/bin/systemctl restart apache2

# 2. 定期检查sudo配置
# 查看sudo配置
sudo cat /etc/sudoers

# 3. 限制sudo会话时间
# 在sudo配置中添加:Defaults timestamp_timeout=5

# 4. 启用sudo日志
# 确保sudo操作被记录
# 查看sudo日志
sudo cat /var/log/auth.log | grep sudo  # Debian/Ubuntu
sudo cat /var/log/secure | grep sudo    # CentOS/RHEL

# 5. 使用sudo的-i选项获取干净的环境
sudo -i

课后练习

  1. 基础练习

    • 使用su命令切换到不同用户
    • 使用sudo命令执行特权命令
    • 设置和查看环境变量
  2. 进阶练习

    • 配置sudo权限
    • 永久设置环境变量
    • 定制shell配置文件
    • 创建和使用自定义脚本
  3. 思考问题

    • su命令和sudo命令有什么区别?
    • 如何安全地配置sudo权限?
    • 环境变量的作用是什么?如何永久设置环境变量?
    • shell配置文件的执行顺序是什么?

总结

本集介绍了Linux系统中用户切换与环境管理的相关知识,包括:

  • 使用su命令切换用户
  • 使用sudo命令执行特权命令
  • sudo的配置方法
  • 环境变量的概念和管理
  • shell配置文件的使用
  • 用户环境的定制方法
  • 安全使用sudo的注意事项

用户切换和环境管理是Linux系统中重要的操作,掌握这些技能可以帮助用户更有效地使用系统资源,提高工作效率,同时确保系统的安全性。通过本集的学习,您应该能够熟练地在不同用户身份之间切换,执行特权命令,以及定制自己的工作环境。在下一集中,我们将介绍Linux系统中权限管理的基础知识。

« 上一篇 用户密码管理 下一篇 » 权限管理基础