基本命令使用

1. 文件与目录操作

查看目录内容

  • 使用 ls 命令查看当前目录下的文件和子目录。
    常用选项:

    • -l:以长格式显示文件信息(权限、大小、修改时间等)。
    • -a:显示所有文件,包括隐藏文件(以 . 开头的文件)。
      示例:
    1
    2
    ls -l
    ls -la

创建文件

  • 使用 touch 命令创建一个空文件。
    示例:

    1
    2
    touch newfile.txt
    touch file1.txt file2.txt

删除文件或目录

  • 使用 rm 删除文件,使用 rm -r 删除目录。
    常用选项:

    • -r:递归删除目录及其内容。
    • -f:强制删除,不提示确认。
      示例:
    1
    2
    3
    rm file.txt
    rm -r directory/
    rm -rf directory/

移动或重命名文件

  • 使用 mv 命令移动文件或重命名文件。
    示例:

    1
    2
    3
    mv oldname.txt newname.txt  # 重命名文件
    mv file.txt /path/to/destination/ # 移动文件
    mv *.txt /path/to/destination/ # 移动所有 .txt 文件

创建目录

  • 使用 mkdir 命令创建新目录。
    常用选项:

    • -p:递归创建多级目录。
      示例:
    1
    2
    mkdir new_directory
    mkdir -p parent_directory/child_directory

复制文件或目录

  • 使用 cp 命令复制文件,使用 cp -r 复制目录。
    常用选项:

    • -r:递归复制目录及其内容。
    • -i:在覆盖文件前提示确认。
      示例:
    1
    2
    3
    cp file.txt /path/to/destination/
    cp -r directory/ /path/to/destination/
    cp -i file.txt /path/to/destination/

查看当前路径

  • 使用 pwd 命令显示当前工作目录的绝对路径。
    示例:

    1
    pwd

切换目录

  • 使用 cd 命令切换到指定目录。
    示例:

    1
    2
    3
    cd /path/to/directory/
    cd .. # 返回上一级目录
    cd ~ # 切换到用户主目录

查看文件内容

  • 使用 catmorelessheadtail 命令查看文件内容。
    常用命令和选项:

    1. cat:一次性显示整个文件内容。
      示例:

      1
      2
      cat file.txt
      cat file1.txt file2.txt > combined.txt # 合并多个文件内容到一个文件
    2. more:分页显示文件内容,按空格键翻页,按 q 退出。
      示例:

      1
      more file.txt
    3. less:分页显示文件内容,支持上下滚动,按 q 退出。
      示例:

      1
      less file.txt
    4. head:显示文件的前几行内容,默认显示前 10 行。
      常用选项:

      • -n:指定显示的行数。
        示例:
      1
      2
      head file.txt
      head -n 5 file.txt # 显示前 5 行
    5. tail:显示文件的最后几行内容,默认显示最后 10 行。
      常用选项:

      • -n:指定显示的行数。
      • -f:实时跟踪文件内容的变化(常用于查看日志文件)。
      • --regex:结合 grep 使用正则表达式过滤内容(需要手动组合)。
        示例:
      1
      2
      3
      4
      tail file.txt
      tail -n 5 file.txt # 显示最后 5 行
      tail -f logfile.txt # 实时跟踪日志文件
      tail -f logfile.txt | grep -E "error|fail" # 实时过滤包含 "error" 或 "fail" 的行

2. 常用工具

文本编辑器

  1. Vim:功能强大的文本编辑器,支持多种模式(命令模式、插入模式等)。
    常用命令:

    • i:进入插入模式。

    • Esc:退出插入模式,返回命令模式。

    • :w:保存文件。

    • :q:退出 Vim。

    • :wq:保存并退出。

    • :q!:强制退出,不保存更改。
      示例:

      1
      vim file.txt

文件搜索工具

  1. grep:在文件中搜索指定的字符串。
    常用选项:

    • -i:忽略大小写。

    • -r:递归搜索目录中的文件。

    • -n:显示匹配行的行号。

    • -E:使用扩展正则表达式。

    • -P:使用 Perl 风格的正则表达式(某些系统可能不支持)。
      示例:

      1
      2
      3
      4
      5
      grep "search_term" file.txt
      grep -i "search_term" file.txt
      grep -r "search_term" /path/to/directory/
      grep -E "pattern[0-9]+" file.txt # 使用扩展正则表达式匹配
      grep -P "\d{3}-\d{2}-\d{4}" file.txt # 使用 Perl 风格正则匹配
  2. find:在目录中查找文件或目录。
    常用选项:

    • -name:按名称查找(支持简单通配符)。

    • -regex:使用正则表达式匹配路径。
      示例:

      1
      2
      3
      find /path/to/directory -name "*.txt"
      find /path/to/directory -type f -size +1M
      find /path/to/directory -regex ".*\.log" # 使用正则匹配 .log 文件
  3. locate:快速查找文件(基于预构建的文件索引)。
    示例:

    1
    2
    locate filename
    locate -r ".*\.conf" # 使用正则匹配 .conf 文件
  4. which:查找命令的可执行文件路径。
    示例:

    1
    2
    which ls
    which python

3. 用户与权限管理

添加用户

  • 使用 useradd 命令添加新用户。
    示例:

    1
    2
    sudo useradd username
    sudo passwd username # 设置用户密码
  • 使用 adduser 命令(某些系统中)添加用户并交互式设置信息。
    示例:

    1
    sudo adduser username

删除用户

  • 使用 userdel 命令删除用户。
    常用选项:

    • -r:同时删除用户的主目录。
      示例:
    1
    2
    sudo userdel username
    sudo userdel -r username

修改权限

  • 使用 chmod 命令修改文件或目录的权限。
    权限表示:

    • r:读权限。
    • w:写权限。
    • x:执行权限。
      示例:
    1
    2
    chmod 755 file.txt  # 设置文件权限为 rwxr-xr-x
    chmod -R 700 directory/ # 递归设置目录权限为 rwx------
  • 使用 chown 命令更改文件或目录的所有者。
    示例:

    1
    2
    sudo chown username file.txt  # 更改文件所有者
    sudo chown -R username:group directory/ # 递归更改目录所有者和组

查看权限

  • 使用 ls -l 命令查看文件或目录的权限。
    示例:

    1
    ls -l file.txt
  • 使用 stat 命令查看文件的详细信息,包括权限。
    示例:

    1
    stat file.txt

4. 网络操作

查看网络配置

  • 使用 ifconfigip addr 查看网络接口的配置信息。
    示例:

    1
    2
    ifconfig
    ip addr
  • 使用 ping 测试与目标主机的连通性。
    示例:

    1
    2
    ping 8.8.8.8
    ping www.example.com

测试网络连接

  • 使用 curlwget 测试网络连接并获取网页内容。
    示例:

    1
    2
    curl http://www.example.com
    wget http://www.example.com
  • 使用 netstatss 查看网络连接状态。
    示例:

    1
    2
    netstat -tuln
    ss -tuln
  • 使用 traceroute 跟踪数据包到目标主机的路由。
    示例:

    1
    traceroute www.example.com
  • 使用 nslookupdig 查询域名解析信息。
    示例:

    1
    2
    3
    nslookup www.example.com
    dig www.example.com
    dig -t A www.example.com | grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$" # 使用正则过滤 IPv4 地址

5. 软件包管理

安装与卸载软件

  • 使用 apt 命令安装、卸载软件。
    示例:

    1
    2
    3
    4
    sudo apt update  # 更新软件包索引
    sudo apt install package_name # 安装软件包
    sudo apt remove package_name # 卸载软件包
    sudo apt purge package_name # 卸载软件包并删除配置文件

更新系统

  • 使用 apt 命令更新系统。
    示例:

    1
    2
    3
    sudo apt update  # 更新软件包索引
    sudo apt upgrade # 更新已安装的软件包
    sudo apt dist-upgrade # 执行发行版升级

搜索软件包

  • 使用 apt search 搜索软件包。
    示例:

    1
    apt search package_name

查看已安装的软件包

  • 使用 dpkgapt list 查看已安装的软件包。
    示例:

    1
    2
    dpkg -l
    apt list --installed

6. 系统与存储管理

查看系统信息

  • 使用 uname 命令查看系统内核和操作系统信息。
    常用选项:

    • -a:显示所有信息。
    • -r:显示内核版本。
    • -n:显示主机名。
      示例:
    1
    2
    3
    uname -a
    uname -r
    uname -n
  • 使用 hostnamectl 查看和设置主机名。
    示例:

    1
    2
    hostnamectl
    hostnamectl set-hostname new-hostname
  • 使用 uptime 查看系统运行时间和负载信息。
    示例:

    1
    uptime
  • 使用 free 查看内存使用情况。
    常用选项:

    • -h:以人类可读的格式显示。
      示例:
    1
    free -h
  • 使用 df 查看磁盘使用情况。
    常用选项:

    • -h:以人类可读的格式显示。
      示例:
    1
    df -h
  • 使用 tophtop 查看系统资源使用情况和运行的进程。
    示例:

    1
    2
    top
    htop

查看磁盘使用情况

  • 使用 df 命令查看文件系统的磁盘使用情况。
    常用选项:

    • -h:以人类可读的格式显示。
    • -T:显示文件系统类型。
      示例:
    1
    2
    df -h
    df -T

挂载与卸载设备

  • 使用 mount 命令挂载设备到指定目录。
    示例:

    1
    sudo mount /dev/sdX1 /mnt
  • 使用 umount 命令卸载设备。
    示例:

    1
    sudo umount /mnt
  • 查看当前挂载的设备和挂载点。
    示例:

    1
    2
    mount
    cat /proc/mounts
  • 使用 lsblk 查看块设备信息,包括挂载点。
    示例:

    1
    lsblk
  • 使用 blkid 查看设备的 UUID 和文件系统类型。
    示例:

    1
    sudo blkid
  • 更新 /etc/fstab 文件以实现设备的自动挂载。
    示例:

    1
    echo "UUID=xxxx-xxxx /mnt ext4 defaults 0 0" | sudo tee -a /etc/fstab

关机与重启

  • 使用 shutdown 命令关机或重启系统。
    常用选项:

    • -h now:立即关机。
    • -r now:立即重启。
    • -h +分钟:在指定分钟后关机。
    • -c:取消已安排的关机或重启。
      示例:
    1
    2
    3
    4
    sudo shutdown -h now  # 立即关机
    sudo shutdown -r now # 立即重启
    sudo shutdown -h +10 # 10 分钟后关机
    sudo shutdown -c # 取消已安排的关机或重启
  • 使用 reboot 命令重启系统。
    示例:

    1
    sudo reboot
  • 使用 haltpoweroff 命令关机。
    示例:

    1
    2
    sudo halt
    sudo poweroff

进程管理

  • 使用 ps 查看当前运行的进程。
    常用选项:

    • -e:显示所有进程。
    • -f:显示完整格式的信息。
      示例:
    1
    ps -ef
  • 使用 grep 配合 ps 按名称或正则表达式过滤进程。
    示例:

    1
    2
    ps -ef | grep process_name  # 按名称过滤进程
    ps -ef | grep -E "process[0-9]+" # 使用正则表达式过滤进程
  • 使用 kill 终止进程。
    示例:

    1
    2
    kill PID  # 使用进程 ID 终止进程
    kill -9 PID # 强制终止进程
  • 使用 pkill 按名称或正则表达式终止进程。
    常用选项:

    • -f:匹配完整命令行。
    • 支持正则表达式匹配进程名称。
      示例:
    1
    2
    pkill process_name  # 按名称终止进程
    pkill -f "process[0-9]+" # 使用正则表达式终止进程
  • 使用 jobs 查看当前会话中的后台任务。
    示例:

    1
    jobs
  • 使用 bg 将后台任务切换到后台运行。
    示例:

    1
    bg %1  # 将任务编号为 1 的任务切换到后台运行
  • 使用 fg 将后台任务切换到前台运行。
    示例:

    1
    fg %1  # 将任务编号为 1 的任务切换到前台运行
  • 使用 nicerenice 调整进程优先级。
    示例:

    1
    2
    nice -n 10 command  # 以指定优先级启动进程
    renice -n 5 -p PID # 调整指定进程的优先级

7. 日志管理

查看系统日志

  • 使用 journalctl 查看系统日志(适用于 systemd 系统)。
    常用选项:

    • -b:查看当前启动的日志。
    • -u:查看指定服务的日志。
    • -f:实时跟踪日志输出。
    • --since--until:按时间范围过滤日志。
      示例:
    1
    2
    3
    4
    journalctl -b
    journalctl -u sshd.service
    journalctl -f
    journalctl --since "2023-01-01" --until "2023-01-02"
  • 查看传统日志文件(适用于非 systemd 系统或特定日志)。
    示例:

    1
    2
    3
    cat /var/log/syslog
    tail -f /var/log/syslog
    less /var/log/messages

分析日志文件

  • 使用 grep 搜索日志中的关键字。
    示例:

    1
    2
    grep "error" /var/log/syslog
    grep -i "failed" /var/log/auth.log
  • 使用 awk 提取日志中的特定字段。
    示例:

    1
    awk '{print $1, $2, $3}' /var/log/syslog  # 提取日期和时间
  • 使用 sed 过滤或替换日志内容。
    示例:

    1
    sed -n '/error/p' /var/log/syslog  # 仅显示包含 "error" 的行
  • 使用 logrotate 管理日志文件的轮换和压缩。
    示例:

    1
    sudo logrotate /etc/logrotate.conf
  • 使用 rsyslog 配置日志的收集和存储。
    示例:

    1
    2
    sudo vim /etc/rsyslog.conf
    sudo systemctl restart rsyslog

8. 安全与防火墙

配置防火墙

  1. 使用 UFW(Uncomplicated Firewall)
    常用命令:

    • 启用防火墙:

      1
      sudo ufw enable
    • 禁用防火墙:

      1
      sudo ufw disable
    • 查看防火墙状态:

      1
      sudo ufw status
    • 允许特定端口(如 22 端口):

      1
      2
      sudo ufw allow 22
      sudo ufw allow 80/tcp
    • 拒绝特定端口:

      1
      sudo ufw deny 23
    • 删除规则:

      1
      sudo ufw delete allow 22
  2. 使用 Firewalld
    常用命令:

    • 启动防火墙:

      1
      sudo systemctl start firewalld
    • 停止防火墙:

      1
      sudo systemctl stop firewalld
    • 查看防火墙状态:

      1
      sudo firewall-cmd --state
    • 允许特定端口(如 22 端口):

      1
      2
      sudo firewall-cmd --permanent --add-port=22/tcp
      sudo firewall-cmd --reload
    • 删除规则:

      1
      2
      sudo firewall-cmd --permanent --remove-port=22/tcp
      sudo firewall-cmd --reload

设置 SSH 安全

  1. 修改默认端口
    编辑 SSH 配置文件 /etc/ssh/sshd_config

    1
    sudo vim /etc/ssh/sshd_config

    找到 #Port 22,取消注释并修改为其他端口号(如 2222):

    1
    Port 2222

    保存后重启 SSH 服务:

    1
    sudo systemctl restart sshd
  2. 禁用 Root 用户登录
    编辑 /etc/ssh/sshd_config 文件,找到 #PermitRootLogin yes,修改为:

    1
    PermitRootLogin no

    保存后重启 SSH 服务:

    1
    sudo systemctl restart sshd
  3. 使用密钥认证

    • 生成 SSH 密钥对
      在客户端机器上运行以下命令生成密钥对:

      1
      ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
      • -t rsa:指定密钥类型为 RSA。
      • -b 4096:指定密钥长度为 4096 位。
      • -C "your_email@example.com":为密钥添加注释(可选)。

      系统会提示输入保存路径,默认路径为 ~/.ssh/id_rsa。按回车键即可使用默认路径:

      1
      Enter file in which to save the key (/home/user/.ssh/id_rsa):

      然后会提示设置密码短语(可选),如果不需要密码短语,直接按回车跳过:

      1
      Enter passphrase (empty for no passphrase):

      密钥生成后,公钥保存在 ~/.ssh/id_rsa.pub,私钥保存在 ~/.ssh/id_rsa

    • 将公钥上传到服务器
      使用以下命令将公钥上传到服务器的 ~/.ssh/authorized_keys 文件中:

      1
      ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
      • -i ~/.ssh/id_rsa.pub:指定公钥文件路径。
      • user@server_ip:替换为目标服务器的用户名和 IP 地址。

      如果 ssh-copy-id 不可用,可以手动将公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中:

      1
      cat ~/.ssh/id_rsa.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"
    • 配置 SSH 服务
      编辑服务器上的 SSH 配置文件 /etc/ssh/sshd_config,确保以下配置项启用:

      1
      2
      PubkeyAuthentication yes
      PasswordAuthentication no
      • PubkeyAuthentication yes:启用公钥认证。
      • PasswordAuthentication no:禁用密码认证(确保密钥认证正常工作后再禁用)。

      保存后重启 SSH 服务:

      1
      sudo systemctl restart sshd
    • 测试密钥登录
      在客户端使用以下命令测试密钥登录:

      1
      ssh -i ~/.ssh/id_rsa user@server_ip

      如果登录成功且未提示输入密码,则密钥认证配置成功。

    • 备份私钥
      私钥是登录的关键,务必妥善保管。可以将私钥备份到安全的存储介质(如 U 盘或密码管理工具),并确保权限设置为仅用户可读:

      1
      chmod 600 ~/.ssh/id_rsa
  4. 限制登录尝试次数
    使用 fail2ban 工具:

    • 安装 fail2ban

      1
      sudo apt install fail2ban
    • 启动服务:

      1
      2
      sudo systemctl start fail2ban
      sudo systemctl enable fail2ban
    • 配置 /etc/fail2ban/jail.local 文件,设置 SSH 规则:

      1
      2
      3
      4
      5
      [sshd]
      enabled = true
      port = 22
      maxretry = 5
      bantime = 600
    • 重启 fail2ban 服务:

      1
      sudo systemctl restart fail2ban

9. Shell 脚本基础

9.1 什么是 Shell 脚本

Shell 脚本是一种用 Shell 命令编写的脚本程序,通常用于自动化任务。它以 .sh 为扩展名,使用 #!/bin/bash 指定解释器。

9.2 创建与执行脚本

  1. 创建脚本文件:

    1
    vim script.sh
  2. 添加以下内容:

    1
    2
    #!/bin/bash
    echo "Hello, World!"
  3. 保存并赋予执行权限:

    1
    chmod +x script.sh
  4. 执行脚本:

    1
    ./script.sh

9.3 变量与参数

  1. 定义变量

    1
    2
    name="Linux"
    echo "Welcome to $name"
  2. 读取用户输入

    1
    2
    3
    echo "Enter your name:"
    read user_name
    echo "Hello, $user_name!"
  3. 脚本参数

    1
    2
    3
    4
    #!/bin/bash
    echo "Script name: $0"
    echo "First argument: $1"
    echo "Second argument: $2"

    执行:

    1
    ./script.sh arg1 arg2
  4. 特殊变量

    • $#:参数个数。
    • $@:所有参数。
    • $?:上一个命令的退出状态。

9.4 条件语句

  1. if 语句

    1
    2
    3
    4
    5
    if [ -f "file.txt" ]; then
    echo "File exists"
    else
    echo "File does not exist"
    fi
  2. 多分支 if-elif-else

    1
    2
    3
    4
    5
    6
    7
    if [ $1 -eq 1 ]; then
    echo "Option 1"
    elif [ $1 -eq 2 ]; then
    echo "Option 2"
    else
    echo "Other option"
    fi
  3. case 语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    case $1 in
    start)
    echo "Starting..."
    ;;
    stop)
    echo "Stopping..."
    ;;
    *)
    echo "Invalid option"
    ;;
    esac

9.5 循环

  1. for 循环

    1
    2
    3
    for i in {1..5}; do
    echo "Iteration $i"
    done
  2. while 循环

    1
    2
    3
    4
    5
    count=1
    while [ $count -le 5 ]; do
    echo "Count: $count"
    ((count++))
    done
  3. until 循环

    1
    2
    3
    4
    5
    count=1
    until [ $count -gt 5]; do
    echo "Count: $count"
    ((count++))
    done

9.6 函数

  1. 定义函数

    1
    2
    3
    4
    greet() {
    echo "Hello, $1!"
    }
    greet "World"
  2. 返回值

    1
    2
    3
    4
    5
    add() {
    return $(($1 + $2))
    }
    add 3 5
    echo "Sum: $?"
  3. 全局与局部变量

    1
    2
    3
    4
    5
    6
    7
    my_function() {
    local local_var="I am local"
    global_var="I am global"
    }
    my_function
    echo $global_var # 输出 "I am global"
    echo $local_var # 无输出

9.7 文件操作

  1. 检查文件是否存在

    1
    2
    3
    4
    5
    if [ -e "file.txt" ]; then
    echo "File exists"
    else
    echo "File does not exist"
    fi
  2. 读取文件内容

    1
    2
    3
    while read line; do
    echo $line
    done < file.txt
  3. 写入文件

    1
    echo "Hello, File!" > file.txt
  4. 追加内容

    1
    echo "New Line" >> file.txt

9.8 调试脚本

  1. 逐行调试

    1
    bash -x script.sh
  2. 检查语法

    1
    bash -n script.sh
  3. 脚本内启用调试

    1
    2
    3
    4
    5
    #!/bin/bash
    set -x
    echo "Debugging enabled"
    set +x
    echo "Debugging disabled"

9.9 定时任务

  1. 使用 cron

    1
    crontab -e
  2. 添加任务

    1
    * * * * * /path/to/script.sh
  3. 查看任务

    1
    crontab -l

9.10 示例脚本

  1. 备份文件

    1
    2
    3
    4
    5
    #!/bin/bash
    src="/path/to/source"
    dest="/path/to/backup"
    tar -czf "$dest/backup_$(date +%Y%m%d).tar.gz" $src
    echo "Backup completed!"
  2. 监控磁盘使用

    1
    2
    3
    4
    5
    #!/bin/bash
    usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
    if [ $usage -gt 80 ]; then
    echo "Disk usage is above 80%!"
    fi
  3. 批量重命名文件

    1
    2
    3
    4
    5
    #!/bin/bash
    for file in *.txt; do
    mv "$file" "${file%.txt}.bak"
    done
    echo "Files renamed!"

附录

常用资源链接