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如何记住用户名和密码
- 首先先新建会话
- 修改名称和主机(即服务器的公网ip)
- 输入
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 ll和ls -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
- 安装
zip和unzip
[包管理器] 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的一些选项:-c:表示本行代码是用来建立一个压缩文件 -- "create"-x:表示本行代码是用来揭开一个压缩文件-t:查看压缩包里有什么文件-z:是否具有gzip的属性?亦即是否需要用gzip压缩?-j:是否具有bzip2的属性?亦即是否需要用bzip2压缩?-v:在压缩的过程中显示文件,不建议用在背景执行过程-f:使用档名,f之后必须立即接档名,不能再加其他参数-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]
-
身份
-
u-- 所有者 -
g-- 所属组 -
o-- other -
a-- 所有身份 -
增删
-
+-- 增加某项权限 -
--- 去除某项权限 -
权限
-
r-- 读取权限 -
w-- 写入权限 -
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中还有默认输入输出流,即
stdin和stdout,当然还有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设置粘滞位?- 普通用户把目录建在自己的个人目录下(
/home/[admin])毫无意义,你都建在个人目录下了别人还怎么访问你的"公共目录"? - 普通用户没法在根目录创建目录,所以公共目录就不能是由普通用户创建,那既然是由
root用户创建的,目录的所有者和所属组都是root要限制的自然是other用户了
- 普通用户把目录建在自己的个人目录下(
4 快捷键1
-
上下键可以查找历史使用过的命令
-
ctrl+c可以强制终止当前命令/程序的执行 -
补全键
Tab,按一次用于补全文件名/目录名,按两次用于补全命令 -
ctrl+r,搜索历史命令 -
ctrl+d,退出当前用户登录,如果你是从用户1但获取到到用户2的话,则会回退到用户1的权限