Linux 命令行

Linux 命令笔记


一、目录/文件

1.1 目录文件日常操作

.            ->    当前目录
.. -> 上一级目录
.file/.dir -> 隐藏文件/文件夹

【ls】 查看指定目录文件

ls命令是最常用的linux命令,要配合着选项使用。

常用命令

ls -lh # 方便查看文件大小
ls -AsSh

【pwd】:查看当前目录

pwd等价于/bin/pwd -L,显示当前绝对路径,如果是链接,则显示链接路径
pwd -P等价于/bin/pwd -P,显示实际路径,而非链接路径 如果文件夹被临时删除,pwd还是显示未删除文件夹的那个路径,这时候可以使用/bin/pwd,就会提示当前路径不存在

【cd】:切换目录

cd -    # 上一目录
cd ~ # 家目录
cd # 家目录
cd .. # 上一目录
cd !$ # 将上命令的参数做为cd 参数

【touch】:新建文件

1. 创建新文件同时可以指定一些时间参数
$ touch newfile 2. 一次性创建多个文件
$ touch {1..10}.txt

可以对已有文件修改时间戳(ll显示的时间)

【1】
touch -d [[CC]YY]MMDD text
touch -t [CC[YY]MMDDhhmm[.SS] text
CC为年数中的前两位,即”世纪数”;YY为年数的后两位,即某世纪中的年数.如果不给出CC的值
touch -d 20171004 text
touch -t 201710041330.30 text 【2】
-r:以另一文件为基准更新时间戳
以file1的时间戳为基准,将file2的改成一样的
touch -r file1 file2 【3】其他不常用参数
-a 或--time=atime或--time=access或--time=use  只更改存取时间。
-c 或--no-create  不建立任何文档。
-f  此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify  只更改变动时间。

【mkdir】:新建文件夹

# 创建一个或多个的同级目录
mkdir adir bdir # 递归创建目录
# 当前目录下并没有cdir这个文件夹,如果使用单纯mkdir cdir/ddir会报错。
# 应该使用
mkdir -p cdir/ddir # 指定权限
mkdir -m 777 dir_name # 显示创建信息(成功或失败)
mkdir -v dir_name # 使用!$快速进入新建文件夹
mkdir ming
cd !$

【rm | rmdir】

# 只能删除空文件夹
rmdir dirname # 删除当前文件夹下所有文件并不提示
rm -f * # 递归删除dirname下所有文件
rm -r dirname # 上面二者结合,递归删除dirname下所有文件并不提示
rm -rf dirname

【cp】:复制文件或目录

# 递归复制old_dir目录下所有文件和文件夹到new_dir文件夹下
cp -r old_dir new_dir

注意:默认cp拷贝文件后会使用预设权限,即其他人没有更改的权限,需要使用-p或

者-a文件所有的所有特性都一起复制过来 (拉取源站数据缓存,不更改文件最后修改

时间)

【mv】:移动或重命名

# 移动/tmp/test/sample.txt文件到当前目录下
mv /tmp/test/sample.txt ./

【cat 】查看文件

作用:文本文件查看和连接工具,用于查看文本文件的内容。

命令格式:cat file 经常和more、head、tail、less以及管道命令结合使用,如:cat file | more、cat file | head等。

三个功能

1.一次显示整个文件:cat filename
2.从键盘创建一个文件:cat > filename 创建文件,输入内容,Ctrl+d 结束
3.将几个文件合并为一个文件:cat file1 file2 > file

命令参数

-A, --show-all           等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

【tac】反向查看

cat是第一行到最后一行,tac是最后一行到第一行

【head | tail】

# 显示前10行
head xs.txt 等价于 cat xs.txt|head 等价于 cat xs.txt|head -n 10 # 显示最后10行
tail xs.txt 等价于 tail -n 10 xs.txt # 显示除末尾10行外
head -n -10 xs.txt

【more | less】

更具体命令可以参考:Linux中more和less命令用法

【more】
# 回车就往下一行显示,空白键就往下一页显示
# 按 b 键就会往回一页显示,按 q 就会退出
more xs.txt # 查找比较鸡肋,并从该处前两行开始显示输出
more +/查找内容 xs.txt 【less】
# 和more几乎一样的功能,但是less更灵活(可以使用任何vim的移动命令,还有标记功能很使用),比如查找命令,直接像vim一样输入/即可
less xs.txt ma : 使用 a 标记文本的当前位置
'a : 导航到标记 a 处 F :实现和tail -f的功能,实时输出内容,tail +F xs.txt

小练习

选取xs.txt的10-20行

head -n 20 xs.txt|tail

# 更快捷的方法
sed -n '10,20p' xs.txt

1.2 文件处理

wc

统计文件信息

# 统计所有信息(行数、单词数、字符数)
$ wc /etc/passwd # 行数
$ wc -l /etc/passwd # 单词数 # 中文无法统计
$ wc -w /etc/passwd # 字节数
$ wc -c /etc/passwd # 字符数
$ wc -m /etc/passwd # 最长行字节数
$ wc -L /etc/passwd

sort

$ cat /etc/passwd | sort
$ cat /etc/passwd | sort -r # 以:为分隔符,对第三列排序,所得的结果,再通过cut以:为分隔符取第三列
$ cat /etc/passwd | sort -t ":" -k 3 |cut -d ":" -f 3

uniq

# 显示每行重复频率
uniq -c 文件名 # 只显示有重复的行
uniq -d 文件名

挑战题目

wget http://labfile.oss.aliyuncs.com/courses/1/data1
# 里面是包含一些命令使用的列表 # 要求:从里面找出出现频率次数前3的命令并保存在/home/result $ cat data1 | cut -c 8-|cut -d " " -f 1 |sort | uniq -dc | sort -r -n -k1 | head -n 3 > /home/result

1.3 文字处理

tr

tr可以删除或者去重某文本信息中的某些文字。还可以进行替换操作

# 删除hello,里面所有l,o字符
$ echo 'hello' | tr -d 'lo' # 去重hello里的l
$ echo 'hello' | tr -s 'l' # hello里,l换成a,e换成b
$ echo 'hello' | tr 'le' 'ab'

col

将tab转换为等数量的空格,或者反转

-x   tab转空格
-h 空格转tab(默认)
# 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
$ cat -A /etc/protocols # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
$ cat /etc/protocols | col -x | cat -A

sed

文件处理工具。

使得不需要打开文件就可以对文件进行操作(删除,替换,选取,新增)。以行为单位进行处理。

常用选项

-n∶经过处理后的结果显示出来。不影响真实文件。
-e:直接在指令列模式上进行 sed 的动作编辑;(没明白)
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-i∶直接修改读取的档案内容,而不是由屏幕输出。

常用命令:

a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n
s∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

删除某行

 sed '1d' somefile              #删除第一行
sed '$d' somefile #删除最后一行
sed '1,2d' somefile #删除第一行到第二行
sed '2,$d' somefile #删除第二行到最后一行 # 以上,只是输出,源文件并不会替换,若要对源文件进行修改,需加 -i
sed -i '1,2d' somefile

显示某行

 sed -n '1p' somefile           #显示第一行
sed -n '$p' somefile #显示最后一行
sed -n '1,2p' somefile #显示第一行到第二行
sed -n '2,$p' somefile #显示第二行到最后一行

使用模式进行查询

 sed -n '/ruby/p' somefile    #查询包括关键字ruby所在所有行
sed -n '/\$/p' somefile #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

插入行

sed '1a drink tea' somefile              #第一行后增加字符串"drink tea"
sed '1,3a drink tea' somefile #第一行到第三行后增加字符串"drink tea"
sed '1a drink tea\nor coffee' somefile #第一行后增加多行,使用换行符\n

替换行

sed '1c Hi' somefile                #第一行代替为Hi
sed '1,2c Hi' somefile #第一行到第二行代替为Hi

替换行中部分数据

sed 's/ruby/bird/g somefile'    #替换ruby为bird,记住这个并不会更改源文件,只是输出
sed 's/ruby//g' somefile #删除ruby

【注意】:以上对源文件都不做修改,若要修改,要加上-i

1.4 文件重构

cut

【显示每行的某位置的内容】

# 前五个(包含第五个)
$ cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
# 第五个
$ cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5

【以指定的分隔符分隔,并返回某些列】

# 返回第一列和第六列
$ cut /etc/passwd -d ":" -f 1,6

awk

awk是一个强大的文本分析工具。

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片(相当于Excel的分列),切开的部分再进行各种分析处理。

# 打印空白行,文件有几个空行,就输出几个空行
awk '/^$/{print "This is a blank line"}' awk.txt # 打印全部列,引用变量
awk '{print $0}' awk.txt # 打印前三列,引用变量
awk '{print $1,$2,$3}' awk.txt # 指定间隔符为空格,获取第四列
awk -F" " '{print $4}' awk.txt # 重组表格
awk -F ':' '{print $1"\t"$7}' awk.txt # 表头和结尾,会先输出name,shell
awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' awk.txt # 在awk中引用变量变量,在原理是拼接.
limit=30
df -Th| grep "/dev/vd" | sed 's/%//g' |awk '{ if($6>'"$limit"') print $6}'

1.5 其他命令

nl

-b :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);

-n :列出行号表示的方法,主要有三种:

-n ln :行号在萤幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w  :行号栏位的占用的位数。
nl -b a -n rz -w 3 text

1.6 文件查找

which:查询软件

在PATH变量指定的路径中,搜索某个系统命令(可执行文件)的位置,并且返回第一个搜索结果。

参数选项(基本不用)

-n  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p  与-n参数相同,但此处的包括了文件的路径。
-w  指定输出时栏位的宽度。
-V  显示版本信息

grep:搜索神器

搜索并筛选显示结果。

该命令经常配合管道命令来控制输出。

以下 是常用的选项:

Linux 命令行

【非常好用:不打开文件,直接搜索指定目录下文件内的内容】

$ vim a   # wongbingming
$ vim b # wangbingming
$ grep -rnI "bingming" . # 当然这里也可以使用正则表达式
./a:1:wongbingming
./b:1:wangbingming 参数解释
-r 递归遍历各个文件夹下的所有文件
-n 显示在文件中的第几行查询到
-I 忽略二进制文件

whreris:简单快速

定位可执行文件、源代码文件、帮助文件在文件系统中的位置。

个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。

$ whereis who

参数选项

-b   定位可执行文件。
-m 定位帮助文件。
-s 定位源代码文件。
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
-B 指定搜索可执行文件的路径。
-M 指定搜索帮助文件的路径。
-S 指定搜索源代码文件的路径。

locate:快而全

通过/var/lib/mlocate/mlocate.db数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb命令(在我们的环境中必须先执行一次该命令)。

$ updatedb
$ locate /etc/sh # 查找/etc/目录下所有以sh开头的文件

find:小而细

鸟哥的Linux私房菜-find

每天一个linux命令(19):find 命令概览

每天一个linux命令(20):find命令之exec

1.7 文件传输/下载

scp

实现不同机器之间传输数据(加密)

scp详解

curl

Curl是一个命令行方式下传输数据的开源传输工具,支持多种协议包括:FTP,HTTP,HTTPS,IMAP,POP3,TELNET等。同样支持HTTP POST方法,PUT方法,FTP上传,cookie,用户名/密码认证,下载文件端点续传等,功能十分强大。

常用的,用于模拟浏览器请求。

curl详解

wget

测试速率

wget -S http://115.231.74.93:80/lvs.lxdns.net/test.rar && rm -rf test.rar*

1.8 文件压缩

zcat

查看压缩的文件内容

zcat file.gz

Linux上的压缩格式比Windows上多很多,在 Windows 上最常见的不外乎这三种 *.zip*.rar*.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上三种外,还有 *.gz*.xz*.bz2*.tar*.tar.gz*.tar.xz*.tar.bz2,对于常见的压缩格式,tar已经可以解决,所以这里只介绍tar。tar并不能压缩和解压7z,zip等其他文件

tar

压缩示例

# test是当前目录下一个文件夹
$ tar -czvphf test.tar.gz old_folder

参数解释

-c  指明创建tar文件
-z 指明生成gz文件 -v 可视输出,不加就静默压缩 -f 指明压缩后的文件名,必须-f后必须紧跟文件名,否则无效
-p 当在其他主机还原时希望保留文件的属性
-h 备份链接指向的源文件而不是链接本身

解包示例

$ mkdir new_folder
$ tar -xzvf test.tar.gz -C new_folder

参数解释

-x  解压命令
-z 指明源文件是gz文件
-f 指明压缩后的文件名,必须-f后必须紧跟文件名,否则无效 -v 可视化输出解包过程,一般不加,静默解包 -C 指明解压到哪个目录

其他压缩格式

*.tar.gz	-z
*.tar.xz -J
*tar.bz2 -j

gz

最简单的压缩格式

# 压缩
gzip somefile # 解压
gzip -d somefile.gz

7zip

yun install p7zip

# 解压
7za x file.7z # 压缩
# 先将要压缩的文件都放到~/test/ 下
7za a file.7z ~/test/

zip

# 解压
unzip some.file # 压缩
zip -r some.zip file1 file2 dir1 dir2...

1.9 rpm包管理

# 解压rpm包
rpm2cpio xxx.rpm |cpio -div # 查看文件属于哪个rpm包
rpm -qf /path/filename # 使用rpmrebuild重新生成rpm包
# 使用rpmrebuild需要依赖rpmbuild:yum install -y rpmbuild
rpmrebuild xxx

二、系统管理

2.0 环境变量

变量分为用户变量(env)和shell变量(set)

# 添加shell变量

[root@host ~]# myuser=wangbm
[root@host ~]# echo $myuser
wangbm
[root@host ~]# env|grep myuser
[root@host ~]# set|grep myuser
myuser=wangbm # 添加用户变量,会发现用户变量会覆盖shell变量
[root@host ~]# export myuser=wangbingming
[root@host ~]# env|grep myuser
myuser=wangbingming
[root@host ~]# set|grep myuser
myuser=wangbingming # 删除环境变量
[root@host ~]# unset myuser
[root@host ~]# env|grep myuser
[root@host ~]# set|grep myuser

一些系统的变量

# 这里生成的变量,对所有用户生效
/etc/profile # 对特定user生效
/root/.bash_profile
/home/user/.bashrc # 注意修改文件后,要手动source一下

2.1 相关查询

系统信息

# 查询开机时间
$ who -b # 查询系统内核
$ uname -r # 查询是否安装某个rpm包
$ rpm -qa|grep nova # service 文件目录
$ /usr/lib/systemd/system # centos 7.x
$ /etc/init.d # centos 6.x # 查询开机自启列表
$ systemctl list-unit-files
$ chkconfig --list # 查看系统版本
$ cat /etc/redhat-release # ------或者------
$ yum install redhat-lsb -y
$ lsb_release -a # 进程树
$ pstree -p # 查看系统运行多长时间
$ uptime/w # 查看系统版本
lsb_release -a # 查看CPU信息
$ cat /proc/cpuinfo
$ numactk -H

时间查询

输出操作系统的当前日期、时间和时区。

# -s参数用于修改当前的日期和时间
date –s 2007-10-17
date –s 18:05:00 用法:cd /CNCLog/cache/qsLogBackSrcFull/bkDir/`date +%Y-%m-%d`

2.2 系统分区

分区介绍

Linux的分区,不同于Windows,一定要区别对待,不然会搞不明白。

Linux的分区的过程经历以下几个步骤

1. 设备分区:对硬盘存储空间的划分
2. 格式化:写入文件系统
3. 挂载:将分区挂载到目录上,才能访问数据

关于硬件对应的设备文件名,可以参照下图

Linux 命令行

其中以硬盘为例来说明

硬盘可以分为三种
hd : IDE硬盘接口(淘汰,接口最大传输100来M)
sd : SCSI硬盘接口(淘汰,接口最大传输200M),和SATA硬盘接口 现在都是SATA的硬盘接口 /dev/sda1 表示的是第一块(a)SATA硬盘的第一个分区(1)
/dev/sdb2 表示的是第二块(b)SATA硬盘的第二个分区(2)

分区类型

可以分为:主分区扩展分区逻辑分区

【主分区】:最多只能有4个    (受硬盘结构限制,如果硬盘结构不变,将都被限制)

【扩展分区】:
1. 最多只能有一个
2. 主分区+扩展分区,一共只能有四个,可以少于
3. 扩展分区下面,不能存放数据,只能进行逻辑分区的划分 【逻辑分区】:挂载后就是一个目录下的空间,数量不受限制

格式化做了哪些事

【目的】
1. 不是为了清空数据
2. 主要是为了写入文件系统 【文件系统】
Windows:
FAT16(每个分区大小最大不能超过2G),FAT32(单个分区大小最大16G,单个文件大小不能超过4G),NTFS Linux:ext2,ext3,ext4 ->>>>> 越往后越先进 【写入文件系统做了啥】
1. 分数据块
把空间分成若干个等大小的数据块(block),每个大小4kb
如果我们有一个文件10kb,那么会占用3个数据块,实际大小就会是12kb 你可以查看一个文件夹的大小,也都是4kb
ll -l 2. 建立数据表
一个文件被分成若干个的数据块,那么如果有用户访问的时候,就需要有一个表把这些数据块拼凑起来。
这个数据表就记录了这个文件由哪些数据块组成。

分区说明

必须分区
/ 根目录,*目录,不分配的话,所有的文件都没存储,软件没法运行
/swap 交换分区,虚拟内存,4G以下,分2倍,4G以上,和真实内存一样即可 推荐分区
/boot 启动分区,防止/ 分区写满,导致系统无法启动,不需要很大,200M足矣 逻辑分区号:只能从5开始,即使3,4没有被使用

分区操作

关于分区的操作可以参考这个: 分区操作

## 查看分区表信息
$ sudo fdisk -l
$ lsblk # 删除分区前,先确认有没有挂载点,有的话需要先umount卸载
$ fdisk /dev/vdb 然后再按d,w

2.3 进程管理

ps、kill、killall

参考文档:ps 命令的十个简单用法

# 查看当前所有进程
ps -aux # 终止pid为1095的进程
kill 1095 # 强制终止pid为1095的进程
# 9是信号强度,强制杀死
# 其他信号,-1 该信号让进程正常关闭,然后重新读取配置文件之后重启
# -15 正常结束进程的信号,kill命令默认信号
kill -9 1095 # 终止指定程序
killall 程序名 # pkill
pkill -9 httpd 强制终止进程
pkill -t -9 pts/1 强制杀死pts/1虚拟终端登入的进程

top

常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

linux的top命令参数详解

top       实时得查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),3s刷新一次
ps 来静态查看当前的进程信息
pstree 来查看当前活跃进程的树形结构。

pgrep

[root@wangbm web]# pgrep keepalived
21955
21956
21957
[root@wangbm web]# ps -ef|grep keepalived
root 21955 1 0 21:27 ? 00:00:00 /usr/sbin/keepalived -D
root 21956 21955 0 21:27 ? 00:00:00 /usr/sbin/keepalived -D
root 21957 21955 0 21:27 ? 00:00:00 /usr/sbin/keepalived -D
root 22035 12159 0 21:33 pts/0 00:00:00 grep --color=auto keepalived

2.4 设备信息管理

df

显示磁盘的相关信息

df -Th

free

输出内存的使用情况,m,g分别是指定单位,默认是kb

free -m
free -g

total 表示总内存大小;

used和free分别表示被使用和空闲内存大小;

share指可被多个进程共同享有的内存; buffers和cached用来保留最近访问的文件和数据,当其他进程需要更多的内存时,这些内容可以被缩减; Free命令还可以输出交换空间的相关信息。

ifconfig

显示或设置网络设备

last

列出目前与过去登入系统的用户相关信息。一般可用来查看系统重启记录

history

屏幕输出当前用户在命令行模式下执行的最后(1000个)命令

passwd

这个用于修改密码

非交互式修改密码

echo 'root12#$'| passwd --stdin root

reboot/shutdown

重启/关机

reboot/shutdown -r now

# reboot [-n][-w][d][-i]	重新启动计算机,使用权限是系统管理员
-n 重启前不将记录写回硬盘
-w 并不是真的重启,只是把记录写道/var/log/wtmp文件中
-d 不把记录写入/var/log/wtmp文件中
-i 重启谦先把所有与网络相关的装备停止

rpm

# 安装rpm包
rpm -ivh monitor-system-1.2-1.i386.rpm # 更新rpm包
rpm -U/Fvh (F只更新已存在的文件) # 查询包中的文件
rpm -ql monitor-system # 查询文件所属的包
rpm -qf /usr/local/squid/etc/squid.conf(绝对路径/到目录下查找) # 查询所有包
rpm –qa | grep squid # 卸载某个rpm包
rpm –e monitor-system

开启80端口

vi /etc/sysconfig/iptables

# 在22端口下面添加一行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT # 重启防火墙
/bin/systemctl restart iptables.service

修改时区

# 由EDT(美国)改成CST(中国)

$ mv /etc/localtime /etc/localtime.bak
$ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看机器连接的哪个交换机

$ service lldpd restart
$ lldpcli show nei sum # 查看JS_HuaiAnDXXZ4_166.3
-------------------------------------------------------------------------------
LLDP neighbors:
-------------------------------------------------------------------------------
Interface: eth1, via: LLDP
Chassis:
ChassisID: mac 00:6b:8e:01:1a:07
SysName: JS_HuaiAnDXXZ4_165.132_IPMI
Port:
PortID: local 39
PortDescr: Ethernet1/0/39
TTL: 120
-------------------------------------------------------------------------------
Interface: eth0, via: LLDP
Chassis:
ChassisID: mac 58:69:6c:62:7b:c2
SysName: JS_HuaiAnDXXZ4_166.3
Port:
PortID: ifname TenGigabitEthernet 0/41
PortDescr: TenGigabitEthernet 0/41
TTL: 121
-------------------------------------------------------------------------------

2.5 磁盘管理

df

显示指定磁盘文件的可用空间。

这里要理解挂载的概念。

所有的设备(磁盘/等其他介质)都需要挂载在一个目录,Linux才能访问数据。

具体可以参考这篇文章:df 命令

常用命令

$ df -Th
$ df -lh $ df -h 以1024来换算
$ df -H 以1000来换算 $ df -t ext3 指定设备类型
$ df -T 文件系统的类型
$ df -i 查看inode的使用情况

关于inode可以查看:inode的理解

du

查看目录的容量

$ du -h -d 0 ~

# 参数解释
-h 以人能看得懂的方式显示
-d 扫描的目录层级,0表示只有一个指定目录,1表示次级目录 ~ 是家目录,这里可以选你指定的目录 $ du -s
# 查看当前所处目录总容量大小,单位是k,不可跟-d $ du -a
# 查看当前所处目录及所有子目录的所有文件,单位是k,建议不用

查看文件的大小

$ du -h file.txt

dd

dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux的很重要的一点,一切即文件,在 Linux上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCIIEBCDIC编码间互换。

这里有篇文章讲得很好:Linux-dd命令详解

补充一点

# 输出到文件
$ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1 # 输出到标准输出
$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
# 注
在打完了这个命令后,继续在终端打字,作为你的输入

前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件

dd if=/dev/stdin of=test bs=10 count=1 conv=ucase

制作虚拟镜像并挂载

# 制作虚拟镜像
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ mkfs.ext4 virtual.img # 使用一个循环设备(/dev/loop)连接虚拟镜像文件
$ sudo losetup /dev/loop0 virtual.img # 挂载前查看下当前已挂载的设备
$ sudo mount # 挂载
$ sudo mkdir /mnt/point
$ sudo mount /dev/loop0 /mnt/point # 上面连接虚拟镜像文件和挂载设备两条命令可以合并成一条,挂载类型可以省略,会自动识别
$ sudo mount -o loop [-t ext4] /mnt/point # 再次查看挂载的设备,就可以发现我们新挂载的
$ sudo mount # 卸载:一定要加-fl。不然无法卸载
$ sudo umount -fl /mnt/point # 查看所有与文件相关联的 loop 设备
$ losetup -a
# 卸载
$ losetup -d /dev/loop0

2.6 任务管理

一次性任务(at)

创建定时任务
$ sudo apt-get install at
$ at now+5 minutes
at>/bin/ls
at><EOL> # 就是Ctrl+d
job 2 at Sum Oct 15 14:58:00 2017 # 结束的时候,告知执行时间
管理定时任务
$ atq  # 可以查看当前还有那些定时任务,会显示任务号

# 查看具体任务代码
$ at -c <job_no> # 删除任务
$ atrm <job_no>

例行性任务(crontab)

参考以下文字

  1. 每天一个linux命令(50):crontab命令
  2. 鸟哥的私房菜

做个示例

# 检查crond服务是否启动
$ ps aux|grep crond # 创建任务
$ crontab -e # 输入1 回车
# 任务是:每天凌晨3点备份日志到/home/temp/目录,文件名为日期
# 跳到文件尾部输入任务:* 3 * * * cp alternatives.lob /home/temp/$(date \%Y-\%m-\%d)。保存退出
# 注意%需要加\来转义,不然会被当成换行使用 # 查看任务
$ crontab -l # 删除任务(当前用户),当然也可以指定用户
$ crontab -r [-u user]

Linux 命令行

三、用户/权限管理

3.1 用户管理

创建用户

【useradd和adduser区别】
useradd:只创建用户,创建完了用 passwd lilei去设置新用户的密码。更像一种命令。 adduser:会创建用户,创建目录,创建密码(提示你设置),做这一系列的操作。更像是一个程序,执行确认一系列操作。

删除用户

sudo deluser lilei --remove-home

切换用户

su [user]   # 切换到其他用户,环境变量不变,还是当前路径,如果不指定user,就切换到root

su - [user]  # 切换到其他用户,环境变量也切换,路径变为user家目录,如果不指定username,就切换到root,相当于使用user进行登录

Ubuntu切换用户

# 切换到root
$ sudo su # 切换到普通用户
$ su user

CentOS

$ su
$ su root
$ su -
$ su -root $ su user
$ su -user

用户组

1. 每个用户都至少属于一个用户组,创建的时候如果不指定,就和当前用户的组一样(root用户组除外)。
2. 一个用户可以属于多个用户组。
# 查看所属用户组
$ groups [user]

UID/GID/组ID

# 显示相关信息,如要查看root用户的信息
id root # 所有文件都保存在/etc/)asswd
vi /etc/passwd

管理用户:查看用户的UID和GID

管理密码:Linux下/etc/shadow文件

添加sudo用户组

【第一种方法】
在root下,visudo或者vi /etc/sudoers,找到root ALL=(ALL)的下一行添加一行,user ALL=(ALL),user是对应的用户名 【第二种方法】
在root下,使用命令sudo usermod -G sudo user,将user加入sudo用户组

sudo免密

当有些操作只有root用户才能操作的时候,怎么办?

1.我们需要切换到root用户操作。

2. 当前用户属于sudo组,可以使用sudo [command]

3. 使用sudo输入一次密码免密使用5分钟。还是太麻烦,可以配置当前用户免密执行sudo。

如何免密配置

vi /etc/sudoers.d/<user>

# 添加内容
# 如果要指定特定的命令不需要密码的话,就把ALL替换成命令路径,如下
# NOPASSWD: /sbin/mount, (root) NOPASSWD: /bin/umount
<user> ALL=(ALL) NOPASSWD:ALL
Defaults:shiyanlou !requiretty # 有时候,虽然用户设置免密了,但是还是需要输入密码,是group覆盖了,需要把group也设成免密。

参考资料:sudo免密

3.2 权限管理

更改文件所有者和所属组

[sudo] chown 用户组:用户 文件/文件夹

# 如下只更改所属用户
[sudo] chowm 用户 文件/文件夹

修改文件权限

文件权限有执行三种

分别对应数字4,2,1,也就是22,21,2^0

Linux 命令行

如何修改文件权限

【第一种方法】
chmod 777 文件 【第二种方法】:加减的方法
g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。 举个例子
比如一个文件权限是:-wr-wr-wr-
chmod go-wr 文件 然后文件权限就变成:-wr-------

禁止修改、删除、移动文件

chattr -ichattr +i

+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。 命令:chattr [ -RV ] [ -v version ] [ mode ] files A: 文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S: 硬盘I/O同步选项,功能类似sync。
a: 即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文 件安全,只有root才能设定这个属性。
c: 即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d: 即no dump,设定文件不能成为dump程序的备份目标。
i: 设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
j: 即journal,设定此参数使得当通过 mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s: 保密性地删除文件或目录,即硬盘空间被全部收回。
u: 与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.

四、网络管理

iptables

命令格式

iptables [-t table] 命令 [chain] [rules] [-j target]

【参数解释】
table 表名:filter、nat、mangle、raw,后两者不常用
命令 对链的操作命令
-P或–policy 定义默认策略
-L或–list 查看iptables规则列表
-A或—append 在规则列表的最后增加1条规则
-I或–insert 在指定的位置插入1条规则
-D或–delete 从规则列表中删除1条规则
-R或–replace 替换规则列表中的某条规则
-F或–flush 删除表中所有规则
-Z或–zero 将表中数据包计数器和流量计数器归零
chain 链名:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTIN rules 规则,可以说是匹配规则。
分为
1. 【通用匹配】
-s: 指定作为源地址匹配,必须是IP,取反,就加一个!
-d: 表示匹配目标地址
-p: 用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据,流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据,流出一般在OUTPUT和POSTROUTING上 2. 【扩展匹配】
-p tcp: TCP协议的扩展。一般有三种扩展
--dport: 指定目标端口,--dport 21或者 --dport 21-23 (此时表示21,22,23),不能表示非连续端口
--sport: 指定源端口 --tcp-fiags: TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn = --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn -p udp: UDP协议的扩展
--dport
--sport -p icmp: icmp数据报文的扩展
--icmp-type:
echo-request(请求回显), 一般用8 来表示
echo-reply (响应的数据包) 一般用0来表示

参考文章

  1. ubuntu配置iptables
  2. netfilter/iptables全攻略
  3. iptables详解

开放端口

# 在filter表里添加规则
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT # 重启iptables
$ service iptables restart # 监听端口
$ nc -lp 8500 & # 检测是否开启完成
$ netstat -tunl|grep 8500

端口转发

# 按开放端口配置好后才可转发。
# 假设我们现在要将36.250.x.x的8500端口转发到192.168.2.55的80端口上 # filter表
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT # nat表
-A PREROUTING -d 36.250.x.x -m tcp -p tcp --dport 8500 -j DNAT --to-destination 192.168.2.55:80 # 测试一下,在浏览器输入 36.250.x.x:8500
# 就可以看到我们的内容了。

ip 命令

# ubuntu 临时修改网络,需要刷新一下
ip addr flush dev ens4

六、Shell命令

6.1 定时任务

命令执行顺序控制

1、&&
方式:command1 && command2
如果command1执行成功,则执行command2 2、||
方式:command1 || command2
如果command1执行失败,则执行command2

管道通信

$ ps aux | grep mysqld

# 将ps aux得到的结果传给grep命令

nohup

一般在一终端或一个SSH连接运行一个软件或服务,该软件或服务的生命周期受终端/SSH连接影响,关闭后就自动也停止。

为了将程序放在后台运行,可以使用nohup命令

$ nohup 程序路径/程序名 &

alias

给常用的长命令取别名,变成短的,提高效率

# 查看现有别名
$ alias # 添加别名
$ alias catgra='cat /var/lib/mysql/grastate.dat' # 取消别名状态
# 比如我们的ll,系统默认给我们加了别名,ll='ls -l --color=auto',也就是加上颜色效果
# 如果我们不要颜色效果,可以这样使用转义符,使用原生的命令
$ \ll somedir

column

一个很好用的命令,经常用于管道符后,进行文本展示

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=3996196k,nr_inodes=999049,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) # 使用后,t是按表格的形式展示,-s "@" 指定分割符
$ mount | column -t
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=3996196k,nr_inodes=999049,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)

重定向

>/dev/null 2>&1 &

分析下这个语句

command >/dev/null 2>&1 &

执行command后的标准输出不在屏幕显示,而是直接丢入/dev/null 垃圾桶,如果有错误输出,则重定向到标准输出。最后&表示在后台运行。

七、业务相关

查看虚机的CPU是否支持虚拟化

egrep '(vmx|svm)' /proc/cpuinfo
# 如果有标红的vmx(Intel)、svm(AMD)说明就支持,virtualbox不支持(坑) # 或者直接查看
vi /proc/cpuinfo

查看模块是否加载

lsmod | grep kvm

开启服务

# CentOS 6
service xx start # CentOS 7
systemctl start libvirtd

开机自启动服务

CentOS 6
chkconfig acpid on # CentOS 7
systemctl enable libvirtd

开启shh登录,修改端口等配置

vi /etc/ssh/sshd_config
-------------------------------------
Port 57891
PasswordAuthentication yes
ClientAliveInterval 60
ClientAliveCountMax 10

关闭防火墙

setenforce 0
service firewalld stop
chkconfig firewalld off

换yum源

yum install wget

mv /etc/yum.repos.d/CentOS-Base.repo /root/

# 下载yum源,这里是CentOS6的,请下载对应版本
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo yum clean all
yum makecache

推荐阅读

上一篇:leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search


下一篇:H5 65-清除浮动方式一