文章目录
一.宏观上Linux的注意点:
1.Linux是严格区分字母大小写的
2.Linux中一切皆文件,包括硬件也是文件
3.Linux中区分文件不靠扩展名区分(即不靠后缀区分),实际上后缀是可有可无的,Linux是靠权限来区分文件的,但是一般情况下会约定俗成的使用一些后缀(但不强制)
二.实际操作中应该注意的地方
1.dev表示硬件,/dev/hda1 IDE硬盘接口
/dev/sda1 SCSI和SATA硬盘接口
2.挂载:将盘符和分区连接在一起的过程(类似于windows中的盘符)
其中必须要有的分区:
/(即根分区) 和 swap分区(即交换分区,内存的2倍)
推荐要有的分区:
/boot(即启动分区,200MB)
3.Linux默认上传、下载的服务器位置是/home目录
4.网卡信息
在配置好网络后,用ifconfig命令查看网卡eth0信息,配置DHCP时,最好用[*],其他的DNS用推荐方式即可;
如果用ifconfig命令没有eth0时,可以用ifup eth0打开网卡
5.基本目录的简要说明
/ 根目录(最高级别的命令,开机默认进入的是/root目录)
/home 用户文件的主目录
/bin 存放必要的命令
/lib 存放必要的运行库
/boot 存放内核以及启动所需的文件
/mnt 空目录,通常将软驱和光驱挂载此处
/dev 存放硬件文件
/proc和/sys目录 存放进程和系统信息,在内存上,重启会丢失,用户数据不要放在此处
/etc 存放系统配置文件
/root 超级用户目录
/user 包含一般不需要修改的应用程序等
/var 包含系统产生的经常变化的文件
/temp和/root以及/home可以用来存放数据
三.常用命令
Linux中的命令大部分都是这样的格式:命令 【选项】 【参数】
1.查询目录中内容命令:ls
形式 ls 【选项】 【文件或目录】
选项有: -a 显示所有文件(包含隐藏文件)
-l 显示详细信息
-d 查看目录属性
-h 人性化显示文件大小
-i 显式inode(节点)
2.权限(Linux是靠权限区分文件的)命令
隐藏文件的意义:一般都是系统文件,免得用户误操作
默认是10位,形如:-rw-r--r--
其中第1位:表示文件类型,-表示文件,d表示目录,l表示软链接
后面第2位到第10位:每三个划分为一组(即为rw-
、r--
和r--
),分别表示用户读写文件的权限,其中r表示读权限,w表示写权限,x表示执行权限
第一组表示所有者的权限
第二组表示所属组的权限
第三组表示其他人的权限
常用的赋权命令:
# 将三组权限转换成数字,777表示将读、写、运行的权限赋予文件所有人
chmod 777 文件名
# 给所有人赋予可执行该文件的权限
chmod a+x 文件名
3.目录处理命令
创建空文件(是空文件不是空目录!):touch 文件名
建立目录:mkdir 【目录名】 ,如mkdir test
建立递归目录:mkdir -p 【目录】,-p表示创建多级目录,如 mkdir -p test1/test2
切换当前所在目录里:cd 【目录】,
进入当用用户的家目录,一般默认是/root目录:cd 或者是cd ~
进入上次历史目录:cd -
进入根目录:cd /
进入上级目录:cd …
进入当前目录:cd .(基本无用)
<注:>如果忘记要进入当前目录下具体哪个子目录时,可以用补齐命令:cd (子目录的首字母) 再连按两次Tab键,系统会列出当前目录下所有以此开头的子目录(如果有且一个的话会自动补齐)
4.删除目录命令:rmdir
删除空目录(只针对啥都没有的空目录!!):rmdir 【目录名】
删除目录或者文件:rm -rf 【文件或者目录】,其中-r表示删除目录(系统会询问用户是否进入其子目录并删除),-f表示强制删除(系统不会询问用户)
5.复制命令:cp
形式 cp 【选项】 【源文件或者目录】 【目标目录】
选项有: -r 复制目录
-p 连带文件属性复制
-d 若源文件是链接文件则复制链接属性
-a 相当于 -pdr,让复制文件和源文件一模一样
如cp -p test1/test /root就是将test1/test文件复制到/root目录下
6.剪切或者改名命令:mv
形式 mv 【源文件或目录】 【目标目录】
注意:源目录和目标目录相同就是执行改名的操作,不同目录就是执行剪切操作
7.链接命令:ln
形式 ln -s 【源文件】 【目标文件】
-s表示创建软链接,比较灵活
硬链接:
两个文件的节点是一样的,删除源文件时,那么链接文件仍然可用;
软链接:
1.软链接有自己的I节点和Block块,只保存源文件的文件名和I节点,并没有实际数据;
2.修改任意文件,另一个也会跟着改变
3.删除源文件,软链接将不能使用
比如建立Nginx的软链接(以后直接可以全局使用nginx命令):
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
8.文件搜索命令:locate、whereis、which、find、grep
1.locate命令
形式: locate 文件名(只能搜索文件名)
locate并不是直接在系统中搜索,而是在/var/lib/mlocate库中搜索,但是这个库不是实时更新的(一天更新一次),所以新建的文件用locate命令不能立刻找到,但是可以用update db命令强制更新更库,然后再用locate命令搜索即可。
2.whereis命令:搜索命令位置的命令,如whereis ls
3.which命令:which 文件名,当用它来搜索命令时,会显示命令的别名;
4.find命令:find 【搜索范围】 【搜索条件(一般时文件名)】,find命令功能强大,但是比较耗费资源。
这里的文件名可以包含通配符(使用通配符时必须使用“”包裹):
- 匹配任意内容
? 匹配任意一个字符
[] 匹配任意一个中括号里的字符
5.grep命令(在文件中搜索符合条件的字符串):
grep 【选项】 字符串 文件名
选项有: -v 取反,即不包含条件
-i 忽略大小写
9.压缩与解压缩命令
Linux中常用的压缩格式有.zip、.gz、.bz2、.tar.gz、.tar.bzz,虽然Linux中文件没有后缀,这里后缀是让自己可以区分,无实际意义。
9.1 zip
压 缩 : zip 压缩文件名 源文件
如果压缩目录,用zip -r 压缩文件名 源文件
解压缩:unzip 压缩文件
9.2gzip
压缩:
gzip 源文件(源文件会消失)
gzip -c 源文件 压缩文件 (保留源文件)
gzip -r 目录 (压缩目录下所有子文件,但不能压缩目录)
解压缩:
gzip -d 压缩文件
gunzip 压缩文件
9.3 bz2(此命令不能压缩目录)
压缩:
bzip2 源文件(不保留源文件)
bzip2 -k 源文件(保留源文件)
解压缩:
bzip2 -d 压缩文件
bzip2 -k 压缩文件(保留源文件)
bunzip2 压缩文件
9.4 tar.gz和tar.bz2,由于gz和bz2对目录的压缩和解压缩都有些问题,所以产生了这两个,先打包再压缩
打包命令: tar -cvf 打包文件名 源文件
-c表示打包
-v显示过程
-f指定打包后的文件名
解打包命令: tar -xvf 打包文件名
-x 表示解打包
将打包和压缩以及解压缩集成到一起:
tar -zcvf xxx.tar.gz 源文件
tar -zxvf xxx.tar.gz
9.5 tar.bz2
打包压缩:tar -jcvf xxx.tar.bz2 源文件
解打包解压缩:tar -jxvf xxx.tar.bz2
10.关机重启命令:shutdown
shutdown 【选项】 时间
选项有:-c 取消前一个关机命令
-h 关机
-r 重启
时间: 就是普通时间,如果写为now就会立刻执行
除上述以外,重启也可以用reboot命令,比较安全;init 6也可以但经量不要用,这里捎带一下系统运行级别:
级别 | 职能 |
---|---|
0 | 关机,init 0指令可以用来关机 |
1 | 单用户,相当于windows中的安全模式,启动最小程序,用于系统修复 |
2 | 字符界面,不含NFS服务(即文件共享符) |
3 | 完全多用户,及完全的字符界面 |
4 | 未分配 |
5 | 图形界面 |
6 | 重启,init 6指令可以用来重启 |
可以用指令id:3:initdefault来修改默认系统运行级别
11.清屏命令:Ctrl+l
12.挂载命令:mount
挂载即分配盘符,Linux中所有的存储设备(U盘、光盘。。。),都必须挂载后才能使用。
12.1 查询与自动挂载
mount 查询系统中已经挂载的设备
mount -a 一句配置文件/etc/fstab的内容,自动挂载
12.2 挂载命令格式:
mount 【-t 文件系统】 【-o特殊选项】 设备文件名 挂载点;
说明如下:
【-t 文件系统】 加入文件系统类型来制定挂载类型,可以是ext3、ext4、iso9660等文件系统,如果挂在光盘,默认是iso9660类型;
挂载点:Linux中常用空白目录来做挂载点。
【典例】挂载光盘
1.建立挂载点 :mkdir /mnt/cdrom
2.挂载光盘:mount -t iso9660 /dev/cdrom /mnt/cdrom
即将设备文件/dev/cdrom挂载到对应的挂载点/mnt/cdrom文件目录上方便读取,后面的读取直接到/mnt/cdrom读取即可
3.卸载光盘 umount 设备文件名或者挂在短 (注意,卸载时必须退出挂载点,否则无法卸载)
【典例】挂载U盘
1.fdisk -l (用来查看U盘的设备名,一般是sdb1,查到啥写啥,其中sda是虚拟机,另一个就是U盘设备名,这里不支持NTFS格式的,要想支持另下插件)
2.流程一样,如果没有挂载点就新建挂载目录mkdir /mnt/usb
3.进行挂载,mount -t vfat /dev/sdb1 /mnt/usb,这里的vfat相当于fat32
4.卸载 umount 设备文件名或者挂在短 (注意,卸载时必须退出挂载点,否则无法卸载)
13.创建、追加文件内容
之前可能不管创建还是追加,都是直接vim xxx
的方式来搞,此外其实cat
也可以搞,主要如下:
# 若test.txt文件存在,则清空并写入内容;否则创建该文件并写入内容
cat <<EOF> test.txt
>test1
>EOF
# 若test.txt文件存在,则不清空直接在原文件后追加;否则创建该文件并写入内容
cat <<EOF>> test.txt
>test2
>EOF
注:上述EOF
可以换成任意字符,用于定义文本内容的开始输入和终止输入的标志。
四、之后遇见的实用命令
【重要】最重要的是装完无法联网;
【解决方案】网络的配置(修改成桥接模式),默认CentOS7默认网卡ens33是不开机自启的,手动更改配置文件ifcfg-ens33
(不同版本网卡名字可能会有所差异,请随机应变(●ˇ∀ˇ●)):
cd /etc/sysconfig/network-scripts
vi ifcfg-ens33
# 更改ONBOOT=no为ONBOOT=yes保存退出
# 重启网络服务
sudo service network restart
1.shell脚本的执行
关于脚本命令xxx.sh文件运行时,不能进入所在目录直接执行xxx.sh命令,这样会报错:-bash: startup.sh: command not found,应该用以下的一些命令执行脚本。
//法1:在脚本所在目录下,其中./表示当前目录,一定不能掉
# ./xxx.sh
//法2:用绝对路径来执行
# 父目录1/父目录2等/xxx.sh
//法3:在脚本目录下,可以用bash或者sh命令执行
# bash(或者sh) xxx.sh
【注】脚本写完后,需要给定权限才能变绿(可执行):chmod a+x xx.sh
2.关于防火墙
1.查看防火墙状态
# systemctl status firewalld
2.开启防火墙(关闭我想你应该会了,将start改为stop)
# systemctl start firewalld
3.禁止防火墙开机启动
# systemctl disable firewalld
4.配置防火墙开放端口并重新载入
# firewall-cmd --permanent --zone=public --add-port=8080/tcp
# firewall-cmd --reload
5.查看防火墙开放的所有端口
# firewall-cmd --zone=public --list-ports
6.查看防火墙是否开放某个端口
# firewall-cmd --zone=public --query-port=8080/tcp
7.将防火墙中已开放的端口删除(即不对外开发)
# firewall-cmd --zone=public --remove-port=8080/tcp
3.关于端口
1.端口使用情况查看
# netstat -tunlp
Linux查询指定端口号 lsof -i:8080
(需要安装 yum install lsof
)
2.查看监听端口
netstat -ano
3.网卡信息查看
# ifconfig
4.查看端口状态
netstat -lnp|grep 8081(端口号)
4. 时间同步
解决CentOS已经设置为GMT+8后时间不同步的问题:
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
ntpdate -u cn.pool.ntp.org
5. 安装图形界面
默认不安装,需手动安装:
# 安装
yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
# 重启到图形界面
init 5
6.文件内部的删除命令
在使用vim xx.conf
文件后,大量内容需要删除的时候,总不能一直按着退格键吧:
- 整行删除:光标移至待删除的行上,
dd
命令即可,或:.d
; - 第5行(包含)到第10行(包含):
5,10d
; - 将光标移动到第5行:
5G
; - 将光标直接移动到末行:
G
;
注:其中d
表示删除,.
表示当前行,即当前光标所在的行,在上述命令也可以用,比如删除整个文档中的内容,可以G
到末行,然后输入:1,.d
,即删除第1行到当前行(末行)所有内容。
7. 后台运行
在Linux中,运行脚本,很多时候会直接进入程序的控制台,这样就不能干其他事了,使用如下命令可以让程序在后台运行,不会自动进入控制台:
# 后台运行/root/test.php程序,并追加日志文本,&符号不能忽略
nohup /root/test.php(命令文件) &
# 根据提示追加如下命令,将日志文件写入到nohup.out文件中,不指定默认就是这个文件
appending output to nohup.out
# 查看后台运行的进程
jobs -l
# 结束进程,可以先用上述命令查看进程号
kill -9 进程号
8. 配置SSH免密登录
# 生成密钥,一路回车,不要设置密码
ssh-keygen -t rsa
使用下面的命令进行远程复制,如果远程机器上配置过authorized_keys将会被覆盖(这种做法只适合远程机器没有进行过SSH配置的情况)
scp -p ~/.ssh/id_rsa.pub root@<remote_ip>:/root/.ssh/authorized_keys
如果A机器已经授权可以免密登录B机器,如果现在也要让C机器可以免密登录B机器,作如下操作:
首先在C机器上生成密钥,然后将id_rsa.pub文件中的内容追加到B机器的authorized_keys文件中,
可以先将C机器上的公钥复制到B机器上的/tmp目录下,然后再进行追加到授权文件中:
# 1. 将公钥复制到远程机器上的临时目录中
scp -p ~/.ssh/id_rsa.pub root@10.4.37.124:/tmp
# 2. 登录到远程机器上,将公钥内容追加到授权文件中
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
注:同时授权多台机器可以SSH免密登录,只能用上述的第二种方式。、
9. 修改Host
命令如下:
# 绑定hosts
vim /etc/hosts
# 绑定完让host立刻生效
hostname search.xxxx.com(定义的主机名)
10. 查看系统类型
cat /etc/redhat-release
11. fuser
命令无法识别
yum install psmisc
12. 实时查看日志
实时查看日志 tail -f xxx.out
13. 生成指定大小的文件
在作上传、下载时,通常需要对性能作参数测试,就需要各种大小的文件,在Linux中,dd
指令提供了这种功能,比如:
dd if=/dev/zero of=test bs=1M count=1000
生成指定大小的文件,表示在当前目录生成1000M的文件,名字为test
- if =输入文件
- of =输出文件
- bs = bytes 同时设置读/写缓冲区的字节数
- count = blocks 只拷贝输入的blocks块
14. 查看本机的公网IP
curl icanhazip.com
15. 文件格式及转换
vim可以查看文件格式,命令:set fileencoding
,我这里显示的编码是utf-8
;
vim还可以查看文件类型(换行符是LF还是CRLF),同样在vim中通过:set ff
可以查看其类型(比如fileformat=dos
),将其转成unix::set ff=unix
。如果是指定转换某个文件将出现换行符CRLF
转成LF
:
dos2unix kubectl-apply.sh
如果是某个目录下的所有文件:find ./ -type f -exec dos2unix {} +
16. 执行脚本
执行.sh
提示权限不够,需要对脚本文件赋权chmod +x xxx.sh
17. 端口占用
查看占用端口的程序(i
后面的:
不能丢!!),如:lsof -i:30001
18. 创建多级目录
创建目录以及子目录:mkdir -p test/test1
19. 删除多级目录
删除目录以及子目录:rm -rf test
20. vim粘贴代码混乱
vim 粘贴格式时,自动缩进,注释连续,解决:粘贴前先:set paste
,然后再粘贴;如果又需要缩进了,再设置:set nopaste
即可。
21. top
命令:
top
命令用于显示当前进程的状态(在迁移老应用到K8S时作资源配置参考很好用),下面是一些一些重要参数的说明:
VIRT
:virtual memory usage 虚拟内存,单位kb(进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等);
RES
:resident memory usage 常驻内存(进程当前使用的内存大小);
SHR
:shared memory 共享内存(除了自身进程的共享内存,也包括其他进程的共享内存);
22. 利用PS指令查看进程
ps
指令即可,用法如下:
选项参数:
-A
/-e
:显示所有进程;-a
: 显示现行终端机下的所有进程,包括其他用户的进程;-u
:以用户为主的进程状态 ;x
:通常与a
这个参数一起使用,可列出较完整信息;T
:显示所有和当前终端相关的进程,默认参数,等同于不带选项参数的ps
指令;
输出格式参数:
-l
:较长、较详细的将该PID 的的信息列出;
-j
:工作的格式(jobs format);
23. curl 无法请求https
- 查看有无目录
/etc/pki/tls/certs
(无则创建); - 如果上述没录下没有证书,下载最新证书到上述目录中
wget http://curl.haxx.se/ca/cacert.pem
即可; - 如果上述目录已有证书,则将最新下载的证书追加到已有证书中即可
24. sed指令
sed
指令可以依照脚本对文本文件进行处理和编辑,sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等:
Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-i[SFX]] [-nrE] CMD [FILE]...
-e CMD Add CMD to sed commands to be executed
-f FILE Add FILE contents to sed commands to be executed
-i[SFX] Edit files in-place (otherwise sends to stdout)
Optionally back files up, appending SFX
-n Suppress automatic printing of pattern space
-r,-E Use extended regex syntax
If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none).
主要使用场景如下:
# 在文件的第4行插入指定字符串并输出,原来的第4行下移一行,不对文件本身修改,下面2个指令等价
sed -e '4a\newLine' testfile
sed 4anewLine testfile
# 在指定行的前一行(即第1行)插入,如果指定第0行,那这个插入的行为会发生在每一行,不对文件本身修改
sed '2i new Line' testfile
# 如果是插入的多行可以文本,可以使用换行符\n
# 替换范围行的内容(整行替换,包头不包尾),不会文件本身修改,将第1行替换为 new String
sed '1,2c new String' testfile
# 打印范围行(包头包尾),常和 -n 使用显式行号
sed '1,2p'
# 删除指定范围行(包头不尾),末行用$表示,用$表示范围行的末端可以删除全部,不对文件本身修改
sed '1,3d' testfile
# 删除含有某个字符的行,删除 testfile 中所有含有 test 字符的行
sed '/test/d' testfile
# 搜索替换,只将指定字符替换为另一个字符(非整行),将test
sed 's/test/newTest/g'
# 多点编辑,即一个 sed 指令执行多个行为
sed
# 在 filename(待操作的文件名) 文末添加新的一行并写入内容
sed -i '$a\待插入的内容' filename
# 删除 filename 的最后一行
sed -i '$d' filename
# 替换 filename 中所找到的字符串替换为目标字符串(不加 -i 参数不会对文件本身修改,只会输出屏幕上)
sed -i 's/要被取代的字串/新的字串/g' filename
参数:
a
:表示新增
d
:表示删除
c
:表示替换(整行替换)
p
:表示打印,常和-n
使用
s
:表示替换(部分替换),可用正则
25. curl 指令
curl
通常会用来在服务器上调用一些请求,本地我一般习惯于 postman 本地自测,服务器若要请求 api(尤其是带有复杂请求参数时),我都是直接利用 postman 来生成 curl
指令,但通常直接把指令复制过去是各种报错,摸索下来,大概场景如下:
原始指令:
curl --location --request POST 'localhost:8080/excel_import' \
--header 'Content-Type: application/json' \
--data-raw '{
"domainId": 2000,
"orgId": 2001,
"templateType": 10,
"taskName": "运营数据",
"fileKey": "f_r-d-3c7ec81ee9af4370b4dff85237f99624.xlsx",
"creatorId": 800012405
}'
执行上述指令报错 curl: option --data-raw: is unknown
,这个异常通常就是 curl
版本差异的结果,可以尝试用 --data
代替 --data-raw
,最终可以正常运行的指令如下:
curl --location --request POST 'localhost:8080/excel_import' \
--header 'Content-Type: application/json' \
--data '{
"domainId": 2000,
"orgId": 1405,
"templateType": 10,
"taskName": "运营数据2",
"fileKey": "f_r-d-a03421ea45024448b3e140a28ccc2c09.xlsx",
"creatorId": 800012301
}'
26. less 指令
之前用的比较多的就是翻屏,没用过搜索,但发现搜索要比 grep
指令快,具体语法为:/xxx
就是向下搜索,?xxx
就是向上搜索,其中 xxx
表示的就是待搜索的字符串,其实都一样,进入搜索模式后,n
和 N
可以向上或向下跳到另一个匹配处,其中 /xxx
模式下 N
是向下, n
是向上;?xxx
模式下 n
和 N
的跳转方向则刚好和 /xxx
模式相反。