首页 / 资讯中心 / 文章详情

Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理

Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理 ★ FEATURED ARTICLE
Linux 命令行入门踩坑记录从 VMware 装系统到文件管理这学期开了 Linux 课作业要求把 VMware 装系统的过程、还有命令行的基础知识整理成一篇博客。我本来想着上机截几张图交差结果真动手才发现坑不少索性把过程完整记下来也算是自己的一份复习笔记。我用的环境是 VMware Workstation 17.6.4 Red Hat Enterprise Linux 9.8装在笔记本上。下面所有命令和输出都是我在虚拟机里真跑出来的没有编。一、用 VMware 装一台 Linux1.1 先说说选型教材上一般用 CentOS 或者 Ubuntu我们课程用的是 RHEL 9.8。企业版的好处是以后考 RHCSA 能直接对上坏处是下载镜像得费点劲我用的是课程发的 DVD 镜像rhel-9.8-x86_64-dvd.iso14 GB 出头比 Ubuntu 的大不少。VMware 个人用是免费的装完在帮助 → 关于里能看到版本号。我装的是 17.6.4。1.2 装 VMware这一步基本无脑点下一步只有两个地方值得留意安装路径建议改到 D 盘或者空间大的盘。VMware 本体不大但虚拟机磁盘文件会越滚越大跟系统盘挤在一起以后会很痛苦。勾选增强型键盘驱动程序不然后面在虚拟机里按快捷键容易失灵。装完需要重启一次重启后系统里会多出几项 VMware 的网络服务VMnetDHCP、VMware NAT Service 等这些服务不要手动关关了虚拟机上不了网。1.3 新建虚拟机打开 VMware文件 → 新建虚拟机配置类型选典型就行。几个关键选择客户机操作系统Linux版本选 “Red Hat Enterprise Linux 9 64 位”。选错了影响不大但 VMware 的推荐配置会不准。安装来源我一开始想选安装程序光盘映像文件但那样 VMware 会尝试走简易安装自动帮你把分区、用户都配好——对学习没什么好处。所以我选了稍后安装操作系统这样能完整走一遍 Anaconda 安装器看得清楚每一步到底在干什么。磁盘给了 20 GB拆分成多个文件。20 GB 对 RHEL 最小安装够用装图形界面有点紧张建议 25 GB 往上。然后是自定义硬件这块才是真正要上心的地方硬件我设的值为什么内存4096 MB装图形界面的 RHEL 92 GB 会卡到怀疑人生网络NAT开箱即用能上网不用管宿主机网络怎么配的CD/DVD指向那个 14 GB 的 ISO装完记得改成自动检测否则每次开机都从光盘引导显示器勾选加速 3D 图形不勾的话 GNOME 界面会难受1.4 装系统按开启此虚拟机之后会进 Anaconda 安装器流程大概是引导菜单选第一项进安装界面语言选中文简体键盘布局选 Chinese / English (US)安装目的地因为整块盘都是虚拟的直接选自动分区就行不用手动折腾软件选择默认是最小安装我选了带 GUI 的服务器不然装完只有黑屏命令行设置 root 密码一定要记住后面sudo和很多操作都靠它等十几分钟重启重启之后设个普通用户就进桌面了。1.5 装完必做的两件事第一件装/确认 open-vm-tools。这个包决定了三件事分辨率能不能跟着窗口自适应、能不能跟宿主机之间拖拽文件、复制粘贴能不能互通。没有它虚拟机的分辨率会卡在 800×600非常难受。sudodnfinstall-yopen-vm-tools open-vm-tools-desktopsudoreboot第二件马上拍快照。虚拟机 → 快照 → 拍摄快照命名系统安装完成。这一步我是在吃了亏之后才养成习惯的——后面做实验改配置文件改崩了系统起不来有快照直接回滚没快照就得重装。拍快照是虚拟机唯一比真机强的地方别浪费。二、内核、Shell、GNU 到底是什么关系这一节是概念题但真理解了后面全是加分项。我一开始也是糊的查了不少资料才捋清楚。2.1 内核Kernel内核是操作系统里最核心的那个程序它直接管硬件。CPU 怎么分配时间片、内存怎么分页、硬盘上的文件怎么组织、网卡收到包给谁——全归它管。关键点在于权限分层内核跑在特权态可以随便读写硬件我们平时用的程序浏览器、编辑器、shell都跑在用户态想碰硬件必须通过内核提供的系统调用这个接口。这层隔离既是安全机制也是稳定机制——普通程序崩了不会把整个系统带崩。Linux 内核是 1991 年 Linus Torvalds 发布的GPL 协议开源。我们机器上看的版本[rootlocalhost ~]# uname -r5.14.0-687.5.3.el9_8.x86_64那个el9_8就是 Red Hat Enterprise Linux 9.8 的意思说明这是红帽在官方内核基础上打补丁后的版本。2.2 ShellShell 是壳是内核和用户之间的翻译官。你敲一行命令Shell 负责解析它、找到对应的程序、启动它、再把结果展示给你。因为它本质上是个命令解释器所以 Shell 不止 bash 一种Shell说明sh最早的 Bourne Shell几乎所有 Unix 都有bashLinux 默认功能最全我们在用的就是它zsh可定制性极强macOS 现在默认用它csh/ksh语法风格不同商业 Unix 上见得多想看系统里有哪些 Shell可以直接读配置文件[rootlocalhost ~]# cat /etc/shells/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash2.3 GNU这块我一开始最迷糊。GNU 是一个自由软件项目1983 年由 Richard Stallman 发起目标很理想主义做一套完全自由、可以随便用随便改的类 Unix 系统并且定了 GPL 许可证来保证这种自由能传下去。GNU 项目写了一大堆东西比如编译器gcc、调试器gdb、我们正在用的bash还有ls、cp、rm、cat这些天天要用的命令。但尴尬的是GNU 缺一个能跑的内核。他们自己的内核Hurd一直没做完。而 1991 年Linux 内核出现了——有内核但缺少外围工具。于是两边一拍即合。所以严格讲我们说的Linux 系统其实应该叫GNU/Linux。在机器上能直接看到这些 GNU 工具[rootlocalhost ~]# ls -l /usr/bin/ls /usr/bin/cp /usr/bin/cat-rwxr-xr-x.1root root138424Mar182024/usr/bin/cat -rwxr-xr-x.1root root155104Mar182024/usr/bin/cp-rwxr-xr-x.1root root141264Mar182024/usr/bin/ls权限位-rwxr-xr-x说明这三个都是可执行程序属主是 root。顺带一提光/usr/bin下面就有 1500 多个可执行文件[rootlocalhost ~]# ls /usr/bin | wc -l15112.4 合起来看层次大概是这样应用层 浏览器、vim、我们写的脚本 ↑ Shell 层 bash —— 命令解释器人机交互的接口 ↑ 系统调用/库 glibc 等给程序提供统一的接口 ↑ 内核层 Linux 内核 —— 管进程、内存、文件系统、设备 ↑ 硬件层 CPU / 内存 / 磁盘 / 网卡一句话记内核是心脏Shell 是外壳GNU 提供了五脏六腑三个凑一起才是能用的系统。三、Shell 怎么启动提示符在说什么3.1 怎么进 Shell平时用得最多的就是图形界面里的终端Ubuntu 下CtrlAltT就能开。RHEL 里我一般在活动概览里搜 Terminal。但 Shell 不只这一种进法虚拟控制台 TTYCtrlAltF1到F6纯字符界面没有图形。图形界面卡死的时候切到 TTY 救急特别好用。远程登录ssh 用户名IP服务器场景基本都是这么用的脚本里指定解释器脚本第一行的#!/bin/bash就是在告诉系统用哪个 Shell 跑它手动起子 Shell直接敲bash会开一个新的 Shellexit退出。判断当前是不是子 Shell一个技巧是看exit之后有没有回到上一层3.2 提示符的每一段都有意思连着敲了几个命令画面大概长这样[rootlocalhost ~]# echo $PS1[\u\h\W]\$提示符[rootlocalhost ~]#拆开是四段部分含义root当前登录的用户名localhost主机名#权限标识#是 root$是普通用户最后那个符号一定要盯着看。它是 root 的话你随便敲错一条命令可能就是整个系统起不来了普通用户的话最多是操作被拒绝不会有大事。目录那一段会跟着cd变这个特别直观[rootlocalhost ~]# cd /etc[rootlocalhost etc]# pwd/etc[rootlocalhost etc]# cd ~[rootlocalhost ~]# pwd/root注意看提示符从~变成了etc再变回来。至于格式本身是由环境变量PS1控制的上面echo $PS1打出的[\u\h \W]\$就是它的定义转义符意思\u用户名\h主机名短\H主机名带域名\w当前完整路径\W只显示最后一级目录名\$权限符号root 显示#普通用户显示$\t24 小时制时间知道这个之后就能自己改了比如想让提示符带上时间PS1[\t \u\h \W]\$ 就行。不过临时改只在当前会话有效想永久生效得写进~/.bashrc。四、命令是怎么执行的4.1 基本格式命令名 [选项] [参数]命令名要跑哪个程序比如ls选项控制行为一般以-开头。短的可以合并写ls -la等于ls -l -a长的用--比如--help参数操作对象文件名、目录名之类的三者之间必须用空格隔开这个看着像废话但手快打漏了就是报错。敲完回车就执行几个例子ls# 单命令ls-l# 加选项ls-l/etc/passwd# 选项 参数ls-lh/boot# 两个短选项合并4.2 敲下去之后发生了什么Shell 按空格把这一行拆成命令名和参数拿命令名去PATH环境变量列出来的那些目录里挨个找找到就 fork 一个子进程跑它把参数传过去程序把结果输出到终端返回提示符等你下一条第 2 步是关键这解释了为什么有些命令能直接敲有些必须加路径。看一下 PATH 里到底有哪些目录[rootlocalhost ~]# echo $PATH/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binwhich能看出一个命令最终落在哪[rootlocalhost ~]# which lsaliaslsls --colorauto/usr/bin/ls有意思的是它输出两行——因为系统给ls设了别名先解别名再找真身。type则能区分一个命令到底是外部程序还是 Shell 自带的[rootlocalhost ~]# type cdcdis a shellbuiltincd是内置命令builtin因为它要改的是当前 Shell 自己的工作目录让外部程序来干是没用的——子进程改了目录退出来就没了。4.3 几个容易踩的地方① 严格区分大小写。ls能用LS就是command not found。这一点和 Windows 完全不一样文件名也是。② 一行可以写多条命令用分号隔开[rootlocalhost ~]# cd /tmp ; pwd ; cd ~/tmp③ 跑当前目录下的程序必须加./。因为系统只在 PATH 列出的目录里找不会找当前目录这是出于安全考虑。./myscript.sh# 对myscript.sh# 错command not found④ 重定向和管道。是覆盖写入是追加|是把上一条的输出当输入lslist.txt# 覆盖lslist.txt# 追加ls|wc-l# 数一下有几个文件这里我踩过一次想追加结果用了把原文件内容直接冲掉了而且 Linux 下没有回收站找不回来。五、命令行快捷键我原来一直是方向键 退格键硬敲直到看别人用命令行行云流水才知道有这些东西。熟练之后效率真的不一样。5.1 光标和编辑快捷键作用CtrlA光标跳到行首CtrlE光标跳到行尾CtrlU删掉光标前面的所有内容CtrlK删掉光标后面的所有内容CtrlW删掉前面一个单词CtrlY把刚才删掉的粘回来CtrlT交换光标处和前一个字符CtrlL清屏等于clearCtrl_撤销上一次编辑最有用的场景命令打了一半发现前缀错了CtrlU一键清空重来不用按着退格键等半天。5.2 控制类快捷键作用Tab补齐下一节细说CtrlC中断正在跑的命令CtrlZ把当前命令挂起到后台fg恢复CtrlD结束输入 / 退出当前 ShellCtrlS/CtrlQ暂停 / 恢复屏幕输出CtrlR反向搜索历史命令CtrlC用得太频繁了。比如敲了ping忘了加-c次数画面一直刷或者cat后面忘了跟文件名光标干在那儿等你输入——都是CtrlC解决。注意终端里CtrlC是中断CtrlV是特殊字符输入所以复制粘贴要用CtrlShiftC/CtrlShiftV。这个我刚开始老按错按了CtrlC结果啥也没复制还挺懵。5.3 从系统里直接看键绑定stty -a会打印当前终端驱动的所有特殊字符设置[rootlocalhost ~]# stty -aspeed38400baud;rows26;columns127;line0;intr^C;quit^\;erase^?;kill^U;eof^D;eolundef;...几个重点intr ^C—— 中断键就是 CtrlCeof ^D—— CtrlD 表示输入结束kill ^U—— CtrlU 一次删到行首erase ^?—— 退格键readline 层面的绑定可以用bind -P看[rootlocalhost ~]# bind -P | grep -E beginning-of-line|end-of-line|unix-line-discard|clear-screen | sortbeginning-of-line can be found on\C-a.clear-screen can be found on\C-l.end-of-line can be found on\C-e.unix-line-discard can be found on\C-u.这比背表格可靠——想知道某个键到底绑了什么功能查自己机器最准。5.4 实测一下 CtrlC敲个会长期阻塞的命令然后按 CtrlC[rootlocalhost ~]# echo CtrlC : interrupt a running command CtrlC:interrupt a runningcommand[rootlocalhost ~]# sleep 300^C[rootlocalhost ~]# echo interrupted - back to the promptinterrupted - back to the prompt注意sleep 300那行下面的^C那是终端把中断信号回显出来了然后立刻回到提示符。CtrlA/CtrlE的效果也可以这样验证先敲ls -l /etc/hosts按CtrlA把光标移到行首再输入echo这行就变成了[rootlocalhost ~]# echo ls -l /etc/hostsls-l/etc/hostsecho出现在了你原本输入内容的前面说明光标确实跳到了行首。六、历史命令Shell 会自动记下你敲过的命令家目录下的.bash_history就是干这个的当前会话的先在内存里退出时才写文件。我用得最多的功能之一。6.1 查看和管理history# 列出全部历史带编号history10# 最近 10 条history-c# 清空当前会话的历史history-w# 把当前历史写进 .bash_history数量受两个环境变量控制HISTSIZE—— 内存里保留多少条HISTFILESIZE—— 文件里保存多少条一个小提醒如果命令里带密码比如mysql -p密码可以在命令前面加一个空格再敲前提是HISTCONTROL里有ignorespace这样它不会进历史记录。6.2 怎么调用写法作用↑/↓上下翻!!重跑上一条!n跑历史里编号 n的那条!-n跑倒数第 n 条!字符串跑最近一条以该字符串开头的!$取上一条命令的最后一个参数^旧^新把上一条里的旧字符串换成新的再跑CtrlR反向搜索最好用实测几条[rootlocalhost ~]# echo ### 1) history lists the commands you typed### 1) history lists the commands you typed[rootlocalhost ~]# history | tail -9...[rootlocalhost ~]# echo ### 2) !-2 re-runs the command two steps back### 2) !-2 re-runs the command two steps back[rootlocalhost ~]# history | tail -9...注意看敲!-2之后Shell 把要执行的完整命令回显了出来history | tail -9然后再跑。这个回显特别有用能让你确认自己到底调用了哪条别稀里糊涂跑了一条危险的命令。!$也值得单独说。比如ls-l/etc/passwdvim!$# 等价于 vim /etc/passwd省得再敲一遍长路径。6.3 CtrlR真正改变体验的功能按CtrlR之后提示符会变成这样(reverse-i-search)uname: uname -r此时你输入关键字Shell 会实时匹配最近一条包含该关键字的命令再按CtrlR继续往前找更早的匹配。找到目标后按→或Esc把命令放到命令行上编辑直接回车执行CtrlG取消搜索以前我都是按几十下上箭头找一条命令学会CtrlR之后基本没再这么干过。七、Tab 补齐这个功能用顺手之后会上瘾而且它还有个副作用——大幅减少拼写错误。7.1 能补什么场景例子结果命令名敲mkdi按 Tab补成mkdir路径敲cat /etc/hostn按 Tab补成cat /etc/hostname文件名敲ls rep按 Tab补成ls report_202变量敲echo $HO按 Tab补成$HOME用户名敲cd ~ma按 Tab补成对应用户家目录命令选项敲ls --co按 Tab补成--color要装 bash-completion7.2 两种行为唯一匹配直接补全不提示。多个匹配第一次按 Tab 先补到公共前缀再按一次才把所有候选列出来。实测[rootlocalhost lab]# ls reportreport_2024.txt report_2025.txt report_2026.txt[rootlocalhost lab]# ls report_202我一开始按一次没反应以为是卡了其实是只按一次默认不列候选。按两次就出来了上面的候选列表就是这么来的。如果你希望按一次就列出来可以在~/.inputrc里加上set show-all-if-ambiguous on。7.3 注意点区分大小写Report补不到report_2024.txt候选太多时会问Display all 123 possibilities? (y or n)按y才显示想让命令的选项也能智能补齐得装bash-completionsudodnfinstall-ybash-completion八、忘了命令怎么办三种查法命令太多记不住是正常的。关键是知道去哪儿查而不是硬背。8.1 whatis —— 先知道它是干嘛的[rootlocalhost ~]# whatis lsls(1)- list directory contents[rootlocalhost ~]# whatis passwdpasswd(1)- update a users authentication tokens(s)passwd(5)- passwordfile一句话说明。注意passwd出来两行——同一个名字在不同手册章节里是两个东西(1)是说passwd这个命令(5)是说/etc/passwd这个文件格式。如果提示nothing appropriate说明手册数据库没建跑一下mandb就好。8.2 --help —— 快速看用法几乎所有 GNU 命令都支持[rootlocalhost ~]# ls --help | head -14Usage:ls[OPTION]...[FILE]... List information about the FILEs(the current directory by default).Sort entries alphabeticallyifnone of-cftuvSUXnor--sortis specified....优点是不翻页、直接打印扫一眼就够了。输出里几个符号的意思符号含义[]方括号里的是可选的...可以重复多次-a, --all短选项和长选项的对应写法大写字母占位符要换成实际的值8.3 man —— 最权威要看完整文档就manmanls会进入一个分页界面其实底层就是less常用操作按键作用↑↓或jk上下滚空格/b下翻一页 / 上翻一页/关键字往下搜n/N下一个 / 上一个匹配g/G跳到开头 / 结尾q退出手册q是新手最容易卡住的地方——我一开始翻到一半不知道咋退只能CtrlC。其实按q就干净退出了。8.4 手册的 9 个章节man手册分 9 个章节知道这个才能在重名的时候查对地方章节内容1用户命令2系统调用3库函数4特殊文件/dev 下的设备5文件格式如 /etc/passwd6游戏7杂项8系统管理命令9内核例程所以查/etc/passwd这个文件的格式要写man 5 passwd不加章节号的话默认从第 1 章开始找会给你命令的说明。8.5 其他顺手的方法命令用途man -k 关键字按功能描述搜等于apropos忘命令名时好用info 命令GNU 官方超文本文档比 man 更详细命令 --version看版本type/which/whereis看这命令是什么、在哪help 内置命令查 bash 自己的内置命令比如help cd我平时的顺序是先whatis扫一眼它是啥 → 不确定选项就--help→ 要详细就man。九、文件管理增删复制这块是实操重点我把新建、删除、复制都过了一遍。先建个工作目录[rootlocalhost ~]# mkdir -p /root/lab[rootlocalhost ~]# cd /root/lab[rootlocalhost lab]# pwd/root/lab9.1 新建文件方法命令建空文件touch file1.txt带内容echo Hello Linux hello.txt进编辑器vim b.txt/nano b.txt键盘输入cat c.txt输完按CtrlDtouch是最常用的。它有个细节文件已存在时不报错只更新一下时间戳。[rootlocalhost lab]# touch file1.txt[rootlocalhost lab]# ls -ltotal0-rw-r--r--.1root root0Oct906:49 file1.txt9.2 新建目录[rootlocalhost lab]# mkdir dir1[rootlocalhost lab]# ls -ltotal0drwxr-xr-x.2root root6Oct906:49 dir1 -rw-r--r--.1root root0Oct906:49 file1.txt注意dir1那一行的第一个字符是d表示它是目录file1.txt是-表示普通文件。-p这个选项一定要会。想一次建多级目录mkdir-pa/b/c# 对mkdira/b/c# 错no such file or directory不加-p时父目录必须已经存在否则报错。另外-p还有个好处目录已存在时不报错。9.3 删除文件rmfile1.txt# 删单个rma.txt b.txt# 删多个rm-ihello.txt# 删前询问更安全rm-fhello.txt# 强制删不询问rm*.tmp# 通配符批量删这里必须重点强调Linux 的rm不进回收站。删了就真没了没有任何恢复手段除非你有备份或者用专业数据恢复工具。我现在的习惯是给rm加个别名让它每次问一下aliasrmrm -i写进~/.bashrc就永久生效。9.4 删除目录两个命令分工不同rmdirdir1# 只能删【空目录】rm-rdir1# 递归删目录和里面的内容一起rm-rfdir1# 递归 强制不询问rmdir遇到非空目录会直接报错[rootlocalhost lab]# rmdir dir1rmdir: failed to removedir1:Directory not empty这个报错其实是安全设计——它在提醒你这里还有东西确定要删吗。确认要删就换rm -r。⚠️rm -rf的危险程度怎么强调都不过分。尤其注意这几种写法rm-rf/# 直接摧毁系统rm-rf/*# 同上rm-rf$VAR/# 如果变量是空的就变成 rm -rf / 了最后一条最阴险。所以在脚本里用变量做删除路径时一定要先判断变量非空。9.5 复制文件cphello.txt hello_bak.txt# 复制并改名cphello.txt /tmp/# 复制到目录cp-ia.txt b.txt# 覆盖前询问cp-pa.txt b.txt# 保留权限、属主、时间戳cp-asrc dst# 归档模式保留全部属性备份首选cp -b a.txt b.txt # 覆盖前先备份原文件常用选项选项作用-i覆盖前询问-f强制覆盖-r/-R递归复制目录必须加-p保留权限、属主、时间戳-a归档模式等于-dpr打包-v显示复制过程-b覆盖前备份9.6 复制目录复制目录必须加-r这是初学者最容易漏的。不加的话[rootlocalhost lab]# cp dir1 dir2cp:-rnot specified;omitting directorydir1加上就正常了[rootlocalhost lab]# cp -r dir1 dir1_bak[rootlocalhost lab]# ls -l做备份的话我更推荐cp -a因为它会把原文件的权限、属主、时间戳全保留下来。用普通cp复制属主可能变成当前用户、时间戳变成现在——有时候这会影响程序运行。还有个小坑如果目标目录已经存在cp -r dir1 dir2的行为是把它复制成dir2/dir1而不是覆盖dir2。这个和很多人的直觉不一样。9.7 通配符配合文件管理用效率翻倍通配符含义例子*任意多个字符rm *.log?恰好一个字符ls file?.txt[abc]括号内任一字符ls file[123].txt[a-z]范围内任一字符ls file[a-z].txt{a,b}花括号扩展touch {a,b,c}.txt生成三个文件十、最后总结几个坑这轮实操下来我记下这几条1.rm没有回收站。这是和 Windows 最大的思维差异。删除前多看一眼给rm加-i别名。2. 复制目录必须-r。忘了就报错不复杂但很常犯。3. 看到#提示符要紧张起来。那意味着你是 root一条错命令可能让系统起不来。在虚拟机里练并且提前拍快照是唯一安全的学习方式。4. 别背命令学会查。whatis扫一眼 →--help看用法 →man看细节配合Tab补齐和CtrlR搜历史效率比死记硬背高太多。5. 虚拟机的快照是真香。做实验前拍一个改崩了 10 秒回滚比重装系统快无数倍。参考《鸟哥的 Linux 私房菜基础学习篇》Red Hat Enterprise Linux 9 官方文档GNU 项目官网 https://www.gnu.org/man 手册系统自带man man本文是课程作业整理环境为 VMware Workstation 17.6.4 RHEL 9.8文中的命令和输出均来自实际运行结果。有写得不对的地方欢迎指正。
阅读完成 · 觉得有帮助?
咨询建站