【Linux扫盲】Linux常用命令和相关概念

61 阅读19分钟

0 读前注意事项与新人朋友可能会踩的坑

0.0 学习须知

  • 本章的学习建议C/C++有一定的学习,至少需要学完C

0.1 阿里云购买服务器后可能会产生的问题

0.1.1 我应该购买哪款阿里云服务器

  • "轻量应用服务器"即可,挑最便宜的就可以,事实上四大家(阿里云,腾讯云,京东云,华为云)都有不同的折扣,可以去b站上搜一搜近期的服务器折扣,挑任意一家最便宜并且性价比最高的买就行,一般价格在58-90都差不多

0.1.2 购买完服务器后应该做的第一件事

  • 应该在服务器的管理页面立即重置服务器密码,因为一开始服务器是没有密码的,没有密码是登陆不上服务器的

0.1.3 关于阿里云root用户无法使用密码登陆的问题

0.2 关于Xshell的一些问题

0.2.1 如何安装Xshell

0.2.2 Xshell如何登录进阿里云

  • 可以先不新建会话,输入以下命令
ssh root@[你在云服务平台购买的服务器的公网ip]
  • 然后点击允许并保存,再在第一栏输入密码,此时我们就以root用户登陆进了服务器

  • root用户都是管理员权限,暂时以root用户进行登录

0.2.3 Xshell如何记住用户名和密码

  • 首先先新建会话

image.png

  • 修改名称和主机(即服务器的公网ip)

image-1.png

  • 输入
ssh root@[你在云服务平台购买的服务器的公网ip]
  • 回车并填写密码

  • 关闭Xshell并重新打开,此时可以选择会话,并连接,此时就可以输入用户名和密码进行登录(选择下方的保存用户名和密码,以后就不用再重新输密码和用户名了)

1 指令1

1.1 查看当前用户

whoami

返回

root

或者

[用户名]

1.2 清屏

clear
  • 可以清空终端屏幕上的所有信息

1.3 打印所处的路径

pwd
  • 返回:
/root

或者

/home/zhangsan

1.4 创建目录

  • 目录可以理解为Windows上的文件夹
mkdir [新目录名]
1.4.1 mkdir创建一串目录
mkdir -p [目录名a]/[目录名b]/[目录名c]

例如:mkdir -p a/b/c

1.5 显示当前目录下的文件

  • 复杂显示(显示文件名及其属性) ll 或者 ls -l
  • 简单显示(只显示文件名) ls

-l是一个选项,可以理解为执行所需操作的其他变种模式,同一个指令可以搭配多个不同的选项使用,例如ls -l -a = ls -a -l = ls -la = ls -al,效果是一样的

如果刚刚创建过目录testdir的话应该会返回:

drwxr-xr-x 2 root root 4096 Aug 10 16:19 testdir

testdir

4096是文件大小,Aug 10 16:19 是文件创建/最近修改时间 文件属性的第一个字符代表文件类型,如果是d,则代表这是一个目录"directory"

1.5.1 ls的不同选项
[空选项] -- 显示当前目录下的文件名/目录名
-l -- 显示当前目录下的文件名和文件属性/目录名和目录属性
-a -- 显示当前目录下的隐藏文件/目录
-d -- 显示当前目录的路径和属性
1.5.2 ls加目录路径
ls -l [目录路径]

可以显示当前选择的目录路径的文件

  • 例如:ls -l /root,可以显示目录root下的文件
1.5.3 llls -l的区别
  • 没有区别,ll就是ls -l的别名
1.5.4 ls*
ls -l test.*

查找所有开头包含test.的文件

当然也可以

ls -l *.*
ll *
ll *.txt

等等

1.6 切换目录

"change directory"

cd [可以是当前目录下的目录名称,也可以是宏观路径]
  • 例如:cd /root/testdir

  • 切换完后能够看到目录切换为了所需目录

1.6.1 cd命令的其他使用方式
  • 使用cd ~能够写换到当前用户的家目录(当前用户的默认路径)

root用户在/root路径下 普通用户在/home/admin_name

  • 使用cd -能够切换到上一个处在的目录

1.7 新建普通文件

touch [文件名.后缀]
  • 例如
touch test.c
ls -l

返回:

-rw-r--r-- 1 root root 0 Aug 10 17:15 test.c

属性的第一个字符为-,意思是Linux里的普通文件

  • 如果需要更新一个文件的modify时间/change时间,就可以touch [已经存在的文件的文件名.后缀]

1.8 tree命令查看目录树形结构

tree [目录名]
  • PS:如果报错了,centos可以使用yum install -y tree安装tree,ubantu可以使用apt install -y tree安装tree

1.9 无限刷屏解决方案

  • 使用"CTRL + C"终止程序运行
^C
  • 例如tree /的时候就可以使用"CTRL + C"终止程序运行

1.10 删除命令

  • 删除普通文件
rm [文件名]
  • 强制删除普通文件(不要询问)
rm -f [文件名]
  • 删除目录
rm -r [目录名]
  • -r其实是递归的意思,因为树形结构,所以只能用递归删掉,询问也是递归式地进行

  • 强制删除目录(不要询问)(最好别用吧emmm)

rm -rf [目录名]
  • 最好别用是因为如果你正好处于root用户,并且执行了rm -rf /会直接删掉根目录,删掉就直接玩完了,职业生涯寄了,甚至可能要蹲局子
1.10.1 rm*
  • 慎用慎用!!! 以下命令会删掉当前目录下所有后缀为.txt的文件,且不会询问!
rm -rf *.txt

以下命令会删掉当前目录下所有文件且不会询问!!

rm -rf *

如果执行上面这行命令的时候你正好有root权限,并且你还正好在根目录下,那就玩完了,根目录下所有文件都寄了,全没了,蹲局子吧

1.11 拷贝

1.11.1 拷贝单文件至单目录
  • cp [选项](默认为空) [源文件名] [目标目录名]
  • 以下命令可以拷贝当前目录下名为testfile.txt/root/testdir目录下
cp testfile.txt /root/testdir
1.11.2 在所在目录拷贝文件
  • cp [选项](默认为空) [原文件名] [目标文件名]
cp test.txt test2.txt
1.11.3 拷贝多文件至单目录
  • cp [选项](默认为空) [源文件名1] [源文件名2] [源文件名3]... [目标文件名]
test.txt test1.txt test2.txt testdir
1.11.4 拷贝整个目录到另一个目录下(不拷贝属性)
  • cp [选项](-r即递归) [原目录名] [目标目录路径]
cp -r testdir /root
1.11.5 选项
  • 不询问
cp -f testfile.txt /root/testdir
  • 递归式拷贝
cp -r testdir /root
  • 连同属性一并拷贝
cp -a testfile.txt /root/testdir

1.12 快捷显示文件内容

  • 下面这个指令可以快捷显示文件内容(只读)
cat test.c
  • 为每一行添加行号
cat -n test.c
1.12.1 cat的变种tac(反的cat)
  • 此命令会从文件的最后一行打印到文件的第一行
tac test.c

1.13 剪切

1.13.1 剪切目录到另一目录
  • 拷贝目录testdir到上级目录,不需要加-r
  • mv [源目录] [目标目录路径]
mv testdir ../
1.13.2 剪切文件到另一目录
  • mv [源文件] [目标目录路径]
mv test1.txt testdir

1.14 重命名

1.14.1 文件重命名
  • mv [源文件名] [目标文件名]
mv test.txt 1.txt
1.14.2 目录重命名
  • mv [原目录名] [目标目录名]
mv testdir 1
1.14.3 注意事项!
  • 只要最后跟的目标目录名并不是一个有效的目录路径,就会对目录/文件重命名,如果是一个有效的目录路径,则会拷贝到对应路径

1.15 如何优雅地打印日志

1.15.1 more
  • 不推荐,不够优雅
more /var/log/messages
  • 可以按回车下翻,但不能上翻

  • q退出

  • 查找

/[查找的内容]
1.15.2 less
  • 推荐,足够优雅
less /var/log/messages
  • 查找
/[查找的内容]
  • 查找之后可以用n直接跳转到下一个搜索到的行数,b是上一个搜索到的行数

  • 上下键用来上下翻

  • q退出

1.15.3 head
  • 查看文件前n行的内容
head [-n] [文件路径]
1.15.4 tail
  • 查看文件最后n行的内容
tail [-n] [文件路径]
1.15.5 访问文件中间的内容
  • 访问n~m行的内容
head [-n] [文件路径] | tail [-(m - n)]
  • |是管道,概念篇会提到

1.16 时间

  • 查看当前时间
date
  • 手动输出时间格式
date +[时间格式]
  • 例如,这里可以输出年月日(m是月,M是分)
  • 分隔符不固定,可以随意更换
date +%Y-%m-%d
  • 或者说像这样显示具体到秒的时间
date +%Y-%m-%d_%H:%M:%S

1.17 日历

  • 打印某年份的日历
cal [年份]

1.18 find

  • 查找某个文件的地址
find [目录] [查找规则] [文件名]
  • 例如
find ~ -name test*
  • 找到根目录下所有名字里开头包含test的地址

1.19 which

  • 查找某个命令在系统的地址
which [命令名]
  • 例如查找which在哪里
which which

1.19 grep

  • grep一般用来过滤信息,一般搭配管道食用,我们称grep为行文本过滤工具

  • 例如我想查看日志文件中包含的logind的行,就可以这么玩

cat /var/log/messages | grep "logind"
  • 同时,grep其实自带输出文本的功能
grep "Removed" /var/log/messages | tail -10
  • grep同时还可以用来查找系统中已经运行的进程
ps ajx | grep "[进程名/进程名的一部分]"
  • 例如现在我想查找进程中是否有打开一份note
ps ajx | grep "note"
  • grep还可以查找一个文件中某个信息所在的行数,-n用于打印行号
grep -n "vector" * | head -1
  • 返回
cpp_note.md:4408:#### 12.3 `vector` -- 顺序表

  • 这样就可以结合vim实现快速访问到目标行进行编辑或查看

  • 其他选项

    • -i 忽略大小写
    • -v 反向选择,即打印出没有"信息"的行

1.20 压缩和解压

1.20.1 zip
  • 安装zipunzip
[包管理器] install [选项] zip unzip
  • 例如(-y)是自动确定?
yum install -y zip unzip
  • 单文件压缩操作
zip dst.zip src
  • 目录压缩操作(-r是进行递归的意思)
zip -r dst.zip src
  • 例如
zip -r note.zip note_cpp
  • 解压操作(不加-d和指定目录的话就是解压到当前目录)
unzip srcfile.zip -d dstdir
  • 例如我想解压到other目录下
unzip note.zip -d other/
  • 或者说我想解压到当前目录下
unzip note.zip

1.20.2 tar

  • tar也是linux中比较常用的压缩方式
tar [选项] dstname.tgz src
  • tar的一些选项:

    1. -c:表示本行代码是用来建立一个压缩文件 -- "create"
    2. -x:表示本行代码是用来揭开一个压缩文件
    3. -t:查看压缩包里有什么文件
    4. -z:是否具有gzip的属性?亦即是否需要用gzip压缩?
    5. -j:是否具有bzip2的属性?亦即是否需要用bzip2压缩?
    6. -v:在压缩的过程中显示文件,不建议用在背景执行过程
    7. -f:使用档名,f之后必须立即接档名,不能再加其他参数
    8. -C:解压到指定目录
  • 例如打包并压缩一个文件(tar进行打包的时候不需要手动加递归)

tar czf testfile.tgz testdir
  • 解压一个文件到当前目录
tar xzf testfile.tgz
  • 解压一个文件到指定目录下
tar xzf testfile.tgz -C other/
  • 如果在你的平台中tar命令报错了,试着删掉或者加上[选项]前面的-

1.21 文件互传

  • Linux向Window中传送文件(在Windows的shell中食用)
sz rscfile
  • Windows向Linux中传送文件(在Windows的shell中食用,实测安卓的shell不行)
rz
  • Linux向Linux传输文件
scp [源文件名] [登录目标机器用的用户名]@[目标机器的IP地址]:[目标机器存放文件的绝对路径]

1.22 简易计算器

bc

1.23 查看当前设备的体系结构和内核版本

  • 体系结构其实就是CPU架构

  • 详细版

uname -a
  • 简略版
uname -r

1.24 查找历史命令

  • 默认记录1000条
history

1.25 关机,挂起,重启

  • 这几个命令绝绝绝大多数情况下不会用

  • 关机

shutdown
  • 挂起
halt
  • 重启
reboot

1.26 权限切换

  • root用户切换到普通用户
su adminname
  • 普通用户获取root权限(这里是获取root权限而不是切换到root用户,所以不会改变所处的路径)
su
  • 输入完之后需要输root用户的密码

  • 普通用户切换到root用户(会改变所处的路径)

su -

1.27 临时提权

  • 如果执行的某项命令需要临时提高权限到root
sudo [需要执行的命令]
  • 例如如果我想在普通用户下临时使用root权限安装某个软件
sudo [yum/apt等包管理器] install [软件名] 

1.28 更改文件关于权限的属性

1.28.1 更改文件的读写执行的权限属性
chmod [u/g/o][+/-][r/w/x] [filename]
  1. 身份

  2. u -- 所有者

  3. g -- 所属组

  4. o -- other

  5. a -- 所有身份

  6. 增删

  7. + -- 增加某项权限

  8. - -- 去除某项权限

  9. 权限

  10. r -- 读取权限

  11. w -- 写入权限

  12. x -- 执行权限

1.28.1.1 修改单身份的单权限
  • 例如我们有一个-rw-rw-r-- 1 oldking oldking 0 Sep 27 18:15 test.txt的文件
chmod u+x test.txt
  • 即对所有者新增权限"执行文件"
1.28.1.2 修改多身份的单权限
chmod u+x,g+x test.txt
  • 对所有者和所属组新增权限"执行文件"
1.28.1.3 修改单身份的多权限
chmod u-rw test.txt
  • 对所有者去除"读写"权限
1.28.1.4 修改多身份的多权限
chmod u-rw,g-rw,o+x test.txt
  • 对所有者和所属组去除"读写"权限,对other新增权限"执行文件"
1.28.1.5 通过三位八进制数字修改权限
  • 这是一个正常的文件及其属性
-rw-rw-r-- 1 oldking oldking    0 Sep 28 03:38 newfile.txt
  • 其权限组可以分为|rw-|rw-|r--|

  • 换句话说,因为每一位只会存在true/false,所以也可以看成|110|110|100|,转换成八进制就变成了665,意味着9位权限组可以用3位八进制数字表现出来

  • 所以如果或我们想要将这个文件切换成|-w-|r--|--x|的话,就可以这么干

chmod 241 newfile.txt
1.28.2 更改文件的所有者或所属组(角色)
  • 更改文件的所属组
sudo chgrp [username] [filename]
  • 更改文件的所有者
sudo chown [username] [filename]
  • 同时修改文件的所有者和所属组
sudo chown [user_username1]:[group_username] [filename]
  • 这条指令中:前的是所有者,后的是所属组

1.29 查看+修改umask

  • 查看
umask
  • 修改
umask [四位数字]

2 Xshell快捷键1

  • Alt + Enter: 全屏/退出全屏

3 概念1

3.1 文件所占空间

  • 空文件在磁盘中也需要占据一定的空间 文件 = 内容 + 文件属性 空文件 = 空内容(不占空间) + 文件属性(要占空间)

  • 文件属性包括文件路径,文件格式,文件名等等

3.2 隐藏文件/目录

  • Linux规定,以.为开头的文件名/目录名的文件/目录都是隐藏文件/隐藏目录

  • 如果我们用ls -al,就可以看到目录下有两个隐藏文件,一个是.,另一个是..,Linux规定,任何目录都有这两个隐藏目录

  • . -- 当前目录

  • .. -- 上级目录

  • 所以还可以这么玩ls -l ./file.txt,也可以ls -l ../file1.txt

  • PS:根目录的...都是指向自己

3.3 文件分割符

  • Linux以/作为文件分割符,例如/root/testdir
  • 而Windows以\作为文件分隔符

3.4 根目录

  • 根目录是一个Linux最底层的目录,一切目录的发源地,用/表示
  • 例如cd / + pwd可以切换到根目录下并查看当前目录

3.5 目录与树

  • Linux的目录本质上就是一颗多叉树,每个叶子节点都是空目录或者是文件,每个非叶子节点都是非空目录

3.6 文件属性

  • 如果我们使用ll命令,可能会返回以下信息
-rw-r--r-- 1 root root    0 Aug 11 00:55 test3.txt
-rw-r--r-- 1 root root    0 Aug 26 13:15 test4.txt
drwxr-xr-x 2 root root 4096 Sep 10 23:10 testdir1
-rw-r--r-- 1 root root    0 Sep 10 23:05 testfile.txt
  • 其中最前面的一串字符中,每个字符都代表有其自身的含义
  • 例如drwxr-xr-x 2 root root 4096 Sep 10 23:10 testdir1中最开头的d就代表这是一个目录
  • -rw-r--r-- 1 root root 0 Aug 26 13:15 test4.txt中最开头的-就代表着这是一个普通文件

3.7 一切皆文件

  • Linux下所有功能的实现全部都是文件帮我们做的,包括但不限于接收来自键盘的字符,输出在命令提示框的字符,甚至说所有的指令,我们都认为是文件帮我们做的

  • 我们拿输入与输出来举例,从物理层面说,输入是靠键盘,输出是靠屏幕,于是Linux在设计的时候,将这些东西全部抽象为一个文件,我们只需要像向正常文件输出一样,向这个不正常的"显示器文件",按照一样的操作输出就行了,大大降低了学习成本

  • 在C语言中,我们知道打开一个文件需要用到fopen,每次对这个文件进行读写操作的时候都需要先用fopen打开文件,才能对文件进行读写,这是文件流

  • 当然C中还有默认输入输出流,即stdinstdout,当然还有stderr这三个流

  • 为什么通过默认输入输出流,就可以在Windows平台或是Linux平台将信息显示在屏幕上?

  • 我们大致可以抽象地理解为,系统在启动的时候就已经打开了"显示器文件",系统可以在显示器文件中输出内容,此时我们如果使用stdout向屏幕中输出东西,其实就是用stdout向"显示器文件"中输出东西

  • 而在Linux中,默认打开的文件一定有"键盘文件","显示器文件",以及另一个"显示器文件"

3.8 重定向操作

  • 对于一些输入输出指令,它其实有默认的输出文件或者默认的读取文件,例如我们前面提到的echo命令,这个命令就是默认向显示器输出,而重定向操作其实就是更改它默认的输出/读取的位置,以达到用户想要的目的

  • 注意!!!以下我们所说的输入和输出是站在指令的角度所描述的,例如指令接受文件的输入,或者是指令向某个文件输出

3.8.1 输出重定向
touch test.txt

echo 'helloworld' > test.txt

cat test.txt

返回

helloworld
  • 这意味着,我们用>这个操作符将echo默认的输出文件改成了test.txt

  • 假如我往test.txt中输入其他内容呢

echo 'oldking' > test.txt

cat test.txt

返回

oldking
  • 证明这个>操作符默认会先清空再输入内容进文件

  • 所以又引申出来另一个操作符>> -- 追加重定向

  • 例如我们刚刚向test.txt输出了oldking

echo 'nana' >> test.txt
cat test.txt

返回

oldking
nana
  • 附加操作:
  • 如果>后面跟着的文件名不存在,系统会帮你创建好文件
echo '6' > test.txt
  • 那如果你压根就不打算用echo指令
> test.txt
  • 系统就会直接帮你创建好test.txt文件,然后什么也不做
3.8.2 输入重定向
  • 我们知道,cat命令后接文件名,其实是从文件输入,并向"显示器文件"输出
  • 但这其实并不是cat默认输入的位置
  • 如果我们这么写指令
cat
  • 你会发现界面卡在了某个地方,用键盘输入什么,就向显示器返回什么

  • 所以说,cat默认的输入位置其实是"键盘文件"

  • 以下两行指令的效果是完全一样的

cat < test.txt

cat test.txt
  • 所以,<完成的操作也可以称为输入重定向

3.9 重新理解一切皆文件

ll /dev/pts

返回

crw--w---- 1 root tty  136, 0 Sep 11 17:57 0
c--------- 1 root root   5, 2 Aug  9 21:08 ptmx
  • dev即"开发",pts(pseudo-terminals)即伪终端,是Linux系统向终端输入输出的文件目录

  • 我们可以一看到在这个目录下,存在一个名为0的文件,属性最开头是c,代表其是个字符文件

  • 所以我们甚至可以这么操作

echo 'oldkingnana' > /dev/pts/0

返回

oldkingnana
  • 如果我们打开两个终端,再对/dev/pts进行ll,你会发现又多了一个名字为1的字符文件
crw--w---- 1 root tty  136, 0 Sep 11 18:12 0
crw--w---- 1 root tty  136, 1 Sep 11 18:12 1
c--------- 1 root root   5, 2 Aug  9 21:08 ptmx
  • 如果我们在0号终端上执行echo 'oldkingnana' > /dev/pts/1,我们甚至可以对1号终端进行输出

  • 使用一下指令为目录添加粘滞位

chmod +t [目录名]
  • 带有粘滞位的目录内可以自由新建文件,但删除操作只能由文件的所有者完成

  • 为什么公共目录一般创建在根目录下,且只需要给other设置粘滞位?

    1. 普通用户把目录建在自己的个人目录下(/home/[admin])毫无意义,你都建在个人目录下了别人还怎么访问你的"公共目录"?
    2. 普通用户没法在根目录创建目录,所以公共目录就不能是由普通用户创建,那既然是由root用户创建的,目录的所有者和所属组都是root要限制的自然是other用户了

4 快捷键1

  • 上下键可以查找历史使用过的命令

  • ctrl + c可以强制终止当前命令/程序的执行

  • 补全键Tab,按一次用于补全文件名/目录名,按两次用于补全命令

  • ctrl + r,搜索历史命令

  • ctrl + d,退出当前用户登录,如果你是从用户1但获取到到用户2的话,则会回退到用户1的权限