Linux
关于Linux的简介、诞生、迭代,大家可以去网上查一查,这里不多做赘述了
Linux文件类型
非常重要的文件类型有: 普通文件 ,目录文件 ,链接文件 ,设备文件 ,管道文件 ,Socket 套接字文件 等。
- 普通文件(-):用于存储信息和数据, Linux 用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。
- 目录文件(d,directory file):目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名。打开目录事实上就是打开目录文件。
- 符号链接文件(l,symbolic link):保留了指向文件的地址而不是文件本身。
- 字符设备(c,char):用来访问字符设备比如键盘。
- 设备文件(b,block):用来访问块设备比如硬盘、软盘。
- 管道文件(p,pipe) : 一种特殊类型的文件,用于进程之间的通信。
- 套接字文件(s,socket):用于进程间的网络通信,也可以用于本机之间的非网络通信。
每种文件类型都有不同的用途和属性,可以通过命令如ls
、file
等来查看文件的类型信息。
bash
# 普通文件(-)
-rw-r--r-- 1 user group 1024 Apr 14 10:00 file.txt
# 目录文件(d,directory file)*
drwxr-xr-x 2 user group 4096 Apr 14 10:00 directory/
# 套接字文件(s,socket)
srwxrwxrwx 1 user group 0 Apr 14 10:00 socket
Linux目录树
Linux 使用一种称为目录树的层次结构来组织文件和目录。目录树由根目录(/)作为起始点,向下延伸,形成一系列的目录和子目录。
常见目录说明
- /bin: 存放二进制可执行文件(ls、cat、mkdir 等),常用命令一般都在这里;
- /etc: 存放系统管理和配置文件;
- /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是/home/user,可以用~user 表示;
- /usr: 用于存放系统应用程序;
- /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里;
- /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
- /root: 超级用户(系统管理员)的主目录(特权阶级);
- /sbin: 存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等;
- /dev: 用于存放设备文件;
- /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
- /boot: 存放用于系统引导时使用的各种文件;
- /lib 和/lib64: 存放着和系统运行相关的库文件 ;
- /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
- /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
- /lost+found: 这个目录平时是空的,系统非正常关机而留下"无家可归"的文件(windows 下叫什么.chk)就在这里。
常用文件管理命令
(1) ctrl c: 取消命令,并且换行
(2) ctrl u: 清空本行命令
**(3) tab键:**可以补全命令和文件名,如果补全不了快速按两下tab键,可以显示备选选项
(4) ls: 列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件
- ls -a:显示所有文件,包括隐藏文件
- ls -l:显示详细信息
- ls -lh:人性化输出详细信息
(5) pwd: 显示当前路径
(6) cd XXX: 进入XXX目录下, cd ... 返回上层目录
- cd -:上一个目录和当前目录来回切换
(7) cp XXX YYY: 将XXX文件复制成YYY,XXX和YYY可以是一个路径,相当于复制+粘贴+重命名,比如cp .../a/text.txt .../b/text1.txt
(8) mkdir XXX: 创建目录XXX
- mkdir a/b/c -p:创建多个文件夹a/b/c
- mkdir a b c -p:创建三个单独的文件夹
(9) rm XXX(支持正则表达式): 删除普通文件; rm XXX -r: 删除文件夹
- rm xxx yyy:删除两个文件
- rm *.txt:删除文件以.txt结尾的所有文件
- rm a/*:删除a文件夹中所有的文件
- rm * -r:删除当前文件夹下的所有文件
- rm /* -rf:不要用!!!会删掉虚拟机所有文件
(10) mv XXX YYY: 将XXX文件移动到YYY,和cp命令一样,XXX和YYY可以是一个路径;重命名也是用这个命令;相当于剪切+粘贴
(11) touch XXX: 创建一个文件
(12) cat XXX: 展示文件XXX中的内容
(13) 复制文本
windows/Linux下:Ctrl + insert,Mac下:command + c
(14) 粘贴文本
windows/Linux下:Shift + insert,Mac下:command + v
(15) 显示历史命令:history
tmux
操作
-
tmux:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框
-
按下Ctrl+a后手指松开,然后按%:将当前pane左右半分成两个pane
-
按下Ctrl+a后手指松开,然后按 ":将当前pane上下半分成两个pane
-
Ctrl+d:关闭当前pane;如果当前window的所有pane均已关闭,则关闭window;如果当前session的所有window均已关闭,则自动关闭session
-
鼠标点击可以选pane。
-
按下Ctrl+a后手指松开,然后按方向键:选择相邻的pane
-
鼠标拖动pane之间的分割线,可以调整pane之间分割线的位置
-
按住Ctrl+a的同时按方向键,可以调整pane之间分割线的位置
-
按下Ctrl+a后手指松开,然后按z:将当前pane全屏/取消全屏
-
按下Ctrl+a后手指松开,然后按d:挂起当前session
-
tmux a:打开之前挂起的session
-
按下Ctrl+a后手指松开,然后按s:选择其他session
- 上:选择上一项 session/window/pane
- 下:选择下一项 session/window/pane
- 右:展开当前项 session/window
- 左:闭合当前项 session/window
-
按下Ctrl+a后手指松开,然后按c:在当前session中创建一个新的window
-
按下Ctrl+a后手指松开,然后按w:选择在其他window,操作方法与12完全相同
-
按下Ctrl+a后手指松开,然后按PageUp:翻阅当前panel内的内容
-
鼠标滚轮:翻阅当前pane内的内容。
-
在tmux中选中文本时,需要按住shift键。
-
tmux中复制/粘贴文本的通用方式:
- 按下Ctrl + a后松开手指,然后按[
- 用鼠标选中文本,被选中的文本会被自动复制到tmux的剪贴板
- 按下Ctrl + a后松开手指,然后按],会将剪贴板中的内容粘贴到光标处
vim
操作
- i:进入编辑模式
- ESC:进入一般命令模式
- h 或 左箭头键:光标向左移动一个字符
- j 或 向下箭头:光标向下移动一个字符
- k 或 向上箭头:光标向上移动一个字符
- l 或 向右箭头:光标向右移动一个字符
- n:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
- 0 或 功能键[Home]:光标移动到本行开头
- $ 或 功能键[End]:光标移动到本行末尾
- G:光标移动到最后一行
- :n 或 nG:n为数字,光标移动到第n行
- gg:光标移动到第一行,相当于1G
- n:n为数字,光标向下移动n行
- /word:向光标之下寻找第一个值为word的字符串。
- ?word:向光标之上寻找第一个值为word的字符串。
- n:重复前一个查找操作
- N:反向重复前一个查找操作
- :n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2
- :1,$s/word1/word2/g:将全文的word1替换为word2
- :1,$s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认。
- v:选中文本
- d:删除选中的文本
- dd: 删除当前行
- y:复制选中的文本
- yy: 复制当前行
- p: 将复制的数据在光标的下一行/下一个位置粘贴
- u:撤销
- Ctrl + r:取消撤销
- 大于号 >:将选中的文本整体向右缩进一次
- 小于号 <:将选中的文本整体向左缩进一次
- :w 保存
- :w! 强制保存
- :q 退出
- :q! 强制退出
- :wq 保存并退出
- :set paste 设置成粘贴模式,取消代码自动缩进
- :set nopaste 取消粘贴模式,开启代码自动缩进
- :set nu 显示行号
- :set nonu 隐藏行号
- gg=G:将全文代码格式化
- :noh 关闭查找关键词高亮
- Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
异常处理:
每次用vim编辑文件时,会自动创建一个.filename.swp的临时文件。
如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
(1) 找到正在打开该文件的程序,并退出
(2) 直接删掉该swp文件即可
补充
如何将服务器中的文件整个复制出来?
- 退出
tmux
cat filename
:展示文件的内容- 鼠标选中文本开头的若干字符
- 用滚轮滑到文件结尾
- 按住
shift
,同时鼠标点击文件结尾,此时会选中文件所有内容 - Windows/Linux下,按
Ctrl+insert
可以复制全文
ssh登录
基本用法
远程登录服务器:
bash
ssh user@hostname
user
:用户名hostname
:IP地域或域名
第一次登录时会提示:
bash
The authenticity of host '123.57.47.211 (123.57.47.211)' can't be established.
ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes
,然后回车即可。
这样会将该服务器的信息记录在~/.ssh/known_hosts
文件中。
然后输入密码即可登录到远程服务器中
默认登录端口号为22。如果想登录某一特定端口:
bash
ssh user@hostname -p 22
配置文件
创建文件 ~/.ssh/config
然后在文件中输入:
Host myserver1
HostName IP地址或域名
User 用户名
Host myserver2
HostName IP地址或域名
User 用户名
之后再使用服务器时,可以直接使用别名myserver1
、myserver2
。
密钥登录
创建密钥:
ssh-keygen
然后一直回车即可。
执行结束后,~/.ssh/
目录下会多两个文件:
id_rsa
:私钥id_rsa.pub
:公钥
之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。
例如,想免密登录myserver
服务器。则将公钥中的内容,复制到myserver
中的~/.ssh/authorized_keys
文件里即可。
也可以使用如下命令一键添加公钥:
bash
ssh-copy-id myserver
执行命令
格式:
bash
ssh user@hostname command
示例:
bash
ssh user@hostname ls -a
或者
bash
# 单引号中的$i可以求值
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'
或者
bash
# 双引号中的$i不可以求值
ssh myserver "for ((i = 0; i < 10; i ++ )) do echo $i; done"
scp传文件
基本用法
格式:
bash
scp source destination
将source
路径下的文件复制到destination
中
一次复制多个文件:
bash
scp source1 source2 destination
复制文件夹:
bash
scp -r ~/tmp myserver:/home/acs/
将本地家目录中的tmp
文件夹复制到myserver服务器中的/home/acs/
目录下
scp -r ~/tmp myserver:homework/
将本地家目录中的tmp
文件夹复制到myserver
服务器中的~/homework/
目录下
scp -r myserver:homework .
将myserver
服务器中的~/homework/
文件夹复制到本地的当前路径下
指定服务器的端口号:
scp -P 22 source1 source2 destination
注意: scp
的-r -P
等参数尽量加在source
和destination
之前。
使用scp配置其他服务器的vim和tmux
bash
scp ~/.vimrc ~/.tmux.conf myserver:
管道
管道类似于文件重定向,可以将前一个命令的stdout
重定向到下一个命令的stdin
。
要点
- 管道命令仅处理
stdout
,会忽略stderr
- 管道右边的命令必须能接受
stdin
- 多个管道命令可以串联
与文件重定向的区别
- 文件重定向左边为命令,右边为文件
- 管道左右两边均为命令,左边有
stdout
,右边stdin
举例
统计当前目录下所有python文件的总行数,其中find
、xargs
、wc
等命令可以参考常用命令。
find . -name '*.py' | xargs cat | wc -l
环境变量
Linux系统中会用很多环境变量来记录配置信息。
环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。
查看
列出当前环境下的所有环境变量:
env # 显示当前用户的变量
set # 显示当前shell的变量,包括当前用户的变量;
export # 显示当前导出成用户变量的shell变量
输出某个环境变量的值:
echo $PATH
修改
环境变量的定义、修改、删除操作可以参考我写的Shell语法这一节的内容。
为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到~/.bashrc
文件中。
修改完~/.bashrc
文件后,记得执行source ~/.bashrc
,来将修改应用到当前的bash
环境下。
为何将修改命令放到~/.bashrc
,就可以确保修改会影响未来所有的环境呢?
- 每次启动
bash
,都会先执行~/.bashrc
- 每次
ssh
登录远程服务器,都会启动一个bash
命令行给我们 - 每次
tmux
新开一个pane
,都会启动一个bash
命令行给我们 - 所以未来所有新开的环境都会加载我们修改的内容
常见环境变量
HOME
:用户的家目录PATH
:可执行文件(命令)的存储路径。路径与路径之间用:
分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。LD_LIBRARY_PATH
:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。C_INCLUDE_PATH
:C语言的头文件路径,内容是以冒号分隔的路径列表。CPLUS_INCLUDE_PATH
:CPP的头文件路径,内容是以冒号分隔的路径列表。PYTHONPATH
:Python导入包的路径,内容是以冒号分隔的路径列表。JAVA_HOME
:jdk的安装目录。CLASSPATH
:存放Java导入类的路径,内容是以冒号分隔的路径列表。
常用命令
系统状况
top
:查看所有进程的信息 (Linux的任务管理器)- 打开后,输入
M
:按使用内存排序 - 打开后,输入
P
:按使用CPU排序 - 打开后,输入
q
:退出
- 打开后,输入
df -h
:查看硬盘使用情况free -h
:查看内存使用情况du -sh
:查看当前目录占用的硬盘空间ps aux
:查看所有进程kill -9 pid
:杀死编号为pid
的进程- 传递某个具体的信号:
kill -s SIGTERM pid
- 传递某个具体的信号:
netstat -nt
:查看所有网络连接w
:列出当前登录的用户ping www.baidu.com
:检查是否连网
文件权限
chmod
:修改文件权限chmod +x xxx
:给xxx
添加可执行权限chmod -x xxx
:去掉xxx
的可执行权限chmod 777 xxx
:将xxx
的权限改成777chmod 777 xxx -R
:递归修改整个文件夹的权限
文件检索
find /path/to/directory/ -name '*.py'
:搜索某个文件路径下的所有*.py
文件grep xxx
:从stdin
中读入若干行数据,如果某行包含xxx
,则输出该行;否则忽略该行wc
:统计行数、单词数、字节数- 既可以从
stdin
中直接读入内容;也可以在命令行参数中传入文件名列表 wc -l
:统计行数wc -w
:统计单词数wc -c
:统计字节数
- 既可以从
tree
:展示当前目录的文件结构tree /path/to/directory/
:展示某个目录的文件结构tree -a
:展示隐藏文件
ag xxx
:搜索当前目录下的所有文件,检索xxx
字符串cut
:分割一行内容- 从
stdin
中读入多行数据 echo $PATH | cut -d ':' -f 3,5
:输出PATH用:分割后第3、5列数据echo $PATH | cut -d ':' -f 3-5
:输出PATH用:分割后第3-5列数据echo $PATH | cut -c 3,5
:输出PATH的第3、5个字符echo $PATH | cut -c 3-5
:输出PATH的第3-5个字符
- 从
sort
:将每行内容按字典序排序- 可以从
stdin
中读取多行数据 - 可以从命令行参数中读取文件名列表
- 可以从
xargs
:将stdin
中的数据用空格或回车分割成命令行参数find . -name '*.py' | xargs cat | wc -l
:统计当前目录下所有python文件的总行数
查看文件内容
more
:浏览文件内容- 回车:下一行
- 空格:下一页
b
:上一页q
:退出
less
:与more
类似,功能更全- 回车:下一行
y
:上一行Page Down
:下一页Page Up
:上一页q
:退出
head -3 xxx
:展示xxx
的前3行内容- 同时支持从
stdin
读入内容
- 同时支持从
tail -3 xxx
:展示xxx
末尾3行内容- 同时支持从
stdin
读入内容
- 同时支持从
用户相关
history
:展示当前用户的历史操作。内容存放在~/.bash_history
中
工具
-
md5sum
:计算md5
哈希值-
可以从
stdin
读入内容 -
也可以在命令行参数中传入文件名列表
-
-
time command
:统计command
命令的执行时间 -
ipython3
:交互式python3环境。可以当做计算器,或者批量管理文件。! echo "Hello World"
:!
表示执行shell
脚本
-
watch -n 0.1 command
:每0.1秒执行一次command
命令 -
tar
:压缩文件-
tar -zcvf xxx.tar.gz /path/to/file/*
:压缩 -
tar -zxvf xxx.tar.gz
:解压缩 -
tar -zxvf xxx.tar.gz -C yyy
:可以将xxx.tar.gz
解压到指定目录yyy
中
-
-
diff xxx yyy
:查找文件xxx
与yyy
的不同点
安装软件
sudo command
:以root
身份执行command
命令apt-get install xxx(Ubuntu)
:安装软件yum -y install xxx(Centos)
:安装软件pip install xxx --user --upgrade
:安装python包