普通用户切到root
- 不需要知道root密码
sudo su root
输入自己的密码即可 - 或者
sudo -i
touch
- 创建多个
touch a_{1..9}.txt
vim
-
插入操作 aio AIO
- i 当前字符之前插入 (光标前)
- I 行首插入 (行首)
- a 当前字符之后插入 (光标后)
- A 行尾插入(行尾)
- o下一行插入 (另起一行)
- O上一行插入(上一行插入)
- x 向后删除一个字符 等同于delete
- X 向前删除一个字符
- u 撤销一步 每按一次就撤销一次
- r 替换
-
光标定位
- 0 和 home键表示切换到行首, $和end键表示切换到行尾
- gg 快速定位到文档的首行 , G定位到未行
- 3gg 或者 3G 快速定位到第3行
-
查找
- /string 回车之后 N向上查找 n向下查找
/^d ----^
查找以字母d开头的内容/t$
查找以字母t结尾的内容vim + a.txt
光标会自动位于文件的最后一行
-
ctrl + v 进入列模式
ctrl + v 进入列模式
向下或向上移动光标,把需要注释、编辑的行的开头选中起来
然后按大写的I ,输入需要插入的字符 例如 #
按esc 完成插入 #
- 取消多行注释 选中后 按
d
即删除
-
文本替换
- 格式 : 范围(其中%所有内容) s分隔符 旧的内容 分隔符 新的内容 (分隔符可以自定义)
默认是每一行的第一个符合要求的词 (/g全部) - :1,3 s/bin/xuegod 替换第1到3行中出现的第一个bin进行替换为xuegod
- :1,3 s/bin/xuegod/g 替换第1到3行中查找到所有的bin进行替换为xuegod
- :3 s/xue/aaaaa #只把第3行中内容替换了
- :% s/do/xuegod/g 将文本中所有的do替换成xuegod
- :% s/do/xuegod/gi 将文本中所有的do替换成xuegod, 并且忽略do的大小写
- :% s@a@b@g 将文本中所有的a替换成b
- 格式 : 范围(其中%所有内容) s分隔符 旧的内容 分隔符 新的内容 (分隔符可以自定义)
-
自定义vim使用环境
- 临时设置
- :set nu 设置行号
- :set nonu 取消设置行号
- :noh 取消高亮显示
- 永久设置环境 写入
set nu
- vim /etc/vimrc 设置后会影响到系统所有的用户
- ~/.vimrc 当前用户有效
- 临时设置
文件的attr扩展属性
查看
- lsattr hack.sh
参数
- +a: 只能追加内容 如: echo aaa >> hack.sh
- +i:即Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
chattr +i hack.sh
移除
- -i :移除i参数。 -a :移除a参数
tar
解压和压缩tar包
- 压缩
tar -cvf aaa.tar ./aaa
- 解压
tar -xvf aaa.tar
- 指定解压位置 -C
tar -xvf aaa.tar -C /opt
tar 归档+压缩
- -z .tar.gz
- -j tar.bz2
- -J tar.xz
zip管理压缩文件
- 压缩
zip a.zip /etc/passwd
- 解压
unzip a.zip
- 解压指定目录
unzip a.zip -d /opt/
查看整个目录的大小
- du -sh /opt
- du -h --max-depth=1 // 深度为1
sort 排序
- sort -t “:” -k3 -r /etc/passwd | more #按: 做分隔符,以第3列,也就是用户UID,来从大到小排序
- du -h /etc | sort -r | more #把etc目录下所有文件,按从大到小排序
ps 进程状态
ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- 最后一列[xxxx] 使用方括号括起来的进程是内核态的进程,没有括起来的是用户态进程
- 参数解释
- USER: 启动这些进程的用户
- PID: 进程的ID
- %CPU 进程占用的CPU百分比;
- %MEM 占用内存的百分比;
- VSZ:进程占用的虚拟内存大小(单位:KB)
- RSS:进程占用的物理内存大小(单位:KB)
- STAT:该程序目前的状态,Linux进程有5种基本状态:
- R :该程序目前正在运作,或者是可被运作;
- S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
- T :该程序目前正在侦测或者是停止了;
- Z :父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
- D 不可中断状态.
- ps: 5个基本状态后,还可以加一些字母
- <: 表示进程运行在高优先级上
- N: 表示进程运行在低优先级上
- L: 表示进程有页面锁定在内存中
- s: 表示进程是控制进程
- l: 表示进程是多线程的
- +: 表示当前进程运行在前台
- START:该 process 被触发启动的时间;
- TIME :该 process 实际使用 CPU 运作的时间。
- COMMAND:该程序的实际指令
查看进程状态
- 例如
终端一: vim a.txt
终端二: ps -aux | grep a.txt #查看状态 S表示睡眠状态, + 表示前台
终端一: 在vim a.txt 这个终端上 按下: ctrl+z
终端二: ps -aux | grep a.txt #查看状态 T表示停止状态
- ctrl-c 是发送 SIGINT 信号,终止一个进程
- ctrl-z 是发送 SIGSTOP信号,挂起一个进程。将作业放置到后台(暂停)
- ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
D 不可中断状态
- 示例
终端一: tar -zcvf usr-tar.gz /usr/
终端二:不断查看状态,由S+,R+变为D+
uptime
- 查看 查看系统负载
top
- 快捷键
- 默认3s刷新一次,按s修改刷新时间
- 按空格 :立即刷新。
- q退出
- P:按CPU排序
- M:按内存排序
- T按时间排序
- p: 进程IP,查看某个进程状态
- 数字键1:显示每个内核的CPU使用率
- u/U:指定显示的用户
- top -p 9667
lsof
- 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)
- 参数
- -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
- -p<进程号>:列出指定进程号所打开的文件;
- lsof -p pid #一般用于查看木马进程,在读哪些文件
- lsof -i :22 #用于查看端口,或查看黑客开启的后门端口是哪个进程在使用
fg jobs 前后台进程切换
- 示例
vim a.txt 按下: ctrl+z
ps -axu | grep vim 存在后台
jobs #查看当前有多少在后台运行的进程
fg 1 #将后台挂起的进程恢复到前台运行
文件描述符 0、1、2
输入输出标准说明
- STDIN 标准输入 默认的设备是键盘 文件编号为:0
- STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件
- STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件
查看一个进程打开了哪些文件
- ll /proc/进程ID/fd
- ulimit -n #查看一个进程最多可以同时打开的文件数
- ulimit -n 2048 #修改一个进程最多可以同时打开的文件数为2048
输入输出重定向
- 正确的内容写入一个文件,错误的写入一个文件
ls /tmp xxxx >ok.txt 2> err.txt
- &>和>&符号
- 把正确和错误的消息输入到相同的位置
- ls /tmp xxxx >1.txt 2>&1
/dev/null
- 生成一个50m的空文件
dd if=/dev/zero of=b.txt bs=1M count=50
文件查找
- 查找文件一般有以下几个命令
which 查看可执行文件的位置
whereis 查看可执行文件的位置及相关文件
locate 配合数据库缓存,快速查看文件位置
grep 过滤匹配,它是一个文件搜索工具
find 查找相关文件
locate
- locate它搜索的是一个数据库/var/lib/mlocate/mlocate.db,这个数据库中存有本地所有的文件信息;这个数据库是Linux自动创建并每天自动更新维护。相关的配置信息在/etc/updatedb.conf,查看定时任务信息在/etc/cron.daily/mlocate
- 示例
touch /opt/aaa.txt
locate aaa.txt // 发现找不到
updatedb #如果对当天文件查找,需要手动更新数据库updatedb
find 命令
- 格式
格式:find pathname -options [-print]
命令字 路径名称 选项 输出
参数
-name 按照文件名查找文件。 “名称”
-perm 按照文件权限来查找文件。666 777 等
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n / +n 按照文件的更改时间来查找文件,
- n 表示文件更改时间距现在n天以内
+ n 表示文件更改时间距现在n天以前
-type 查找某一类型的文件
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l- 符号链接文件
f - 普通文件
-size n 查找符合指定的文件大小的文件
-exec 对匹配的文件执行该参数所给出的其他linux命令, 相应命令的形式为' 命令 {} \;,注意{ }和 \;之间的空格,{}代表查到的内容
- 示例
- 查看当前目录下所有的TXT格式的文件
find . -name "*.txt"
- 按照更改时间或访问时间等查找文件
- mtime: 文件最后一次修改的时间
- atime: 最后一次访问时间
- ctime: 文件的最后一次变化时间,也就是修改时间
- root目录下查找更改时间在1天以内,被黑客修改的文件
find /root/ -mtime -1
- 查看当前目录下所有的TXT格式的文件
-exec
- 这个选项参数后面可以跟自定义的SHELL命令
find . -name "*.back" -exec ls -l {} \;
find . -name "*.back" -exec mv {} /opt \;
查找多个类型文件
- 加上比较运算符
-a and 并且
-o or 或者
+ 超过
- 低于
// 示例
touch a.pdf back.sh
find . -name "*.sh" -o -name "*.pdf"
find /etc -size +20k -a -size -50k | wc -l
find /etc -size +20k | wc -l
按权限查找:-perm
查看系统中权限至少为777的文件或目录 find /root/ -perm 777
系统中权限不低于777的危险文件查找出来 find / -type f -perm -777
查找的目录深度 -maxdepth
查找/bin目录下权限等于755的可执行的文件
find /bin/ -maxdepth 1 -perm 755 #/bin后面要有/
查找系统中所有属于用户mk的文件,并把这个文件,放到/root/res 目录下
find / -user mk -exec cp -a {} /root/res/ \;
有问题会有重名的
命令判断
;
不考虑指令的相关性,连续执行&&
只有在前面的命令执行成功后,后面的命令才会去执行||
如果前面的命令执行成功,后面的命令就不去执行了‘
文件系统结构
- Linux文件系统由三部分组成 : 文件名,inode,block
- Linux文件系统: ext3,ext4,xfs
inode包含文件的元信息
ctime指inode上一次文件属性变动的时间,change time 。 比如: chmod +x a.sh
mtime指文件内容上一次变动的时间,modify time 。如:echo aa >> a.sh 或vim a.sh 修改内容
atime指文件上一次查看文件的时间,access time 。 如: cat a.sh
创建软连接 windows的快捷方式
- 语法
ln -s 源文件 软链接的名字
源文件被删除,链接文件失效
awk 使用
语法结构
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file
- 特殊模块:
- BEGIN语句设置计数和打印头部信息,在任何动作之前进行
- END语句输出统计结果,在完成动作之后执行
- awk内置变量(预定义变量)
$n 当前记录的第n个字段,比如: $1表示第一个字段,$2表示第二个字段 $0 这个变量包含执行过程中当前行的文本内容 FILENAME 当前输入文件的名 FS 字段分隔符(默认是空格) NF 表示字段数,在执行过程中对应于当前的字段数, $NF最后一列 FNR 各文件分别计数的行号 NR 表示记录数,在执行过程中对应于当前的行号 OFS 输出字段分隔符(默认值是一个空格) ORS 输出记录分隔符(默认值是一个换行符) RS 记录分隔符(默认是一个换行符)
- 常用的命令选项:
- -F fs指定分隔符
- -v 赋值一个用户自定义变量
- -f 指定脚本文件,从脚本中读取awk命令
分隔符的使用
- 用法:
-F[fs]
其中fs是指定输入分隔符,fs可以是字符串或正则表达式;分隔符默认是空格 - 常见写法:
-F: -F, -F[Aa]
- 示例
echo "AA BB CC DD"|awk '{print $2}' // BB
echo "AA|BB|CC|DD"|awk -F"|" '{print $2}' // BB
echo "AA,BB,CC,DD"|awk -F"," '{print $2}'
echo "AA,BB,CC,DD"|awk -F, '{print $2}'
awk -F: '{print $1}' /etc/passwd #以:分隔,打印第1列用户名
## 指定多个分隔符
echo "12AxAbADXaAD52" | awk -F"[aA]" '{print $6}'
使用FS指定分隔符
echo "12AxAbADXaAD52" | awk 'BEGIN {FS="aA"} {print $2}'
过滤出本系统的IP地址
ifconfig | grep netmask | awk '{print $2}'
关系运算符的使用 (条件查询) || $NF 最后一行
- 示例
## 或与非
awk'$3>$4{print $1}'
awk'$1~/^....user/ && $3==985'
awk '{if($1~/^....user/ || $3 == 1001)print}'
awk'!($1~/^....user/)'
## 运算符
echo "3 2 3 4 5" > a.txt
awk '{print $1+10}' a.txt // 13
## $NF 最后一行
echo "one two three four" | awk '{print $NF}'
echo "one two three four" | awk '{print $(NF-2)}' #打印倒数第3列
echo "one two three four" | awk '{print $(NF/2-1)}'
打印出passwd文件中用户UID小于10的用户名和它登录使用的shell
awk -F: '$3<10{print $1 $NF}' /etc/passwd #直接输出格式太乱
awk -F: '$3<10{print $1 "<======>" $NF}' /etc/passwd #awk格式化输出
awk -F: '$3<10{print $1 "\t" $NF}' /etc/passwd
打印出系统中UID大于1000且登录shell是/bin/bash的用户
awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1 "\t" $NF}' /etc/passwd
当前系统内存使用百分比为: grep -i 忽略大小写
free -m | grep -i mem | awk '{print $3/$2*100 "%"}'
打印 从某一列开始 一直到最后一列
top -b -n 1 | awk 'NR==1 {for (i=12;i<=NF;i++)printf("%s ", $i);print ""}'
awk高级应用
- 命令格式:
awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’file
-F 指定分隔符
-f 调用脚本
-v 定义变量
‘{}’ 引用代码块
{…} 命令代码块,包含一条或多条命令
BEGIN 初始化代码块
/ str / 匹配代码块,可以是字符串或正则表达式
{print A;print B} 多条命令使用分号分隔
END 结尾代码块
- 在awk中,pattern有以下几种:
1. empty空模式,这个也是我们常用的
2. /regular expression/ 仅处理能够被这个模式匹配到的行
打印出 root开头的行
awk -F: '/^root/{print $0}' /etc/passwd
行范围匹配 startline,endline
输出行号大于等于3且行号小于等于6的行
awk -F: '(NR>=3&&NR<=6){print NR,$0}' /etc/passwd
- NR 和 FNR 的区别 (显示行号)
NR 在读取另一个文件时候 行号不会重新从1开始,NR是一直加的
awk '{print NR"---" $0}' /etc/hosts /etc/hosts.bak
FNR 在读取另一个文件时候 行号会重新从1开始
awk '{print FNR"---" $0}' /etc/hosts /etc/hosts.bak
- 去除首行的结果
ls -lah | awk 'NR!=1 {print $0}'
- 匹配
使用awk查出以包括root字符的行
awk -F: "/root/{print}" /etc/passwd
awk -F: "/root/" /etc/passwd
awk -F: '/root/{print $0}' /etc/passwd
做一个不匹配root行:
awk -F: '!/root/{print $0}' /etc/passwd
以root开头的行:
awk -F: '/^root/{print $0}' /etc/passwd
以bash结尾的行:
awk -F: '/bash$/{print $0}' /etc/passwd
lsof 列出打开文件(lists openfiles)
获取网络信息
lsof -i
显示所有连接,类似netstatlsof -i 6
仅获取IPv6流量lsof -iTCP
仅显示TCP连接(同理可获得UDP连接)lsof -i :22
显示与指定端口相关的网络信息lsof -i@192.168.1.1
@host来显示指定到指定主机的连接lsof -i@192.168.1.1:22
显示基于主机与端口的连接lsof -i -sTCP:LISTEN
找出监听端口lsof -i | grep -i LISTEN
lsof -i -sTCP:ESTABLISHED
找出已建立的连接
获取用户信息
lsof -u deploy
显示指定用户打开了什么lsof -u ^deploy
显示除指定用户以外的其它所有用户所做的事情kill -9 `lsof -t -u daniel`
干掉指定用户所做的一切事情
命令和进程
lsof -c nmap
查看指定的命令正在使用的文件和网络连接lsof -p 10075
查看指定进程ID已打开的内容
文件和目录
lsof /home/deploy
显示与指定目录交互的所有一切lsof /home/deploy/a.txt
显示与指定文件交互的所有一切
查看cpu核数
1.lscpu
2. cat /proc/cpuinfo | grep name
sed strem editor 流编辑器
执行过程
sed的执行过程:
1. 一次读取一行数据
2. 根据我们提供的规则来匹配相关的数据,比如查找root。
3. 按照命令修改数据流中的数据,比如替换
4. 将结果进行输出
5. 重复上面四步
使用
语法格式:sed [options] ‘[commands]’ filename
示例:
echo "this is aplle" | sed 's/aplle/dog/' -- // this is dog
sed选项|参数
options:
-a 在当前行下面插入文件
-n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
-i 编辑文件内容 ***
-e 执行多个sed指令
-f 运行脚本
-i.bak 编辑的同时创造.bak的备份
-r 使用扩展的正则表达式
命令:
i 在当前行上面插入文件
c 把选定的行改为新的指定的文本
p 打印 ***
d 删除 ***
w 另存
s 查找
r/R 读取文件/一行
y 替换
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
D 删除\n之前的内容
P 打印\n之前的内容
替换标记:
数字:表明新文本将替换第几处模式匹配的地方
g:表示新文本将会替换所有匹配的文本
\1:子串匹配标记,前面搜索可以用元字符集\(..\),
&:保留搜索到的字符用来替换其它字符
sed匹配字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
参考使用示例
1. s 只替换第一个匹配到的字符,
echo "this is cat1 cat2 cat3" | sed 's/cat/dog/'
2. g 全局替换
echo "this is cat1 cat2 cat3" | sed 's/cat/dog/g'
3. 将sed中默认的/ 定界符改成#号
4. 换默认分隔符
echo "this is cat1 cat2 cat3" | sed 's#cat#dog#g'
5. 按行查找替换 用数字表示行范围;$表示行尾
5.1 单行替换,将第2行中bin替换成xuegod
cat /etc/passwd | sed '2s/bin/xuegod/'
5.2 多行替换,如果涉及到多行处理,用逗号表示行间隔。 将第3行到最行尾中bin替换成xuegod
cat /etc/passwd | sed '2,$s/bin/xuegod/'
6. 删除
6.1 d 删除第3行到最后一行的内容
cat /etc/hosts|sed '3,$d'
6.2 将包括 127.0.0 的行删除
cat /etc/hosts|sed '/127.0.0/d'
7. 添加行 i\ 当前行前插入 a\ 当前行后面追加
cat /etc/hosts |sed 'a\append' // 在每一行后面都追加
cat /etc/hosts |sed 'i\insert' // 在每一行前面都插入
cat /etc/hosts |sed '$a\append' // 在每一行后面都追加
cat /etc/hosts |sed '$i\insert' // 在每一行前面都插入
在某一行之前或者之后,只操作一次
cat /etc/hosts |sed '2a\append' // 只会在第二行后面追加append
在 n - m 行 追加或者插入
cat /etc/hosts |sed '2,4a\ append'
8. 修改行命令c (change) c\
8.1 将第4行内容改成 hello world
cat /etc/hosts |sed '4c\hello world'
8.2 将第4行 - 最后一行 内容改成 hello world
cat /etc/hosts |sed '4,$c\hello world'
8.3 将包括127.0.0.1 行的内容修改成192.168.1.1
cat /etc/hosts | sed '/127.0.0.1/c\192.168.1.1'
9. 打印,直接输入文件中的内容
cat /etc/hosts | sed -n '2,4p'
10 . -i 对原文件修改,保存 使用场景: 替换或修改服务器配置文件
sed -i 's/IPADDR=192.168.1.63/IPADDR=192.168.1.65/'
网卡相关配置
- centos
vi /etc/sysconfig/network-scripts/ifcfg-xxx
systemctl restart network
- ubuntu
网卡配置放在 /etc/network/xxx
我配置的版本是 /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto dsl-provider
iface dsl-provider inet ppp
pre-up /bin/ip link set eno1 up # line maintained by pppoeconf
provider dsl-provider
# ps eno1插了网线 设置静态ip
auto eno1
iface eno1 inet static
address 192.168.1.104
netmask 255.255.255.0
gateway 192.168.1.1
auto eno2 # 没有插网线 不管了
# iface eno1 inet manual
iface eno2 inet dhcp