四、Linux核心工具:Vim, 文件链接与SSH

作者:IvanCodes

日期:2025年7月29日

专栏:Linux教程

思维导图




一、高效文本编辑:Vim 编辑器

1.1 Vim 简介与核心模式

Vim 是一个功能极其强大的文本编辑器,以其高效的快捷键操作和独特的模式设计而闻名。掌握 Vim 的核心在于理解其不同的工作模式。

  • 正常模式 : 默认模式。用于移动光标、删除、复制、粘贴文本。所有操作都通过快捷键完成。
  • 插入模式 : 用于输入和编辑文本,类似于普通记事本。
  • 命令行模式 : 在屏幕底部以冒号 : 开始,用于执行保存、退出、搜索、替换等扩展命令。
  • 可视模式 : 用于选择文本块,以便进行批量操作。

1.2 Vim 基础操作

进入与退出

bash 复制代码
# 打开或创建一个名为 filename 的文件
vim filename
  • 进入插入模式 : 在正常模式下按 i (在光标前插入), a (在光标后追加), o (在当前行下方新建一行并插入)。
  • 返回正常模式 : 在任何其他模式下按 Esc 键。

正常模式下的光标移动

h, j, k, l: 左、下、上、右移动光标。
w: 移动到下一个单词的开头。
b: 移动到上一个单词的开头。
^0: 移动到行首。
$: 移动到行尾。
gg: 移动到文件第一行。
G: 移动到文件最后一行。

正常模式下的编辑操作

x: 删除光标所在的单个字符。
dw: 删除从光标开始到单词结尾的内容。
dd: 删除 (剪切) 整行。
yy: 复制 (yank) 整行。
p: 粘贴 (put) 已删除或复制的内容到光标之后。
u: 撤销上一步操作 (undo)。
Ctrl + r: 重做 (redo) 已撤销的操作。

命令行模式下的常用命令
文件操作

:w: 保存 (write) 文件。
:q: 退出 (quit) 编辑器。如果文件有未保存的修改,会提示错误。
:q!: 强制退出,不保存任何修改。
:wq: 保存并退出。
:x: 保存并退出 (仅当文件被修改时才写入)。
:w new_filename: 另存为 new_filename
:r filename: 读入 (read) filename 文件的内容并插入到当前光标后。
:! command: 执行外部 shell 命令。例如 :! ls -l
:r ! command: 导入 (import) 外部命令的执行结果到当前光标后。

行号与跳转

:set nu:set number: 显示行号。
:set nonu:set nonumber: 隐藏行号。
:set nu!:set number!: 切换显示/隐藏行号。
:n: 跳转到第 n 行 (例如 :10 跳转到第10行)。

查找与替换

:/pattern: 向下查找 pattern。按 n 查找下一个,N 查找上一个。
:?pattern: 向上查找 pattern。按 n 查找下一个 (方向与 ? 相反),N 查找上一个。
:s/old/new: 替换当前行的第一个 oldnew
:s/old/new/g: 替换当前行的所有 oldnew
:%s/old/new/g: 替换整个文件的所有 oldnew (% 代表所有行)。
:%s/old/new/gc: 替换整个文件,但每次替换前都会提示确认。

二、文件链接:硬链接与软链接

2.1 硬链接

硬链接可以看作是一个文件的多个有效文件名。它们都指向同一个物理存储位置 (同一个inode)。

特性:

  • 删除源文件或任何一个硬链接,文件内容依然存在,直到最后一个链接被删除。
  • 不能对目录创建硬链接。
  • 不能跨越不同的文件系统 (分区)。

语法结构 : ln 源文件 目标链接名
代码示例:

bash 复制代码
# 创建一个名为 original_file.txt 的文件
echo "This is the original file." > original_file.txt

# 为 original_file.txt 创建一个硬链接 hard_link.txt
ln original_file.txt hard_link.txt

# 查看它们的 inode 号,会发现它们是相同的
ls -i original_file.txt hard_link.txt

2.2 软链接

软链接是一个特殊的文件,其内容是另一个文件的路径。它类似于Windows的快捷方式。

特性:

  • 拥有自己独立的inode。
  • 可以对目录创建软链接。
  • 可以跨越不同的文件系统。
  • 如果源文件被删除,软链接会失效 (变成"悬空链接"或"死链接")。

语法结构 : ln -s 源文件或目录 目标链接名
代码示例:

bash 复制代码
# 为 original_file.txt 创建一个软链接 soft_link.txt
ln -s original_file.txt soft_link.txt

# 为 /var/log 目录创建一个名为 logs_shortcut 的软链接
ln -s /var/log logs_shortcut

# 查看它们的 inode 号,会发现是不同的
ls -i original_file.txt soft_link.txt

2.3 硬链接 vs. 软链接 核心区别

特性 硬链接 (Hard Link) 软链接 (Symbolic Link)
Inode 与源文件相同 独立的新 inode
类型 文件的一个别名 指向路径的指针文件
跨文件系统 不可以 可以
链接到目录 不可以 可以
删除源文件 链接依然有效 链接失效 (悬空)

三、远程连接与文件传输 (SSH)

3.1 SSH 远程登录

SSH (Secure Shell) 是一个加密的网络协议,用于在不安全的网络上安全地执行远程命令和管理服务器。

语法结构 : ssh [用户名]@[主机名或IP地址]
代码示例:

bash 复制代码
# 使用用户 auser 登录到主机 192.168.121.151
ssh auser@192.168.121.151

# 如果本地用户名与远程用户名相同,可以省略用户名
# 假设本地用户也是 auser
ssh 192.168.121.151

# 登录到指定端口 2222 的服务器
ssh -p 2222 auser@remote.server.com

3.2 SCP 安全文件传输

scp (Secure Copy) 是一个基于SSH的文件传输工具。

语法结构:

  • 上传 : scp [选项] 本地文件 用户@主机:远程路径
  • 下载 : scp [选项] 用户@主机:远程文件 本地路径
    常用选项 :
    -r: 递归复制整个目录。

代码示例:

bash 复制代码
# 上传本地文件 local_file.txt 到远程主机的 /home/auser/ 目录下
scp local_file.txt auser@192.168.121.151:/home/auser/

# 下载远程主机的 /var/log/syslog 文件到当前目录
scp auser@192.168.121.151:/var/log/syslog .

# 上传整个本地目录 local_dir/ 到远程主机的 /tmp/ 目录下
scp -r local_dir/ auser@192.168.121.151:/tmp/

# 下载远程主机的 /etc/nginx/ 目录到本地的 nginx_backup/ 目录
scp -r auser@192.168.121.151:/etc/nginx/ nginx_backup/

3.3 SSH 密钥对免密登录

通过设置SSH密钥对 (公钥和私钥),可以实现无需输入密码的安全登录,这对于自动化脚本和提高效率至关重要。

设置步骤:

  1. 在客户端生成密钥对 (ssh-keygen)
    在你的本地机器 (客户端) 上执行。
bash 复制代码
ssh-keygen -t rsa
# 按照提示,可以一直按回车使用默认设置
# 会在 ~/.ssh/ 目录下生成 id_rsa (私钥) 和 id_rsa.pub (公钥)
  1. 将公钥复制到服务器 (ssh-copy-id)
    这是最推荐的方法,它会自动处理服务器端的文件和权限问题。
bash 复制代码
ssh-copy-id auser@192.168.121.151
# 输入一次 auser 的密码
# 该命令会将本地的 id_rsa.pub 内容追加到远程主机的 ~/.ssh/authorized_keys 文件中
  1. 测试免密登录
bash 复制代码
ssh auser@192.168.121.151
# 如果设置成功,这次将不再提示输入密码,直接登录

四、总结

本章深入探讨了Linux系统中三个至关重要的工具:Vim编辑器、文件链接机制以及SSH远程管理。Vim是高效文本处理的利器;理解软硬链接的区别有助于灵活地组织文件系统;而SSH及其相关工具是现代系统运维和远程协作的基石。熟练掌握这些命令和概念,将使您在Linux环境中的操作更加专业、高效和安全。


练习题

请在您的Linux环境中完成以下操作,并写出所使用的命令。

题目:

  1. 使用 Vim 打开一个名为 my_script.sh 的新文件。
  2. my_script.sh 中,进入插入模式并输入 #!/bin/bashecho "Script is running" 两行内容。
  3. 不退出 Vim,使用命令行模式保存 my_script.sh 文件。
  4. my_script.sh 中,使用命令行模式显示行号。
  5. my_script.sh 中,使用命令行模式将 running 替换为 working
  6. my_script.sh 中,使用命令行模式将 /etc/hosts 文件的内容读入 (导入) 到文件末尾。
  7. 创建一个名为 data_file.txt 的文件,并为它创建一个名为 data_hardlink 的硬链接。
  8. data_file.txt 文件创建一个名为 data_softlink 的软链接。
  9. 删除 data_file.txt,然后分别使用 ls -l 命令检查 data_hardlinkdata_softlink 的状态。
  10. 在你的家目录下创建一个名为 app 的目录,然后为这个目录创建一个名为 app_link 的软链接。
  11. 使用 ssh 命令以用户 admin 的身份登录到 IP 地址为 10.0.0.10 的远程服务器,并使用非标准的端口 22022
  12. 将你本地家目录下的 my_script.sh 文件上传到 10.0.0.10 服务器上 admin/opt/scripts/ 目录中。
  13. 10.0.0.10 服务器上的 /var/log/ 整个目录下载到你本地的 server_logs/ 目录 (假设本地 server_logs 已存在)。
  14. 在你的本地机器上生成一对新的 SSH 密钥对,并将其安全地复制到 10.0.0.10 服务器的 admin 账户,以实现免密登录。
  15. 在 Vim 中,不退出文件,如何快速跳转到文件的最后一行?

答案与解析:

  1. 打开 Vim:
bash 复制代码
vim my_script.sh

解析: vim 命令后跟文件名,如果文件不存在则会创建一个新的缓冲区。

  1. 进入插入模式并输入:

    1. i (或 a, o) 进入插入模式。
    2. 输入内容。
    3. Esc 返回正常模式。
      解析: i 是进入插入模式最常用的按键之一。
  2. 保存文件:

bash 复制代码
:w

解析: 在正常模式下输入 : 进入命令行模式,w 表示保存 (write)。

  1. 显示行号:
bash 复制代码
:set nu

解析: set nuset number 的缩写,用于显示行号。

  1. 替换文本:
bash 复制代码
:%s/running/working/g

解析: : 进入命令行模式。% 表示整个文件,s 表示替换,/old/new/ 是替换格式,g 表示全局 (global),即替换行内所有匹配项。

  1. 读入文件内容:

    1. G 跳转到文件末尾。
    2. o 新建一行并进入插入模式,再按 Esc 返回正常模式 (可选,确保插入位置正确)。
    3. 输入 :r /etc/hosts
      解析: :r filename 命令会将指定文件的内容读入并插入到当前光标所在行的下方。
  2. 创建硬链接:

bash 复制代码
touch data_file.txt
ln data_file.txt data_hardlink

解析: ln 命令默认创建硬链接。

  1. 创建软链接:
bash 复制代码
ln -s data_file.txt data_softlink

解析: ln-s 选项表示创建符号链接 (soft link)。

  1. 检查链接状态:
bash 复制代码
rm data_file.txt
ls -l data_hardlink     # 正常显示,链接数减少
ls -l data_softlink     # 会看到链接名标红,指向一个不存在的路径

解析: 删除源文件后,硬链接因指向相同的 inode 而不受影响。软链接因其指向的路径已失效而变成悬空链接。

  1. 为目录创建软链接:
bash 复制代码
mkdir ~/app
ln -s ~/app ~/app_link

解析: 软链接可以指向目录,这是硬链接无法做到的。

  1. SSH 指定端口登录:
bash 复制代码
ssh -p 22022 admin@10.0.0.10

解析: ssh-p 选项用于指定非默认的端口号。

  1. SCP 上传到指定目录:
bash 复制代码
scp ~/my_script.sh admin@10.0.0.10:/opt/scripts/

解析: scp 的目标路径是 user@host:path,这里的 path 是服务器上的绝对或相对路径。

  1. SCP 下载目录:
bash 复制代码
scp -r admin@10.0.0.10:/var/log/ server_logs/

解析: -r 选项用于递归复制整个目录。

  1. 生成并复制公钥:
    • 生成:
bash 复制代码
ssh-keygen
  • 复制:
bash 复制代码
ssh-copy-id admin@10.0.0.10

解析: ssh-keygen 生成密钥对,ssh-copy-id 是最安全、最便捷的复制公钥的方法。

  1. Vim 跳转到最后一行:
    在正常模式下,按 G (大写)。
    解析: G 是Vim中跳转到文件最后一行的快捷键。gg 则是跳转到第一行。
相关推荐
路溪非溪44 分钟前
Linux定时器和时间管理源码相关总结
linux
一只小bit7 小时前
Linux网络:阿里云轻量级应用服务器配置防火墙模板开放端口
linux·网络·阿里云
嘉琪0017 小时前
实现视频实时马赛克
linux·前端·javascript
SpiderPex7 小时前
GitHub下载项目完整配置SSH步骤详解
运维·ssh·github
帽儿山的枪手8 小时前
HVV期间,如何使用SSH隧道绕过内外网隔离限制?
linux·网络协议·安全
邹诗钰-电子信息工程9 小时前
嵌入式基础知识复习(C语言)
linux·c语言·vim
瀚高PG实验室9 小时前
CentOS 8 安装HGDB V4.5 psql命令执行报错
linux·运维·centos·瀚高数据库
小醉你真好10 小时前
6、CentOS 9 安装 Docker
linux·docker·centos
平生不喜凡桃李11 小时前
Linux 线程概念与控制
java·linux·运维
獭.獭.12 小时前
Linux -- 文件【中】
linux