linux 常用命令 实用命令
1. yum 命令
# yum repolist // 查看已启动的仓库
# yum info httpd // 查看是否有httpd 安装包可以安装
# rm -rf /var/run/yum.pid // 强制关掉yum进程
# yum list all // 显示可用安装包
# yum clean all // 清除缓存
# yum makecache // 建立缓存
# yum install epel-release // 安装epel源
# yum install hping3 // 快速ping的工具 模拟DDOS # hping 192.168.10.14 --fast # hping3 -h 帮助命令 在epel源
# yum install bash-completion // 自动 补全命令 插件
# yum install lrzsz // 拖动文件
rz 上传
sz a.txt 下载
# yum install dos2unix // 在windows上编辑的脚本换行符不一样 需要转换成unix格式
dos2unix a.txt // 转换成 unix格式
关于 Linux 与 Windows 文件格式
vim 修改文件格式
:set ff // 查看文件格式
:set ff=unix // 修改文件格式 unix
文件为dos格式 linux 会报错 bin/bash^M: bad interpreter: No such file or directory
2 rpm 命令
# rpm -qa | grep nginx // 查看系统所有的rpm包
# rpm -qf /etc/nginx/nginx.conf // 查看系统中一个已知的文件属于哪个rpm包
# which grep // 查询某一命令由哪个安装包提供 配合上面命令使用
# rpm -ql nginx // 查询已安装的软件包的相关文件的安装路径
# rpm -qi nginx // 查询一个已安装软件包的信息
# rpm -qc nginx // 查看已安装软件的配置文件
# rpm -qd nginx // 查看已安装软件的文档的安装位置
# rpm -qR nginx // 查看已安装软件所依赖的软件包及文件
3. 文件查询 切割等操作
# grep 'Client' a.txt // 查找有Client 所在的行
# grep -A 1000 'Aug 8' a.txt // 查找 Aug 8 所在的行 及下面1000行
# grep -e'Aug 12' -e 'Aug 13' // 删除 Aug 12 或 Aug 13
# grep -v '61.31.168.61' a.txt // -v反向
# cut -d' ' -f 2-4,8,9 a.txt // 以空格为分隔符 切割 保留第23489字段
# sed 's/^ *//' a.txt // 删除字段前面的所有空格
# sort -t ' ' -k3,3 -u -n a.txt // 以空格为分隔符 以第3字段到第3字段为重复标准 排序 -u去重复 -n以数字大小进行排序
# grep Client messages | grep 'Aug 8' | cut -d' ' -f3,4,9 -u -n // 筛选系统日志需要的字段
4. xshell中设置
❶. xshell linux 不能使用 删除键 属性 键盘 勾选 两个 ASCII
❷. xshell vim 不能使用 小键盘 属性 vty 设为普通
❸. xshell 连接 使用 vim 退出 后屏幕仍然显示 属性 终端 改为 xterm
或 # vim ~/.bashrc // 编辑 文件
export TERM=xterm // 末尾 添加
# source ~/.bashrc // 使source生效 也可重新连接
5. vim 中常用命令
❶. vim 中 按到 ctrl+z 退出了 命令行输入 fg 返回
❷. vim 中 提示有文件打开 使用 ls -a 删除以.开头的+要打开的文件名的文件
❸. rx 更改字符 rx 将当前光标下的字符更改为x(x为任意字符)
❹. ~ 更改当前光标下的字符的大小写
❺. D 或 d$ 删除当前光标 后面的所有字符
❻. :%s/a/b/g 将整个文件的所有a替换为b
❼. %s/^[[:space:]]//g 删除行首的空格
❽. 删除空白 ^v 块选择 jk移动 d 删除 可以删除 空白
❾. 整段缩进 ^v 块选择或者shift +v按一下 jk移动 shift + > 向右移动
❿. 加#注释 ^v 块选择 --> jk移动 --> shift + i --> shift + # --> esc
❿. set nu 显示行号
❿. set nonu 关闭行号
6. 关于查看系统配置等命令
# systemctl list-unit-files // 查看所有服务的状态
# systemctl is-enabled httpd // 查看某一服务是否开机启动
# systemctl daemon-reload // 重载 systemctl 配置
# cat /etc/centos-release // 查看centos 系统版本
# uname -a // 查看系统内核版本
# df -hl // 查看磁盘 总用量
# df -hT // -T 列出文件系统的类型
# free -m // 查看剩余内存
# who -a // 查看最近用户登录
# top
# netstat -tnlp // 查询 所有端口号 对应的进程 命令由net-tools提供
# hostname Teo // 临时设置主机名
# hostnamectl set-hostname Teo // 永久设置主机名
# hostnamectl // 查询系统相关信息及版本
# uptime // 查看系统负载 5分钟 10分钟 15分钟
# cat /etc/passwd // 查看系统有哪些用户
# userdel -r haha // 删除用户 连同家目录
# w // 看谁在线
# last | head // 最后的登录的时间
# pkill -KILL -t pts/0 // 杀掉终端
7. nginx相关命令
# usr/local/nginx/sbin/nginx -v // 显示Nginx的版本信息
# usr/local/nginx/sbin/nginx -V // 显示Nginx的版本信息 及 编译安装时的参数
# usr/local/nginx/sbin/nginx -t // 仅测试配置文件是否有错
# usr/local/nginx/sbin/nginx -s quit // 优雅停止nginx 先关闭端口 停止接受 处理完当前请求 才停止nginx
8. 常用 目录 配置文件
❶. /etc/sysconfig/network-scripts/ens33 // 网络属性配置文件
❷. /etc/yum.repos.d/ // yum 仓库 配置文件
❸. /etc/sysconfig/selinux // selinux 配置文件 修改需要reboot才生效
❹. /etc/ssh/sshd_config // ssh 配置文件 # systemctl restart sshd 修改端口需要重启服务
❺. /etc/profile // 历史记录配置文件
shopt -s histappend // 改为追加形式
HISTSIZE="3000" // 默认保留1000条
9. 查看各软件版本
# mysql -V // 查看 Mariadb 版本
# httpd -v // 查看 Apache 版本
# zabbix_server -V // 查看 Zabbix 服务器版本
# zabbix_agentd -V // 查看 Zabbix 客户端版本
# /usr/local/nginx/sbin/nginx -V // 查看 Nginx 版本及编译的信息
10. 关闭selinux
# vim /etc/sysconfig/selinux
SELINUX=disabled // 永久关闭 需要重启
# getenforce // 查询状态
# setenforce 0 // 临时关闭
11 更改系统语言
# echo $LANG // 查看当前操作系统的语言
中文: zh_CN.UTF-8
英文: en_US.UTF-8
# export LANG=en_US.UTF-8 // 临时更改默认语言,当前立即生效 重启失效
# vim /etc/locale.conf // 此为centos7 如果是centos6 使用vim /etc/sysconfig/i18n
LANG=“en_US.UTF-8”
# source /etc/locale.conf // 立即生效
12 设置开机启动 几种方法
1 修改开机启动文件:/etc/rc.local(或者/etc/rc.d/rc.local)
# vim /etc/rc.d/rc.local // 把要执行的命令 写到最后即可 最好不用 启动的时候容易出错
# chmod +x /etc/rc.d/rc.local // 需要给执行权限 默认是没有的 /etc/rc.local 只是软连接而已
2 将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下 系统启动后就会自动执行该目录下的所有shell脚本。
# /etc/profile.d/aaa.sh // 把要执行的命令 写到 脚本即可
/usr/local/tg/bin/telegram-cli -k /usr/local/tg/tg-server.pub -WDCRE -P 8890 -d &>/dev/null &
3 通过chkconfig命令设置 // 未测试
# 1.将(脚本)启动文件移动到 /etc/init.d/或者/etc/rc.d/init.d/目录下。(前者是后者的软连接)
mv /www/wwwroot/test.sh /etc/rc.d/init.d
# 2.启动文件前面务必添加如下三行代码,否侧会提示chkconfig不支持。
#!/bin/sh 告诉系统使用的shell,所以的shell脚本都是这样
#chkconfig: 35 20 80 分别代表运行级别,启动优先权,关闭优先权,此行代码必须
#description: http server 自己随便发挥!!!,此行代码必须
/bin/echo $(/bin/date +%F_%T) >> /tmp/test.log
# 3.增加脚本的可执行权限
chmod +x /etc/rc.d/init.d/test.sh
# 4.添加脚本到开机自动启动项目中。添加到chkconfig,开机自启动。
[root@localhost ~]# cd /etc/rc.d/init.d
[root@localhost ~]# chkconfig --add test.sh
[root@localhost ~]# chkconfig test.sh on
# 5.关闭开机启动
[root@localhost ~]# chkconfig test.sh off
# 6.从chkconfig管理中删除test.sh
[root@localhost ~]# chkconfig --del test.sh
# 7.查看chkconfig管理
[root@localhost ~]# chkconfig --list test.sh
13. 使用光盘/U盘当做本地yum仓库
# cd /etc/yum.repos.d
# mkdir bak
# mv ./*.repo bak
# mount /dev/cdrom /mnt // 挂载光盘至某目录 如/mnt
# vim /etc/yum.repos.d/lo.repo // 创建配置文件
[baselo]
name=CentOS 7 Release 7.1.1503
baseurl=file:///mnt // cdrom 下面有 repodata目录 所以指向
gpgcheck=0
enabled=1
# yum clean all
# yum repolist
14. 网卡配置
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet" // 接口类型 常见的有Ethernet以太网 Bridge桥接
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" // 激活此设备时使用的地址配置协议,常用dhcp,static,none,bootp;
IPADDR=192.168.10.10 // ip地址
NETMASK=255.255.255.0 // 子网掩码
GATEWAY=192.168.10.254 // 网关
DNS1=8.8.8.8 // DNS
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="e9f80c94-a517-42a1-a465-1611e83849ec" // 设备的唯一标识
DEVICE="ens33" // 此配置文件应用到的设备
ONBOOT="yes" // 在系统引导时是否激活此设备
# systemctl restart network
网卡配置多个ip地址
方法01: 永久配置ip
# cp /etc/sysconfig/network-scripts/ifcfg-ens33{,:0}
# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
NAME="ens33:0" // 这些为必改项目
DEVICE="ens33:0" // 需删除UUID" // 这些为必改项目
方法02: 永久配置ip
# vim /etc/sysconfig/network-scripts/ifcfg-ens33 // 配置多ip
IPADDR1=192.168.10.17
PREFIX1=24
IPADDR2=192.168.10.18
PREFIX2=24
# ip addr
方法03: 临时配置ip
# ifconfig ens33:1 192.168.10.16/24 // 添加 第二个ip
# ip addr add 192.168.10.21/24 dev ens33:1 // 添加 第二个ip
# ifconfig ens33:1 192.168.10.16/24 dwon // 删除
# ip addr del 192.168.10.16/24 dev ens33:1 // 删除
虚拟机 添加 网卡后 没有配置文件 需要创建
# cd /etc/sysconfig/network-scripts/
# mv ifcfg-ens33 ifcfg-ens37
# vim ifcfg-ens37
NAME=ens37 // 改名
DEVICE=ens37 // 改名
#UUID= // 删除 UUID
# systemctl restart network
# ifconfig
临时修改 网卡ip
# ifconfig ens33 192.168.10.16/24 up // 修改网卡的ip地址为 192.168.10.16
15. 解决VMware Workstation 两台 windowns 之间网络不通的问题
控制面板 --> 系统与安全 --> windows defender 防火墙 --> 高级设置 --> 公用配置文件
--> windows defender 防火墙属性 --> 公用配置文件 --> 入站连接 --> 允许
16. umount命令 及 fuser命令
umount卸载磁盘时报错,提示target is busy
使用umount -f强制卸载依然报错
解决方法:使用fuser -mv -k /mnt 先杀死使用该目录的所有进程,然后在执行卸载操作
-m 后跟一个目录、文件或者设备名,列出使用该文件的进程PID
-v 显示详细信息
-k 杀死使用指定文件的所有进程
关于fuser的介绍:
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、或者网络端口,并给出程序进程的详细信息.
fuser只把PID输出到标准输出,其他的都输出到标准错误输出
查看那些程序使用tcp的80端口:
fuser -v -n tcp 80
17. Linux 硬盘 安装
❶. 使用UltraISO制作USB启动盘
a 文件-->打开-->选择要安装的镜像
b 启动-->写入硬盘映象
c 选择U盘-->写入方式一般为USB-HDD+ 点击写入
❷. 在 Install CentOS 7 上按e
把hd:与quiet之间的字符都删除,变成下面这样,其实就添加了/dev/sdb4,sdb4就是U盘的分区号 之后 按 Ctrl+ x重启
vmlinuz initrd=ini trd.img inst.stage2=hd:/dev/sdb4 queit
如果启动不了 可以等到有命令行出现
# ls
# cd dev
# ls // 可以查看到U盘的盘符是哪一个 回去再添加上就可以了
18. 关于交换分区
释放 交换分区中的内存
# free -m // 查看交换分区内存大小
# swapon -s // 查看 交换分区挂载目录
# swapoff /dev/dm-1 // 停止交换分区 会释放交换分区 到内存中 主要内存要有足够的空间 需要几分钟停止
# swapon -a // 挂载交换分区
# free -m
添加交换分区
# dd if=/dev/zero of=/swapfile bs=8M count=256 // 创建 swap分区为2G 内存不够用时可用此分区做为内存使用
# mkswap /swapfile // 格式化交换分区 bs=bytes:同时设置读入/输出的块大小为bytes个字节
// count=blocks:仅拷贝blocks个块,块大小等于ibs/bs指定的字节数
# swapon /swapfile // 启用/挂载 交换分区 # swapoff /swapfile 关闭 交换分区后可用rm删除
# swapon -s // 查看
# vim /etc/fstab // 开机自动 挂载 可使用 df -h 挂载的盘符
/swapfile swap swap defaults 0 0
19. 查看 nginx httpd mysql php 编译参数
# nginx -V // 查看 nginx 编译参数 及 版本
# cat /usr/local/apache2/build/config.nice // 查看 apache 编译参数
# httpd -v // 查看 apache 版本
# /usr/local/php/bin/php -i | grep configure // 查看 php 编译参数
# php -v // 查看 php 版本
# mysql -v // 查看mysql 版本
status; // 进入数据库查看mysql 版本
/s; // 进入数据库查看mysql 版本
# cat /usr/local/mysql/bin/mysqlbug | grep configure // 查看mysql 编译参数
20. 常用源地址
❶. http://rpmfind.net/ // 很不错的一个rpm 包下载的地方 几乎所有rpm包都可以下到
❷. https://sourceforge.net // 开源软件下载
❸. 163的源:
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
❹. 阿里云的源:
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
❺. epel的源
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
接口网址:
https://www.free-api.com // 各种接口网址
https://api.btstu.cn/ // 好用的免费接口网址
https://v1.alapi.cn/api/icp?domain=baidu.com // 查询 备案 接口
result=$(whois $line | grep "No match"|wc -l) // 查询 注册 接口
https://johnvansickle.com/ffmpeg/ // ffmpeg 官网
21. 常见错误解决
重启虚拟机后,再次重启nginx会报错: nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
# vim /usr/local/nginx/conf/nginx.conf // 修改 nginx.conf 文件,指定 pid文件 所在目录
pid /usr/local/nginx/logs/nginx.pid;
# mkdir /usr/local/nginx/logs
22. 忘记root密码 修改root密码
❶.centos7
单用户模式
重启开机esc按e进入
在LANG=en_US.UFT-8后面添加init=/bin/sh ro改为rw,在rhgb前
Ctrl+x
# touch /.autorelabel // selinux开启 需执行命令
# passwd root
# exec /sbin/init // 重启
救援模式
光盘启动 选择 Troubleshooting --> Rescue a installed system --> 1 --> 回车
# chroot /mnt/sysimage // 切换系统环境 为根用户环境
# passwd
# exec /sbin/init
❷.centos6
单用户模式
重启开机按e 选择 kernel选项
/init 1 //在后面键入 进入单用户模式
回到 kernel 按 b 重启
# vi /etc/passwd
光标出删除root后面的x 用x键删除
救援模式
光盘启动 选择 Rescue installed system
网卡选择否 其他一路是
# vi /mnt/sysimage/etc/passwd
光标出删除root后面的x 用x键删
23. Windows 一些常用信息
❶. 修改华为AC6005-8 无线密码 http://192.168.251.1
配置 --> AP配置 --> 模板管理 --> 无线业务 --> 安全模板
❷. netstat -ano windows查看 某一程序 的 网络连接
❸. win2012r 显示 桌面 计算机 图标
①. 在搜索框中输入 icon
②. 运行 --> rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
❹. Sublime Text 调中文
Crrl + Shift + p --> install --> Package Control: Install Package -->
chinese --> ChineseLocalizations --> Help --> Language-> 简体中文
24. grep 命令
引号 会先处理一遍 在交给grep
单引号:
可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的
内容不管是常量还是变量者不会发生替换。
双引号:
把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被
双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
不加引号:
不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串
中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
grep "//" file 与 grep '//' file 相同
第一条命令shell把四个\,转义成2个\传递给grep,grep再把2个\转义成一个\查找
第二条命令shell没转义,直接把2个\传递给grep,grep再把2个\转义成一个\查找
egrep = grep -E 支持扩展元字符的正则形式
fgrep 不支持正则表达式
状态码
0 找到
1 没找到
2 文件不存在
grep 也可以是扩展元字符 在这些元字符前面加 \
gerp 里面的特殊 符号
\w 所有字母与数字 称为 字符 等同[a-zA-Z0-9]
\W 所有字母与数字之外的字符 称为 非字符 等同[^a-zA-Z0-9]
\b 词边界 等同于 \< \> 词首词首定位符 '\blove\b' 不重要
grep 用法
grep 选项 '内容' 路径
-r -R 递归 针对目录 后面要跟目录
-l 只列出匹配行坐在的文件名
-v 取反 Invert
-i 忽略大小写
--exclude-dir=/data 排除 /data 目录
-E egrep 支持扩展元字符匹配
-o 只打印出来 找到的内容
-c 显示成功匹配的行数
-n 显示 相对的行
-q 不显示到标准输出 quit
-s 禁止显示文件不存在或文件不可读的错误信息
-B2 查看上面两行
-A2 查看下面两行
-C2 查看上下两行
grep用法举例
# grep -rl --exclude-dir={proc,boot,sys} 'root' / // 在根目录中查找root 注意 除去文件夹的写法不要写路径
# sed 's/root/teooo/g' `grep --exclude-dir={proc,sys,boot} -lr 'root' /` // grep 配合 sed 实现 搜索替换
# find /data -name '*.sh' | xargs grep "root" // 找到文件后 xargs传递给 grep
// xargs 会把 前面的命令整理 成 路径 以空格 隔开的形式 传递给 grep
# ls | xargs grep "send"
# grep 'send' `ls`
# grep 'send' `cat a.txt`
# ll | grep '^d 列出目录
# grep 'love' d* 以d开始的所有文件
# grep --help | grep '\-v' 此 - 要加转移 因为 grep 会认为 -v是选项
# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 过滤ip
# ifconfig | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | sed -n '1p' 提取本机ip
25. sed 命令
sed Stream EDitor 行编辑器 默认不编辑源文件 仅对模式空间中的数据做处理 逐行处理 处理结束后 显示出来
模式空间: sed命令读取数据 会存储到内存空间即sed模式空间
# sed 选项 "定址命令" 文件
1. 选项
-i : 直接修改源文件
-r : 表示使用扩展正则表达式 默认 支持基本正则表达式 或者加 \
-n : 只显示符合条件的行 静默模式 不在默认显示模式空间中的内容
-e : 后面可接多个文件
2. 地址定址
5 第5行
$ 最后一行
1,5 从1到5行
1,+2 第一行 及 以后两行
/RE/ 正则匹配 需要放到双斜线中 做模式匹配 过滤特定的行
\# # 亦可以写成这样 可以加任意字符或数字
\x x
/RE1/,/RE2/ 第一次被正则1匹配到的开始,被第2次匹配到的结束,这中间的所有行
3. 命令
s: s///修饰符 s### s@@@ 替换 将前面正则匹配到的字符串 替换成其他字符串
修饰符
g : 全局替换
i : 忽略字符大小写
c: 替换整行 // sed '/^SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
d: 删除符合条件的行
n: 处理下一行 // sed -r '/^aaa/{n;s/sbin/uuu/}'
! 在命令前面的叹号 表示取反
& 符号 是 调用 前面 匹配到的所有东西sed 's/.*/#&/' 所有行首 加#
; 可以 分开 两部分 // sed '1d;s/aaa/bbb/g' 相当于 -e
{ } 如果有多个命令可以使用 {;}隔开
sed '3{h;d}'
sed '3{d;}' 下面三个一样
sed '3{d}'
sed '3d'
\t 制表符
h: 把命令放到暂存空间 覆盖 默认的情况下暂存空间有一个 空行 只有一个 回车符
H: 把命令放到暂存空间 追加
g: 把暂存空间所有的内容从暂存空间取出 覆盖
G: 把暂存空间所有的内容从暂存空间取出 追加
p: 显示符合条件的行 // 本身模式空间里面有 在显示 就是 2条
a: \string // 在指定的行后面追加新行 内容为string
\n 换行符 可以用于换行
i: \string // 在指定的行前面追加新行 内容为string
r FILE: 将指定的文件及内容添加至 符合条件的行 的下面 可用于文件合并
w FILE: 将指定范围内的内容另存至指定的文件中
\L: 是转换全部 &匹配到的 为小写 直到遇到 \E 为止
\U: 是转换全部 &匹配到的 为大写 直到遇到 \E 为止
sed 实例
# sed '/11111/i\55555' test.txt i 插入上一行 查找11111的行 在上方插入 55555
# sed '/22222/a\55555' test.txt a 插入下一行 查找22222的行 在下方插入 55555
# sed -i 's/^[[:space:]]*//g' ./grub2.cfg 删除/etc/grub2.cfg文件中行首的空白字符
# sed 's/id:3/id:5/g' ./inittab 替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5
# sed '/^$/d' inittab 删除/etc/inittab文件中 空白行 删除空行
# sed '/^[ ]*$/d' ./inittab 删除空行 及 全是空格的行 [ ]*有0个或多个空格
# sed '/^[[:space:]]/d' ./inittab 删除以空格开始的行.
# sed '/^\s/d' ./inittab 删除以空格开始的行.
# sed '/^[ ]/d' ./inittab 删除以空格开始的行.
# sed '/^[ \t]*$/d' aa.sh 删除空行 \t是制表符
空格 [[:space:]]
[ ]
\s
# sed 's/^#//g' ./inittab 删除 /etc/inittab文件中 开头的#号
# sed 's/^#\s*//g' ./inittab 删除 /etc/inittab文件中 开头的#号 及 后面的空格有0个或多个空格 同时删除
# sed 's/^\s\s*#//' ./inittab 删除 /etc/inittab文件中 空格开头的 后跟# 删除 空白字符及#号
# sed 's/.*/#&/' ./inittab 所有行首 加#
# sed 's/^\s*[^#\t].*$/#&/' ./inittab 不是以#号开头的 加#
# echo "/etc/fstab" |sed -r 's#(^/.*/)([^/]+/?)#\1#' 取目录名
# echo "/etc/fstab" |sed -r 's#(^/.*/)([^/]+/?)#\2#' 取基名
# sed '2,20s/^#*/#/' aa.sh 没有注释的加注释
# sed 's/^[ \t#]*/#/g' aa.sh 把没有注释的加注释 或者 前面有空格的 删除空格 加注释
# sed "1d" ./passwd 删除 第一行
# sed "$d" ./passwd 删除 最后一行
# sed '$G' ./passwdn 最后一行下面 加上空白行
# sed '2r /etc/issue' ./passwd 将/etc/issue 此文件的内容 添加到 第二行的下面
# sed '$r /etc/issue' ./passwd 将/etc/issue 此文件的内容 添加到 最后一行
# sed '1,2r /etc/issue' ./passwd 在第一行和第二行后面都添加
# sed "1,3d" ./passwd 删除 前三行
# sed -n '1,2p' ./passwd 仅仅显示 前两行
# sed "1,+2d" ./passwd 删除 第一行 及 以后两行
# sed 's/^ *//' ./passwd 删除行首空格
# sed 's/ *$//' ./passwd 删除行尾空格
# sed "/root/d" ./passwd
# sed '/^\//d' ./passwd 删除以 \ 开头的行 /需要转义符
# sed '/^root/a\#hello' ./passwd 查找以root开头的行 添加一行 内容为#hello \可以省略
# sed '/^root/a\# hello\n# hi' ./passwd \n为换行符 添加两行
# sed 's/spool/teooo/g' ./passwdn 把所有的 spool 替换成teooo
# sed 's/^\//#/' ./passwdn 查找以 \ 开头的行 替换成 # 默认替换每一行的第一次 被匹配到的
# sed 's/\//#/' ./passwdn 查找 \ 替换成 # 默认替换每一行的第一次 被匹配到的
# sed 's/\//#/g' ./passwdn 把所有的 \ 都替换成 #
# sed 's/sp..l/&er/g' ./passwd 查找所有 sp..l 的字符串 替换成 sp..ler
# sed 's/\(sp..l\)/\1er/g' ./passwdn \( \) 为后项引用 \1 调用后项引用 查找所有sp..l 的字符串 替换成 sp..ler
# sed 's/s\(...l\)/S\1/g' ./passwdn 只使用前面引用的 一部分时 只能使用 后项引用 ... 不能使用&.
# history | sed 's/[[:space:]]//g' 把history 所有的空格 删除 [[:space:]] 替换成 啥也没有
# history | sed 's/^[[:space:]]*//g' 把行首的空白字符 * 所有空白字符
# sed '$a'"$teo" aa.txt 在最后一行添加 teo的变量 可以使用 两种引号 各有需求
# sed "\$a$teo" aa.txt 或转义
# sed -i 's/[A-Z]/\L&/g' a.txt 把所有大写字母 换成 小写字母
# sed -i 's/[a-z]/\U&/g' a.txt 把所有小写字母 换成 大写字母
26. awk 命令
awk 'BEGIN{print 1/2} {print "ok"} END{print "__________"}' ./passwd
处理顺序
1. 处理BEGIN 在读文件之前处理
2. 处理 行处理 处理每一行
3. 处理 END 在行处理结束 处理
-F"[ :\t]"
内部变量
$0: $0保存当前记录的内容
NR: 显示行号 总的记录 多个文件
FNR: 显示行号 当前文件的 单个文件
NF: 当前行有多少个字段
# awk -F':' '{print FNR,$0,NF}' passwd
$NF: 最后一个字段
# awk -F':' '{print $NF}' passwd
FS: 输入字段分隔符 默认空格或制表符
# awd 'BEGIN{FS=":"} {print $1,$2}' passwd
# awk -F"[ :\t]" '{print $1,$2,$3,$4,$5}' aa.txt 指定多个 分隔符 空格 冒号 制表符
OFS: 输出字段分隔符 // , 默认调用OFS 默认为空格
# awk 'BEGIN{FS=":";OFS="---"} {print $1,$2}' passwd
RS 输入 记录分隔符 把冒号 换成 回车 默认每一条为一个记录
ORS 输出 记录分隔符 把回车 换成 冒号
# awk 'BEGIN{RS=":"} {print $0}' passwd
# awk 'BEGIN{RS=" "} {print $0}' aa.txt 一行 拆分成多行
# awk 'BEGIN{ORS=" "}{print $0}' bb.txt 多行 合并为一行
# awk 'BEGIN{FS=":";OFS="----"}{print NR,FNR,NF,$NF,$3,$0}' passwd
print
print 后面引号"" 是要打印出来的
\n 换行
printf 可以打印格式
/ / 正则
~ 匹配
!~ 不匹配
# awk -F":" '$4~/teo/' passwd
# awk -F":" '$NF!~/bash$/' passwd
关系运算符
运算符
< 小于 x<y
<= 小于或等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y
> 大于 x>y
# awk -F":" '$3==0' passwd // 此0位数字
# awk -F":" '$3=="0"' passwd // 此0为字符串
# awk -F":" '$3<10' passwd
# awk -F":" '$0~/teo/' passwd
条件表达式
if(){}
awk '{if($3=0){print $0}}' aa.txt
# awk -F":" '$3<5{print $0}' passwd // 如果第三列小于5 打印满足条件的
# awk -F":" '{ if($3<5) {print $0} }' passwd // 标准写法 空格在里面没有意义
# awk -F":" '{if($3>300) {print $3} else{print $1}}' passwd
# awk -F":" '{if($3==0){++i}else{++j}} END{print "管理员 "i;print "普通用户 "j}' passwd
awk的循环
while
while(){}
awk '{while(i<10){print i;i++}}'
# awk 'BEGIN{i=0;while(i<=10){print i;i++}}' // 打印1-10
# awk 'BEGIN{RS=" "} {print $0}' aa.txt // 把空格转换成回车 效果同下
# awk '{i=1;while(i<=9){print $i;i++}}' aa.txt // 可以打印 以空格 分割的 所有字段
# awk '{i=1;while(i<=NF){print $i;i++}}' aa.txt // 分别打印每行的 每列
aa.txt
www.baidu.com google.com ssyy.com
hao123.com gogo.com
www.aa.com
for
for(){}
for(i=1;i<=5;i++){print i}
# awk 'BEGIN{for(i=1;i<=10;i++){print i}}' // 打印1-1
# awk '{for(i=1;i<=NF;i++){print $i}}' aa // 可以打印 以空格 分割的 所有字段
引入外部变量 i=5
方法1: 在awk 外面为 双引号的情况下使用
\"$i\" 在外部变量 加 双引号 并且 转义 可以用在函数里面
方法2: 在awk 外面为 单引号的情况下使用
"'"$i"'" 在外部变量 依次加 双引号 单引号 双引号 可用在函数里面
'''$i''' 在外部变量 依次加 单引号 单引号 单引号 可以用在函数外面
方法3
-v i="5" print i 使用-v i="5" 带入
awk 实例
# awk '/root/' passwd 匹配到root行 输出到屏幕
# awk -F":" '{print $1}' passwd 每一行的 第一个字段 以:分割
# awk -F":" '/root/{print $1}' passwd 满足条件行的 第一个字段 正则
# awk -F":" '/root/{print $1,$3}' passwd 1和3
# df | grep '/' | awk '$4>1000000{print $4}'
# date | awk '{print "Month:",$2"\n""Year:",$NF}'
27. cut 命令
# cut -d ':' -f 1,2 /etc/passwd
-d // 指定分隔符
-f 1,2,3 // 需要的列
-f 1-4,6,7
--complement -f 2 // 去掉 第2列
--output-delimiter=' ' // 指定输出分隔符为空格 默认输出分隔符 与 输入分隔符同一个
28. uniq 命令 // 可检查文本文件中 连续 重复 出现的行
# cat a.txt | uniq // 去掉 连续 重复的行
# cat a.txt | uniq -c // -c 显示 每行出现的次数
# cat a.txt | sort | uniq // 一般先排序 在去重复
# cat a.txt | uniq -cd //
-c 在每列旁边显示该行重复出现的次数
-d 仅显示重复出现的行
-u 仅显示出一次的行
29. ps 命令 查看系统进程
# ps aux 可以查看系统中所有的进程
# ps -le 可以查看系统中所有的进程 而且还能看到进程的父进程的 PID 和进程优先级
# ps -l 只能看到当前 Shell 产生的进程
# ps -ef 可以查看系统中所有的进程
a: 显示一个终端的所有进程 除会话引线外
u: 显示进程的归属用户及内存的使用情况
x: 显示没有控制终端的进程
-l: 长格式显示更加详细的信息
-e: 显示所有进程
-f: 显示程序间的关系
# ps -ef | grep "shadowsocksr" | grep -v grep | awk '{print $2}' | xargs kill -9 // 查找程序pid 并杀掉
# ps -ef | grep "shadowsocksr" | grep -v grep | awk '{print $2}' // 查找程序的 pid
# cd /proc/2107
# ls -ail // 已知pid 查看 程序的目录
30. 后台命令
nohup 命令 和 & 的区别
# sh a.sh & 将任务放到后台 即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失
# nohup sh a.sh 将任务放到后台 关闭标准输入,前台不再能够接收任何输入(标准输入) 重定向标准输出和标准
错误到当前目录下的nohup.out文件 即使关闭xshell退出当前session依然继续运行
# nohup sh a.sh & 将任务放到后台 但是依然可以使用标准输入 前台能够接收任何输入 重定向标准输出和标准错误
到当前目录下的nohup.out文件 即使关闭xshell退出当前session依然继续运行
# nohup a.sh & 后台执行此脚本 test.sh的打印信息会输出到当前目录下的nohup.out中
# nohup a.sh > /data/nohup.out 2>&1 & 指定输出到output文件
jobs 命令 可以用来查看当前终端放入后台的工作
# jobs -l // 列出当前终端后台进程的 PID 号
[1]- 109422 Running tail -f /var/log/messages &
[2]+ 109808 Running tail -f /var/log/messages-20201023 &
Running 状态为运行
Stopped 状态为停止
"+"号代表最近一个放入后台的工作 当前任务
"-"号代表倒数第二个放入后台的工作
# ctrl + z 可以将一个正在前台执行的命令放到后台 并且暂停
# bg 1 将一个在后台暂停的命令,变成继续执行 1 为jobs-l中的[1]命令的序号
# fg 1 将后台中的命令调至前台继续运行 可以用在vim中 ^z 调入后台 fg返回
# kill %1 杀死 1 的进程
# ls ./* > /dev/null 2>&1 把错误和信息都扔进黑洞
/dev/null 黑洞
2>&1 1 表示标准输出 2表示标准错误 >重定向 把错误重定向到输出
31. wc 命令 统计指定文件中的字节数、字数、行数 并将统计结果显示输出 如果没有给出文件名 则从标准输入读取
# wc -l
-c 统计字节数
-l 统计行数
-m 统计字符数 这个标志不能与 -c 一起使用
-w 统计字数 一个字被定义为由空白 跳格或换行字符分隔的字符串
-L 打印最长行的长度
-help 显示帮助信息
# ls -l | grep "^-" | wc -l 查看当前文件下 文件的数量
^ 行首牟定
- 为文件的标识
d 为文件夹的标识
# ls -lR | grep "^-" | wc -l 查看文件夹下包括子文件夹 所有的文件数量
R 递归
# ls | wc -l 显示在标准输出的 所有文件及文件夹的数量
32. tar 命令
# tar zcvf aa.tar.gz aa/ // 打 压缩包
# tar zxvf aa.tar.gz // 解 aa.tar.gz
# xz -d aa.tar.xz // 解 aa.tar.xz
# uzip aa.zip // 解 aa.zip
# tar jxvf aa.tar.bz2 // 解 aa.tar.bz2 需要 yum install lbzip2
# tar -zcvf aaa.tar.gz aaa --exclude=aaa/backups // 除了某个目录 目录后面没有/ 不能是绝对路径 要在父目录
# tar -zcvf home.tar.gz /home --exclude=/home/logs --exclude=/home/www/afish.php
gzip 压缩
# gzip -d a.gz // 解压
# gunzip -f a.gz // 解压
unzip 命令
# unzip aaa.zip // 将aaa.zip解压到当前文件下
# unzip -o aaa.zip // -o 直接覆盖
# unzip -n aaa.zip -d /tmp // 将aaa.zip解压到/tmp目录下,并且不要覆盖已有文件
# unzip -o aaa.zip -d /tmp // 将aaat.zip解压到/tmp目录下,并且覆盖已有文件
# unzip -v aaa.zip // 查看aaazip内容,但不解压
33. nload 命令 // 查看网络流量
# yum install nload
# nload // 回车 切换 网卡
Incoming 上半部分 也就是进入网卡的流量,
Outgoing 下半部分 也就是从这块网卡出去的流量,
Curr 当前流量
Avg 平均流量
Min 最小流量
Max 最大流量
Ttl 总和流量
# nload eth1 // 切换网卡
34. iftop 命令 实时流量监控工具
# yum install iftop
# iftop
<= =>这两个左右箭头,表示的是流量的方向。
TX: 发送流量
RX: 接收流量
TOTAL: 总流量
Cumm: 运行iftop到目前时间的总流量
peak: 流量峰值
rates: 分别表示过去 2s 10s 40s 的平均流量
# iftop -i eth1 切换网卡
t: 按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
S: 按S切换是否显示本机的端口信息;
D: 按D切换是否显示远端目标主机的端口信息;
p: 按小p切换是否显示端口信息;
P: 按大P切换暂停/继续显示;
q: 按q退出监控。
h: 按h切换是否显示帮助;
n: 按n切换显示本机的IP或主机名;
s: 按s切换是否显示本机的host信息;
d: 按d切换是否显示远端目标主机的host信息;
N: 按N切换显示端口号或端口服务名称;
b: 按b切换是否显示平均流量图形条;
B: 按B切换计算2秒或10秒或40秒内的平均流量;
T: 按T切换是否显示每个连接的总流量;
l: 按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
L: 按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
j: 按j或按k可以向上或向下滚动屏幕显示的连接记录;
1: 按1或2或3可以根据右侧显示的三列流量数据进行排序;
<: 按<根据左边的本机名或IP排序;
>: 按>根据远端目标主机的主机名或IP排序;
o: 按o切换是否固定只显示当前的连接;
f: 按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
!: 按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
35. rpm 命令
# yum localinstall aaa.rpm 安装rpm包
# rpm -ivh aaa.rpm 安装rpm包
i: 安装
v: 显示安装信息
h: 显示安装进度
--force: 即使覆盖属于其它包的文件也强迫安装
--nodeps: 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
# rpm -Uvh aaa.rpm 升级rpm包
# rpm -e aaa.rpm 卸载rpm包
# rpm -q nginx 查询一个包是否被安装
# rpm -qi nginx 得到被安装的包的信息
# rpm -ql nginx 列出该包中有哪些文件
# rpm -qf nginx.conf 列出服务器上的一个文件属于哪一个RPM包
# rpm -qa 列出所有被安装的rpm包
# rpm2cpio aaa.rpm | cpio -div 解压rpm包
36. date 命令
# date +"%Y-%m-%d-%H-%M-%S"
%Y 年份(以四位数来表示)
%m 月份(以01-12来表示)
%d 日期(以01-31来表示)
%H 小时(以00-23来表示)
%M 分钟(以00-59来表示)
%S 秒(以本地的惯用法来表示)
修改时间与时区
# ntpdate 0.asia.pool.ntp.org // 网络同步时间 如不好使 可手动修改
# date -R // 查看时间 与时区
# date -s "2020-1-20 10:01:50" // 修改时间 为
# hwclock // 查看硬件时间
# hwclock -w // 将软件时间写入到硬件时间 避免重启失效
# tzselect // 修改时区 选择对应数字 Asia 亚洲
37. find 命令
find [路径] [选项] [操作]
[路径]
默认 当前路径及子目录 默认递归
[选项]
-name 根据文件名查找
-iname 根据文件名查找 不区分大小写
-size -n +n 根据文件大小查找
# find -size 0c 等于 0字节 的文件 即空文件
# find -size +10k 大于 10KB 的文件 -n 小于 大小为 n 的文件
# find -size -10M 小于 10MB 的文件 +n 大于 大小为 n 的文件
-mtime -n +n 在n天
# find -mtime +5 -name '*.conf' 5天之前修改的文件
# find -mtime -5 -name '*.conf' 5天以内修改的文件
-mmin -n +n 在n分钟
# find /etc -mmin +30 30分钟 之前修改过的文件
# find /etc -mmin -30 -type d 30分钟 之内修改过的目录
-type 根据文件类型查找
f 文件 find . -type f
d 目录 find . -type d
c 字符设备文件 find . -type c
b 块设备文件 find . -type b
l 链接文件 find . -type l
p 管道文件 find . -type p
-prune 排除某些查找目录
-maxdepth n 根据搜索到n级子目录
-perm 根据文件权限查找
-user 根据文件属主查找
-group 根据文件属组查找
-nogroup 查找无有效属组的文件
-nouser 查找无有效属主的文件
# find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \; // 非目录 .conf结尾 且大于 10k,然后将其删除
# find /data/log -name '*.log' -mtime +7 -exec rm -f {} \; // 更改时间在 7 天以上的删除
# find /etc -type f -name '*.conf' -exec cp {} /root/conf/ \; // 将其复制到 /root/conf 目录下
# find ./ -type f -size +100M -exec cp {} /aaa \; // 查找超过100M的文件并移动到指定目录
# find /data -type f -mtime +30 -exec rm -f {} \; // 查找 /data 下 日期为30天以上的文件 删除
-exec '命令' {} \; 对搜索到的文件执行特定的操作 {} 表示查询的结果
-ok 和 -exec 的功能一样 只是每次操作都会给用户提示
-print 打印输出 默认的选项 即打印出找到的结果
逻辑运算符
-a 与 默认情况查询条件之间都是 与 的关系
-o 或
-not | ! 非
# find /data/ -type f -name "*.txt" | xargs cp -t /tmp // -t 参数指定目标目录
# find /data/ -type f -name "*.txt" -exec cp {} /tmp \
# cp $(find /data/ -type f -name"*.txt") /tmp // $() 存放命令结果
# find /data/ -type f -name "*.txt" | xargs -i cp {} /tmp // -i 参数指定找到的结果放到{}中
linux 删除 大量小文件 方法
方案一:
# mkdir null // 建立空目录
# rsync --delete-before -d null/ cache/ // cache目录为需要删除的小文件目录 null为空目录
方案二:
# find null -type f -delete
待整理命令 vim中的替换
:%s///g
注:
find: ‘/run/user/1000/gvfs’: 权限不够 // find 查找的时候 提示权限不够
# umount /run/user/1000/gvfs
# rm -rf /run/user/1000/gvfs
38. cp 命令
# cp -a aaa /var/www/ // 最常用
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-R:同-r
-l:不复制文件,只是生成链接文件。
# cp -r -p aaa /var/www/ // 复制目录 -p 保留属性
关于取消 cp 的提示覆盖
# alias // 可以看到cp 默认为 cp -i 即使加-f也会提示是否覆盖
# unalias cp // 方法一: 去掉cp的别名 临时
# vim ~/.bashrc // 定义永久别名
# \cp /etc/passwd ./ // 方法二: \临时取消别名
39. sshpass 命令
# yum install sshpass
-p 123456 指定明文本密码输入(安全性较差)
-f a.txt 从文件中获取密码
-d number:使用数字作为获取密码的文件描述符
-e:从环境变量SSHPASS获取密码
# sshpass -f a.txt ssh root@192.168.10.13
# sshpass -p "123456" ssh root@192.168.10.13 "sh a.sh" // 后可以接要执行的命令 命令最好放在双引号里
# sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@192.168.10.10 // 忽略密码提示
# sshpass -p 123456 scp a.sh root@192.168.10.10:/tmp
# sshpass -p 123456 scp -o StrictHostKeyChecking=no a.sh root@192.168.10.10:/tmp // 忽略密码提示
# sshpass -p 123456 rsync -avzP ssyy99 -e 'ssh -p 65522' root@192.168.10.10:/data/ // rsync 推送文件夹到目标
# export SSHPASS="123456" // 声明环境变量
# sshpass -e ssh root@172.17.9.200 // -e 从环境变量中读取
# sshpass -p 123456 scp -r -p root@47.91.219.64:/data/mysqldb/3306/Moniterdb/\{1.txt,2.txt\} ./
// 把远程文件通过ssh 22端口复制到本地 {}命令展开 \转意符 ./复制到当前目录
40. ssh 命令
-t 禁止伪终端
-l 指定连接远程服务器登录用户名
-o 指定配置选项
-p 指定远程服务器上的端口
# ssh 192.168.1.100
# ssh -p 22 root@192.168.1.100
# ssh root@192.168.1.100 -o stricthostkeychecking=no // 首次登陆免输yes登录
# ssh root@192.168.1.100 "ls /home/omd"
# ssh root@192.168.1.100 "sh /data/a.sh"
# vim /etc/ssh/ssh_config // 可修改 ssh配置文件中 忽略密码提示
StrictHostKeyChecking no
# vim /etc/ssh/sshd_config // ssh修改端口号
Port 22
Port 65522
# lastb // ssh登陆失败的日志
# last // ssh登陆的历史
ssh 禁用密码验证 只能使用秘钥
# vim /etc/ssh/sshd_config
PasswordAuthentication no // 禁用密码验证
RSAAuthentication yes // 添加 启用密钥验证
PubkeyAuthentication yes // 添加
# service sshd restart
注.
ssh 登陆慢 排查
# hostname // 获取主机名
# ssh -v localhost.localdomain // 主机名 看看到哪个地方卡住
# ll -h /var/log/btmp // 此文件保存 破解密码的记录 看看是否很大 几百M
# rm /var/log/btmp // 删除即可 解决 debug1: Entering interactive session 卡住
# touch /var/log/btmp
ssh登录错误排查
在机器上出现一个很诡异的现象,使用root ssh登录机器时,在打印了“last login”时间后就卡住了。
需要按ctrl+c,终端才会显示bash-2.4,而只有source ~/.bashrc后,才会显示root的主目录。
试了一下手动执行source /etc/profile,也卡住了。因此可以断定,是登录时加载/etc/profile卡住,导致的SSH登录卡住。
试着手动执行了/etc/profile中的代码,发现运行到:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
echo $i
echo "1"
. "$i"
else
echo $i
echo "2"
. "$i" >/dev/null
fi
fi
done
卡住的。这一段代码,是从/etc/profile.d/取出所有的ssh文件,并进行执行。可以看到,我在里面加入了一些打印指令。
所以,可以清晰的看到是执行:/etc/profile.d/abrt-console-notification.sh卡住的。
再研究/etc/profile.d/abrt-console-notification.sh文件,最终确定,是在执行:
abrt-cli status --since="$SINCE" 2> /dev/null
这一句时卡住的。
使用systemctl status abrtd.service 查看abrtd服务状态,可以看到abrt的.lock文件被某个进程锁住了 kill掉该进程,问题解决
# lsof | grep 409000000
# kill 409000000
1. 本机使用秘钥登录
# ssh-keygen // 使用要设置秘钥的用户执行 生成 私钥id_rsa 公钥id_rsa.pub
# cd ~/.ssh // 到此用户的家目录
# cat id_rsa.pub > authorized_keys // 创建验证文件
# chmod 600 authorized_keys // 必须是 600权限
# chmod 700 ../.ssh // 必须是 700权限
# sz id_rsa // 拷贝出来 私钥 即可登录
2. 使用秘钥 登录其他 服务器
# ssh-keygen // 生成私钥 公钥
# ssh-copy-id 192.168.10.13 // 推送到目标
# ssh 192.168.10.13 // 登录即可
3. 手动 添加 公钥到服务器
# mkdir -p /root/.ssh
# cd /root/.ssh
# rz authorized_keys // 复制公钥 到需要登录的服务器
# chmod 600 /root/.ssh/authorized_keys
# chmod 700 /root/.ssh
4. 其他可能用到的命令
# ssh-keygen -P "" -f ~/.ssh/id_rsa // 非交互式生成
# chown -R teo.root /home/teo/.ssh // 非root用户需要修改 权限
# ssh-keygen -y -f ./id_rsa // 如没有公钥 可以由私钥 推算出公钥 保存为 authorized_keys 文件即可
41. scp 命令
-p:保留原文件的修改时间,访问时间和访问权限
-q: 不显示传输进度条。
-r: 递归复制整个目录。
-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题
-P:指定端口号 大写的P
-o: ssh中的 -o 设定ssh选项
-i: 指定秘钥文件 此文件必须是 600权限
# scp -r -P 65522 /data/aaaa root@192.168.10.10:/data/
# scp -P 59157 -r -i /data/jump_guest.pem a.txt jump_guest@192.168.10.1:/home/jump_guest/
42. head 命令
-c 显示的字节数
-n 显示的行数
# head -n 5 a.txt // 显示文件的前n行
# head -n -6 a.txt // 文件除了最后n行的全部内容
# head -c 20 a.txt // 显示文件前n个字节
# head -c -32 a.txt // 文件的除了最后32个字节以外的内容
43. xargs 命令 是给命令传递参数的一个过滤器
xargs 是给命令传递参数的一个过滤器 也是组合多个命令的一个工具 一般是和管道一起使用。
可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白 不过通过 xargs 的处理 换行和空白将被空格取代
是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
# find /sbin -perm +700 | xargs ls -l
# cat test.txt | xargs
# cat test.txt | xargs -n3
44. tr 命令 字符串转译
tr -dc "[:alnum:]"
# cat /dev/urandom | tr -dc "[:alnum:]" | head -c 14 | xargs // 取随机数
# openssl rand -hex 7
45. sort 命令 // 默认以字母序进行文本排序
# cat a.txt | sort
# cat a.txt | sort -n -t ":" -k 2 // -t指定分隔符 冒号 -k 以第二列 排序
# ps aux | sort -k 4 -gr | head -n 5 // 内存使用最多的 5个进程
# cat passwd | sort -t ':' -k 3 -nr // 按第三列 降序排序
# du -h | sort -hr // 文件大小排序
-n 依照数值的大小排序
-u 去重 相当于 uniq
-r 以相反的顺序来排序
-t <分隔字符> 指定排序时所用的栏位分隔字符
-b 忽略每行前面开始出的空格字符
-h 使用易读性数字 例如: 2K 1G
-d 排序时 处理英文字母、数字及空格字符外 忽略其他的字符
-f 排序时 将小写字母视为大写字母
-i 排序时 除了040至176之间的ASCII字符外,忽略其他的字符
-m 将几个排序好的文件进行合并
-M 将前面3个字母依照月份的缩写进行排序
-o<输出文件> 将排序后的结果存入指定的文件
-k –key=POS1[,POS2] 排序从POS1开始,若指定POS2,则POS2结束,否则以pos1排序
+<起始栏位>-<结束栏位> 以指定的栏位来排序 范围由起始栏位到结束栏位的前一栏位
46. stat 命令
stat 命令用于显示文件的状态信息 stat命令的输出信息比ls命令的输出信息要更详细。
# stat a.txt 可以查看 文件的三个时间
Access: atime 访问时间 显示的是文件中的数据最后被访问的时间
Modify: mtime 修改时间 显示的是文件内容被修改的最后时间
Change: ctime 状态修改时间 显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变
47. sysctl 命令
sysctl 命令用于运行时配置内核参数 这些参数位于/proc/sys目录下 sysctl配置与显示在/proc/sys目录中的内核参
用户只需要编辑/etc/sysctl.conf文件
# sysctl -a // 显示所有系统内核参数
# sysctl -w net.ipv4.ip_forward=1 // 临时改变某个指定参数的值
# sysctl -p // 从/etc/sysctl.conf 中加载 系统参数
# echo "net.ipv4.ip_forward=1" /etc/sysctl.conf // 永久修改
48. whereis 命令
可查找 程序的 二进制文件 源文件 帮助手册文件 的路径
# whereis mysql 查找 可执行文件 源代码文件 帮助文件 在文件系统中的位置
# whereis ls
49. which 命令
查找命令可执行文件所在的路径 有时候可能在多个路径下存在相同的命令
该命令可用于查找当前所执行的命令到底是哪一个位置处的命令
# which mkdir
# which ls
50. echo 命令
# echo "aaaa" 标准输出
" " 双引号 弱引用
' ' 单引号 强引用
-n 不换行 默认在最后出入换行符 -n不换行
-e 打开 \ 转义符 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
// 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
\e[1;31m 颜色的 固定写法 31为红色 31-37 可换其他前景颜色 41-47可换背景颜色
\e[0m 恢复颜色
# echo -e "\e[1;31maaaaa\e[0m" // 加红色
# echo -e "\e[1;31maaaaa" // 文字 及 shell会都变成此颜色
# echo // 默认 输出一个 回车符
使用 shell + echo 修改数据库
# echo 'use nextcloud;delete from oc_filecache;' | mysql -unextcloud -p123456 // 清空表
# echo 'use nextcloud;show tables;' | mysql -unextcloud -p123456 // 显示表
51. ls 命令
-a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件依建立时间之先后次序列出
-A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 目录递归显示 若目录下有文件,则以下之文件亦皆依序列出
# ls -A
# ls -F
# ls -R
# ls -l
# ls -l mtime // 修改时间
# ls -lc ctime // 状态修改时间
# ls -lu atime // 访问时间
# ls -v image* > a.txt // 可以按照 image后面的数字的大小进行排序
image001.jpg
image505.jpg
image2507.jpg
image2509.jpg
52. nslookup 命令
DNS查看
# nslookup www. ssyy99.com
53. ntpdate 命令
时间同步
# ntpdate asia.pool.ntp.org // 初始化脚本中有同步时间的命令 可使用 crontab -e 拿出来 使用
54. Centos7 重装系统 修改网卡名字
重装系统 第一行 按tab键 输入 net.ifnames=0 biosdevname=0 以更改网卡名称为eth0 ethX
55. Linux 与 Windows 文件格式
vim 修改文件格式
:set ff // 查看文件格式
:set ff=unix // 修改文件格式 unix
文件为dos格式 linux 会报错 bin/bash^M: bad interpreter: No such file or directory
56. curl 命令
# curl http://www.ssyy99.com // 请求网页
# curl -I http://www.ssyy99.com // 只请求首部信息
# curl ifconfig.me // 查看外网ip
# curl ipinfo.io/ip // linux 查看外网ip
# curl -I -o /dev/null -s -w %{http_code} www.baidu.com // 返回网页状态码
# curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" www.baidu.com // 返回网页状态码
# curl -s https://v1.alapi.cn/api/icp?domain=baidu.com | grep "true" | wc -l // 静默 模式 没有信息打印
-m // 最大传输时间
-o // 写入到文件中
-I // 请求的头部
-s // 静默输出
\n // 换行
-w %{http_code} // -w 代表自定义参数 %{http_code}代表http状态码
57. linux 释放缓存区 内存的方法
# echo 1 > /proc/sys/vm/drop_caches // 清理 页面缓存
# echo 2 > /proc/sys/vm/drop_caches // 清理 目录缓存 和inodes
# echo 3 > /proc/sys/vm/drop_caches // 清理页面缓存 目录缓存 inodes
# sysctl -w vm.drop_caches=1 // 清理 页面缓存
# sysctl -w vm.drop_caches=2 // 清理 目录缓存 和inode
# sysctl -w vm.drop_caches=3 // 清理页面缓存 目录缓存 inodes
58. EOF 用法
# cat <<-EOF 把eof定义的内容 重定向给 cat 执行 - 支持下面EOF不顶格
111
222
333
EOF // EOF只是定义一个 开始和结束的标志 可以使用任意字母或符号
# cat <<-EOF > /data/a.txt // 把EOF 内容给cat执行 在重定向到a.txt
aaa
bbb
ccc
EOF
59. umask 命令
umask 可用来设定 权限掩码
# umask // 获取当前权限掩码 创建文件默认的权限666 减去 022 为644 文件夹为默认777
022
# umask 077 // 修改 当前shell 的umask值 当前有效 在创建文件都666 减去077 为 600
cowsay 命令
# yum install cowsay
# cowsay -l // 查看其它动物的名字,然后-f跟上动物名,如
# cowsay aaaaa
# cowsay -f eyes aaaaa
60. mysqladmin 命令
# mysqladmin -uroot -p123456 password 123456789 // 修改密码 mysql 密码
# mysqladmin -uroot -p23456 version // 查看 mysql 版本
# mysqladmin -uroot -p23456 create aaaaa // 创建数据库
# mysqladmin -uroot -p23456 drop aaaaa // 删除数据库
# mysqladmin -uroot -p23456 reload // 重新载入
# mysqladmin -uroot -p shutdown // 关闭数据库
# mysqlshow -uroot -p23456 // 显示服务器上的所有数据库
# mysqlshow -uroot -p23456 aaaaa // 显示数据库aaaaa中有什么表
# mysql -uroot -p123456 -e "show databases;" // 可以不连入mysql 直接执行mysql命令 可以用到脚本中 执行mysql命令
61. ulimit 命令 // 不完全 待续
# ulimit -a // 查看打开的多大连接数 系统默认1024
open files (-n) 1024
# lsof | wc -l // 查看 当前系统打开的文件数
# lsof -p 29495 | wc -l // 查看某个进程的打开文件数量
# cat /proc/29495/limits // 查看某个进程的最大可以打开的文件数
62. mtr 网络测试工具
mtr www.baiud.com
其中-c的说明是:–report-cycles COUNT
第三列 Loss: 是显示的每个对应IP的丢包率
第四列 Last: 显示的最近一次的返回时延
第五列 Avg : 是平均值 这个应该是发送ping包的平均时延
第六列 Best: 是最好或者说时延最短的
第七列 Wrst: 是最差或者说时延最常的
第八列 StDev: 是标准偏差
接下来接着说相关参数:
mtr -s 用来指定ping数据包的大小
mtr -n no-dns不对IP地址做域名解析
mtr -a 来设置发送数据包的IP地址 这个对一个主机由多个IP地址是有用的
mtr -i 使用这个参数来设置ICMP返回之间的要求默认是1秒
mtr -4 IPv4
mtr -6 IPv6
63. 关于 Centos7 /home 空间 合并到 / 根目录
❶. Centos7把 /home 所有空间合并到 / 根目录
# df -h // 查看 分区 需要保存 /home目录下 所需要的文件 否则会丢失
# umount /home // 卸载 /home
# fuser -m -v -i -k /home // 强制 终止 home 下的进程 如果不能卸载 使用此命令强制停止
# vi /etc/fstab // 注释掉
#/dev/mapper/centos-home /home xfs defaults 0 0
# fdisk -l // 有 centos-home 分区
Disk /dev/mapper/centos-home: 5821 MB...
# lvremove /dev/mapper/centos-home // 删除 centos-home 分区 y
# vgdisplay
Free PE / Size 1390 / <5.43 GiB // 有5.43G 未分配
# lvextend -L +5G /dev/mapper/centos-root // 扩展/root所在的lv 给 root 分 5G 空间
# xfs_growfs /dev/mapper/centos-root // 扩展/root空间
# df -h
❷. Centos7把 /home 部分空间 合并到 / 根目录
# df -h // 查看 分区 需要保存 /home目录下 所需要的文件 否则会丢失
# umount /home // 卸载 /home
# fuser -m -v -i -k /home // 强制 终止 home 下的进程 如果不能卸载 使用此命令强制停止
# vi /etc/fstab // 注释掉
#/dev/mapper/centos-home /home xfs defaults 0 0
# fdisk -l // 有 centos-home 分区
Disk /dev/mapper/centos-home: 5821 MB...
# lvremove /dev/mapper/centos-home // 删除 centos-home 分区 y
# vgdisplay
Free PE / Size 1390 / <5.43 GiB // 有5.43G 未分配
# lvextend -L +5G /dev/mapper/centos-root // 扩展/root所在的lv 给 root 分 5G 空间
# xfs_growfs /dev/mapper/centos-root // 扩展/root空间
# df -h
# vgdisplay // 查询 剩余多少空间
# lvcreate -L 167G -n home centos // 重新 创建 home 目录
# mkfs.xfs /dev/centos/home // 创建文件系统
# mount /dev/centos/home /home // 挂载
# df -h
64. netstat 命令 显示与IP、TCP、UDP和ICMP协议相关的统计数据
-i 显示网卡列表
-r 显示路由信息
-a 列出所有当前的连接
-t tcp连接
-u udp连接
-n 禁用域名解析功能
-l 选项列出 正在监听的 端口
-p 显示建立相关链接的程序名
# netstat -ant // 查看 所有tcp连接
# netstat -anu // 查看 所有udp连接
# netstat -rn // 查看 路由信息 相当于 route -n
# netstat -tnlp // 相当于 ss -tnlp
# netstat -in // 查看网卡
# netstat -c // 查看当前连接状态 实时更新
# netstat -an | grep ESTABLISHED | wc -l // 查看nginx/apache当前并发访问数
# netstat -tn | grep 80 | wc -l // 查看所有80端口的tcp连接
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' // 查看Apache的并发请求数及其TCP连接状态
ESTABLISHED 意思是建立连接。表示两台机器正在通信
CLOSE_WAIT 对方主动关闭连接或者网络异常导致连接中断 此时我方要调用close()来使得连接正确关闭
TIME_WAIT 我方主动调用close()断开连接...表示处理完毕 等待超时结束的请求数
SYN_SENT 表示请求连接
YN_RECV 表示正在等待处理的请求数
FIN_WAIT1 释放 连接状态为 FIN_WAIT1 的状态
# sysctl -a | grep tcp_max_orphans // 记下 net.ipv4.tcp_max_orphans 的值
# sysctl -w net.ipv4.tcp_max_orphans=0 // 然后等待FIN_WAIT1的消失 netstat -npt | grep 8080 反复查看
# sysctl -w net.ipv4.tcp_max_orphans=$aa // 还原 设置上面的值 3276800 -w临时改变值
# netstat -antu | grep tcp | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 // 连接最多的10个ip
关于 TIME_WAIT 过多
# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 // 开启SYN Cookies 当出现SYN等待队列溢出时 启用cookies来处理 可防范少量SYN攻击
net.ipv4.tcp_tw_reuse = 1 // 表示开启重用 允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1 // 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout // 修改系默认的 TIMEOUT 时间
net.ipv4.tcp_keepalive_time = 1200 // keepalive起用的时候 TCP发送keepalive消息的频度 缺省是2小时 改为20分钟
net.ipv4.ip_local_port_range = 1024 65000 // 表示用于向外连接的端口范围 缺省情况下很小 32768到61000
net.ipv4.tcp_max_syn_backlog = 8192 // 表示SYN队列的长度 默认为1024 可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_tw_buckets = 5000 // 表示系统同时保持TIME_WAIT套接字的最大数量 如果超过这个数字 将立刻被清除
65. mv 命令
# mv -fv ./* /data/ // 强制覆盖 不能移动文件夹 不需要加反斜杠 # \mv 取消-i命令
-f 强制覆盖
-v 显示过程
# mv -fvb ./* /data/ // 覆盖前先备份文件 可以移动文件夹 会先备份文件夹 会以 文件名~ 结尾
-b 覆盖之前先备份
66. crontab 定时命令
# crontab -e // 定时任务
* * * * * sh a.sh // 每1分钟 执行
*/5 * * * * sh a.sh // 每5分钟 执行
* */1 * * * sh a.sh // 每小时 执行
5 * * * * sh a.sh // 每小时的 过五分钟 执行
1 1 * * * sh a.sh // 每天 1:01 点 执行
3,15 * * * * sh a.sh // 每小时的 第3和第15分钟 执行
3,15 8-11 * * * sh a.sh // 在上午8点到11点的第3和第15分钟 执行
3,15 8-11 */2 * * sh a.sh // 每隔两天的上午8点到11点的第3和第15分钟 执行
3,15 8-11 * * 1 sh a.sh // 每个星期一的上午8点到11点的第3和第15分钟 执行
10 1 * * 6,0 sh a.sh // 每周六 周日的1:10分 执行
0,30 18-23 * * * sh a.sh // 每天18:00至23:00之间每隔30分钟 执行
0 23 * * 6 sh a.sh // 每星期六的晚上11:00 执行
0 4 1 jan * sh a.sh // 一月一号的4点 执行
第一个 * 表示分钟,第二个表示小时,第三个表示日期,第四个表示月份,第五个表示星期
*表示所有
/5表示每5个单位
1-3从1到3
,逗号表示离散的数字
# trontab -l // 查看 定时任务
# tail /var/log/cron // 定时任务 日志
# vim /var/spool/cron/root // 定时任务的文件 crontab -e 就是写到这个文件里面 按用户存储
67. speedtest 命令 // 下载测试 网速测试
# wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
# chmod a+rx speedtest.py
# ./speedtest --share
68. openssl 命令
# openssl x509 -enddate -noout -in fullchain.pem // 检测证书到期时间
# openssl rand -hex 7 // 随机生成16进制的字符串
# openssl req -new -x509 -days 365 -nodes -out /data/nextcloud.crt -keyout /data/nextcloud.key // 生成证书自签证书
配置 https证书 自签
服务端 自签
# cd /etc/pki/CA
# touch index.txt // 创建所需要的文件
# echo 01 > serial
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
客户端
# cd /usr/local/nginx/ssl
# (umask 077; openssl genrsa -out teo1.key 2048)
# opensll req -new -key teo2.key -out teo2.csr -days 365
服务端 签署
# openssl ca -in teo1.csr -out teo1.crt -days 365
69. lsof 命令 // 由lsof包提供
# lsof // 列出当前系统打开文件的工具
# lsof ./a.txt
# lsof -u root // 列出某个用户打开的文件 ^为取反
# lsof /ect/passwd // 列出某个文件被哪些进程打开使用
# lsof -c nginx // 列出某个进程 访问的文件信息
# lsof -i // 列出所有的网络链接信息
# lsof -i TCP // 列出所有TCP协议的网络连接信息
# lsof -i :800 // 查看800端口的网络连接信息
70. wget 命令
# wget -c -t 0 http://ssyy99.com/a.tar.gz
-c 断点续传
-t 0 反复尝试的次数,0为不限次数
# wget -O b.tar.gz http://ssyy99.com/a.tar.gz // -O 重命名
# wget -b http://ssyy99.com/a.tar.gz // 后台下载 # tail -f wget-log // 观看下载进度
# wget -i a.txt // -i 下载a.txt文件中的 链接
# wget -o download.log http://ssyy99.com/a.tar.gz // -o 把下载链接信息过程 写入日志
# wget -r -np -R index.html* https://www.ssyy99.com/down/en/ --no-check-certificate
-r // 递归的方法 下载整个网站 指向的所有地址同样会被下载
-nd // 不建立目录 都下载到当前目录
-np // 不追溯至父目录
-nc // 不要覆盖已经存在的文件
-l 2 // 下载两层
-Q 1M // 限速 最大下载速度 1M
-R // 逗号分隔的要拒绝的扩展名列表 下载网页 会把 index.html下载下来所有使用-R排除
-X // 排除目录的列表
--no-check-certificate // 不检测安全性
# wget -m https://www.ssyy99.com/download/en --no-check-certificate // -m 镜像站点 会读入robots.txt并此文件规定来执行
# wget -O- -q www.baidu.com // 类似于curl的功能
-o 将日志 写入 文件
-O 将文档写入 FILE
-O- 将文档写入标准输出
-q 安静模式 (无信息输出)。
71. 查看linux硬件配置 及运行状态
# cat /proc/meminfo // 查看内存信息
# dmidecode | grep "Product Name" // 查看机器型号
# dmesg // 设备故障的诊断 硬件的连接或断开连接操作时 可以看到硬件的检测或者断开连接的信息
# dmesg | grep -i eth // 查看网卡信息
# cat /proc/version // 查看系统内核版本
# hostnamectl // 查看系统内核版本
# uname -a // 查看系统内核版本
# lscpu // 查看cpu 型号及信息
# cat /proc/cpuinfo // 查看cpu 型号及信息
# cat /proc/cpuinfo | grep mode1* // 查看cpu 核数
# cat /proc/cpuinfo | grep "physical id"| sort| uniq| wc -l // 查看物理cpu个数
# cat /proc/cpuinfo | grep "processor"| wc -l // 查看逻辑CPU的个数
# cat /proc/cpuinfo | grep "cpu cores"| uniq // 查看 cpu 核数
# dmidecode -s system-product-name // 查看是虚拟机 还是物理机
# getconf LONG_BIT // 查看cpu 运行在 32位系统还是 64位系统
# top // 查看cpu及内存等 运行状态
# sar 1 5 // 查看cpu使用率 1秒采集5次
# mpstat 1 5 // 查看cup使用率 1秒采集5次
%user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100
%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
%sys 在internal时间段里,内核时间(%) (system/total)*100
%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq 在internal时间段里,硬中断时间(%) (irq/total)*100
%soft 在internal时间段里,软中断时间(%) (softirq/total)*100
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100
# yum install sysstat // iostat包
# iostat -k // 查看硬盘读取写入 状态
# iostat -d -k 2 6 // 查看硬盘 读取 写入
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。
"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
# iostat -d -x -k 1 6
-x,该选项将用于显示和io相关的扩展数据
-A:所有报告的总和
-b:显示I/O和传递速率的统计信息
-B:显示换页状态
-d:输出每一块磁盘的使用信息
-e:设置显示报告的结束时间
-f:从制定的文件读取报告
-i:设置状态信息刷新的间隔时间
-P:报告每个CPU的状态
-R:显示内存状态
–u:输出cpu使用情况和统计信息
–v:显示索引节点、文件和其他内核表的状态
-w:显示交换分区的状态
-x:显示给定进程的装
-r:报告内存利用率的统计信息
# sar -p 1 4 报告每个cpu的状态,1秒一次一共4次
# vmstat 2 6
r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,
就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,
服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程
swpd 虚拟内存已使用的大小,如果大于0,表示物理内存不足了 如果不是程序内存泄露的原因 该升级内存了
free 空闲的物理内存的大小
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
cache cache直接用来记忆我们打开的文件,给文件做缓冲
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数
us 用户CPU时间
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间
wt 等待IO CPU时间。
# uptime
18:16:12 up 5:45, 4 users, load average: 0.01, 0.04, 0.05
up 5:45: 主机已运行的时间
4 users: 用户连接数
load average: 5分钟 10分钟 15分钟 的cpu负载 根据cpu核数而定 1核满载为1 2核满载为2
# uptime -s 显示 系统开始运行的日期
# uptime -p 显示 系统运行的总时间
# top 命令
h 帮助
回车、空格 刷新
b
# yum install virt-what
# virt-what // 可以查看 机器用的什么 虚拟化 kvm 或 vmware 或 xen
# pidstat -d 1 // 查看进程 使用磁盘的情况 哪个进程使用硬盘
# ls /dev/ // 可以看到有几块硬盘 可依次查看
sda
sdb
# cat /sys/block/sda/queue/rotational // 返回0不可旋转为固态硬盘 返回1为可旋转机械硬盘
# lsscsi // 第四列 为硬盘型号可看到是否为 SSD
[0:0:0:0] disk ATA Vi550 S3 SSD 61.3 /dev/sda // 固态硬盘
[0:2:0:0] disk LSI LSI 3.19 /dev/sda // 机械硬盘
# lsblk -d -o name,rota // 返回0不可旋转为固态硬盘 返回1为可旋转机械硬盘
# lsblk // 列出所有可用块设备的信息 还有依赖关系
# lsblk -f // 查看文件系统
# lsblk -a // 默认选项不会列出所有空设备
关于 硬盘检测 测试硬盘
# echo 3 > /proc/sys/vm/drop_caches // 循环执行 取平均值
# dd if=/dev/zero of=cc bs=1M count=1024 conv=fdatasync // 可用于 硬盘读取测试
conv=fdatasync // 不使用 内存
# smartctl --all /dev/sda // 查看硬盘信息 品牌 大小 SMART信息 虚拟的没有
Power_On_Hours 0x0012 067 067 000 Old_age Always - 14798 // 总工作时间
Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 4 // 通电次数
# smartctl -H /dev/sda // 检测硬盘 健康状态信息
SMART overall-health self-assessment test result: PASSED // 有passed 说明正常
# badblocks -v /dev/sda // 检测 硬盘 坏块 很慢 很慢
hdparm 命令 // 测试硬盘
# yum install hdparm
# hdparm -t /dev/sda // 磁盘的io性能
# hdparm -T /dev/sda // 测试 内存性能
72. 关于用户的命令
# vim /etc/group // 查看群组
# vim /etc/passwd // 查看用户
# vim /etc/sudoers // sudo配置文件
# echo "%wheel ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers // 把wheel的群组10 给与sudo权限
usermod命令 可用来修改用户帐号的各项设定
# usermod -s /sbin/nologin teo // 修改用户的登陆shell
# usermod -g 10 teo // 修改群组
-c<备注> 修改用户帐号的备注文字。
-d登入目录> 修改用户登入时的目录。
-e<有效期限> 修改帐号的有效期限。
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-g<群组> 修改用户所属的群组。
-G<群组> 修改用户所属的附加群组。
-l<帐号名称> 修改用户帐号名称。
-L 锁定用户密码,使密码无效。
-s<shell> 修改用户登入后所使用的shell。
-u<uid> 修改用户ID。
-U 解除密码锁定。
/etc/profile 系统级 登陆的时候执行的文件
/etc/bashrc
~/.bash_profile 用户级 登陆的时候执行
~/.bashrc
~/.bash_logout 用户级 退出的时候执行
~/.bash_history
用户登陆的shell会执行
/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc
不能登陆的shell会执行
/etc/bashrc
~/.bashrc
查看所有用户
# cat /etc/passwd
查看所有用户组
# cat /etc/group
删除用户
# userdel -r user1 // 删除 加目录及邮件文件
# rm -rf /home/user1 // 如果没有执行 -r 则需要手动删除一下两个目录
# rm -rf /var/spoool/mail/user1
# id user1
删除用户
# useradd user1 // 没有密码不能登录 默认为lock状态
# passwd user1
sudo 权限
# visudo // 编辑的事此文件 /etc/sudoers
root ALL= (ALL) ALL // 在行此行后添加
teo ALL= (ALL) ALL // 给 teo 用户sudo权限
startalk ALL= (ALL) ALL
postgres ALL= (ALL) ALL
# vim /etc/sudoers // 设置允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令 wheel 组 gid 为10
echo "%wheel ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers // 把 wheel 设置 sudo 组
ssh 设置指定的登录用户
# vim /etc/ssh/sshd_config // 只允许root teo1 登录
Allowusers root teo1
# systemctl restart sshd
更改默认shell
# echo $SHELL // 查看 当前使用的shell
# zsh // shell 的一种
# chsh -l // 查看所有可以使用的shell
# chsh -s /usr/bin/bash // 更改默认 shell
73. firewall 命令 // 防火墙
# firewall-cmd --reload // 重载防火墙规则 每次修改要使用 此命令重新加载
# firewall-cmd --list-all // 查看防火墙规则
# firewall-cmd --state // 查看防火墙运行状态
# firewall-cmd --permanent --zone=public --add-port=9999/tcp // 添加 9999端口 放行
# firewall-cmd --permanent --remove-port=9527/tcp 删除 // 删除 9527端口
# firewall-cmd --permanent --add-port=9527/tcp // 添加 端口 宝塔里面可以看到
# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" port protocol="tcp" port="59157" accept" // 放行端口 宝塔可使用此命令
# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="18.162.228.120" port protocol="tcp" port="59157" accept" // 限定源ip
# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="43.243.95.0/24" port protocol="tcp" port="59157" accept" // 限定源ip段
74. nl 命令
# nl a.txt // 加行号 显示 空白行默认不加行号
# nl -b a a.txt // 空白行也 加行号
# nl -b a -n rz a.txt // 在起那么 补上000000 默认为6位
# nl -b a -n rz -w 3 a.txt // -w 3 调整补位的0 为3位
75. fdisk 命令
# fdisk -l // 查看 所有 磁盘
# fdisk /dev/sdb //
m // 帮助
n // 新建分区
p // 新建主分区
+10G // 分给 10G
e // 新建扩展分区
p // 显示 当前 分区 状态
d // 删除分区
w // 保存退出
q // 不保存退出
# mkfs.ext3 /dev/sdb1 //
# mkfs.xfs /dev/sdb // 使用xfs 格式化 sdb
# mount /dev/sdb1 /data/ // 挂载
76. parted 命令 // 分区操作
# parted -l // 查看所有分区
# parted // 进入
print devices // 显示所有硬盘设备
select /dev/sdb // 选择某一硬盘
p // 查看分区状态
mkpart // 创建分区
start
end -1 // 到最后
rm 4 // 删除分区4
77. mkfs 命令 // 格式化 建立文件系统
# ls -l /sbin/mkfs.* // 可以查看到所有支持的格式 实际就是调用这些文件
# mkfs -V // 显示版本信息
# mkfs.ext4 /dev/sdb4 // 把该设备格式化成ext4文件系统
.vfat // vfat就是fat32
.msdos // msdos就是fat16
78. du 命令
# du -sh ./aaa // 查看某目录 总大小
# du -sh // 查看当前 目录总大小
# du -h // 所有当前目录及子目录 大小
# du -h -d1 // -d1 一层子目录
# du --block-size=MiB --max-depth=1 | sort -n // 查看 所有 目录 大小
79. ln 命令 // 软连接 硬链接
# ln -s aa aa.soft // 软链接: 源文件 目标文件 删除软链接不影响源文件 删除源文件软连接不可用 类似快捷方式
aa.soft -> aa // 此符号为软连接
# ln aa aa.hard // 硬链接: 没有链接符号 i节点会和源文件一样 删除硬链接不会影响 原文件 修改会同时修改
// 任何 文件 都可以看成 i节点的 硬链接 不可以给文件夹创建硬链接
// 硬链接 可以做备份使用 不占用实际空间
# ln -s /data/soft /home/soft // 软链接目录 要使用绝对路径 不能使用相对路径 软链接: 源目录 目标目录
# ls -i // 查看文件或目录的 i节点 i节点可以理解为元数据库存储的地方
80. chattr 命令 lsattr 命令
chattr
+i // 对于文件 i权限 不能被删除修改等操作 对于文件夹 此文件夹下面所有的文件不能被 修改 删除 等操作
+a // 对于文件 a权限 不能被删除 只能追加内容 对于文件夹 下面所有的文件 不能被删除 可以新建
# chattr +i bbb // 给文件夹加 i权限
# chattr -R +i bbb // 递归
# chattr +i a.txt // 给文件 加 i 权限
# chattr -i a.txt // 去除 文件的特殊属性
lsattr
# lsattr -a // 查看当前文件夹下 所有文件的特殊权限
# lsattr b.txt // 查看单个文件的特殊权限
81. passwd 命令
# passwd git // 修改 git用户 的密码
# passwd -S git // 查看git 用户的状态 是否被锁住 如果提示 locked 则被锁定住
# passwd -l git // 锁定 git 用户 不能登录
# passwd -u -f git // 解锁 git 用户 如果设置密码 -u即可 -f为强制此用户密码为空的时候使用
# passwd -d git // 删除密码 移除 git 用户的密码 使之为空
# awk -F ':' '{if($2=="") print $0 }' /etc/shadow // 查看系统上 所有的 空密码 的用户
-d 删除密码
-f 强迫用户下次登录时必须修改口令
-w 口令要到期提前警告的天数
-k 更新只能发送在过期之后
-l 停止账号使用
-S 显示密码信息
-u 启用已被停止的账户
-x 指定口令最长存活期
-g 修改群组密码
指定口令最短存活期
-i 口令过期后多少天停用账户
82. centos ntfs 支持
方案一: 已测试可以正常使用
# yum install -y ntfsprogs // epel源
# wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
# tar -xzvf ntfs-3g_ntfsprogs-2017.3.23.tgz -C /usr/local/
# cd /usr/local
# mv ntfs-3g_ntfsprogs-2017.3.23 ntfs-3g_ntfsprogs
# cd ntfs-3g_ntfsprogs/
# vim configure // 注释掉此行 否则会报错
# $RM "$cfgfile"
# ./configure
# make
# make install
# ln -s /usr/bin/ntfs-3g /usr/bin/ntfs
# fdisk -l
# ls /dev/sdb*
# mount /dev/sdb1 /mnt // 挂载
# df -Th
# fdisk /dev/sdb // 如果需要重新分区 详细 参见 fdisk
# mkfs.ntfs -k /dev/sdb1 // 格式化 很慢 最好不要是用此格式化 使用windows格式化
方案二: 未测试
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum install ntfs-3g
83. less 命令
# tree | less // 可以把比较长的文档 给less 读取
# cat a.txt | less
/aaaa 向前搜索
?aaaa 向后搜索 都差不多
n 查找下一个
N 查找上一个
f 或 ctrl + f 向前移动一屏
b 或 ctrl + b 向后移动一屏
d 或 crtl + d 向前移动半屏
u 或 ctrl + u 向后移动半屏
j 向下移动一行
k 向上移动一行
G 移动到最后一行
g 移动到第一行
# less aaa.log // less 版 tail -f
84. diff 命令
# diff a b // 比较两个文件夹的不同
# diff a.sh c.sh // 比较两个文件的不同 没有返回说明相同
a - add
c - change
d - delete
3c3 // c为change 表示第一个文件的第3行 和第二个文件的第3行不同
< // 第一个文件
> // 第二个文件
6a7 // a 为 add
11,12d10 // d 为 delete
# diff a.sh c.sh -y -W 140 // 并排输出比较
-y 以并列的方式显示文件的异同之处。
-W 在使用-y参数时,指定栏宽
-w 忽略全部的空格字符
| 表示前后2个文件内容有不同
< 表示后面文件比前面文件少了1行内容
> 表示后面文件比前面文件多了1行内容
# diff a.sh c.sh -c // 上下文输出格式
-c 上下文 输出比较
+ 比较的文件的后者比前着多一行
- 比较的文件的后者比前着少一行
! 比较的文件两者有差别的行
# diff a.sh c.sh -u // 以合并的方式来显示文件内容的不同
-u 以合并的方式来显示文件内容的不同
85. traceroute 路由追踪
# yum install traceroute
# traceroute www.baiud.com
# traceroute -n www.baiud.com // 直接使用IP地址 不解析主机名
tracert -d www.baidu.com // windows -d 不解析主机名
86. cal 日历命令
# cal // 显示 当期月份的 日历
# cal -y // 显示 当前年份的 所有日历
# cal 1987 // 显示 指定年份的 所有日历
# cal 12 1987 // 显示指定年份 指定月份 的日历
# cal -3 // 显示当月 前一个月 后一个月的 日历
# cal -j // 显示在当年中的第几天 一年日期按天算 从1月1号算起
-s // 显示星期天为一个星期的第一天,默认的格式
-m // 显示星期一为一个星期的第一个天
87. du 命令 // 文件和目录磁盘使用的空间
# du -sh // 总大小
# du -h | sort -nr | less // 按照空间大小排序
# du -h --max-depth=1 // 输出当前目录下 一层子目录所使用的空间
# du -sh .[!.]* * // 查看隐藏
88. killall 命令
# yum install psmisc // killall 命令的包
# killall nginx // 杀死所有nginx进程
# killall -9 rsync // 强制杀程序 粗暴 最好不用-9
关于 杀死都有登录的 用户
# w // 显示当前所有用户登录信息及执行的命令
# killall -9 bash // 杀掉所有的bash 前所有连接丢失了 需要重新连接并登录
89. pkill 命令
# yum install procps-ng // pkill 由 procps-ng 包提供
# pkill rsync // 杀死程序
90. nl 命令
# nl a.txt // 加行号 显示 空白行默认不加行号
# nl -b a a.txt // 空白行也 加行号
# nl -b a -n rz a.txt // 在起那么 补上000000 默认为6位
# nl -b a -n rz -w 3 a.txt // -w 3 调整补位的0 为3位
91. sl 命令
# yum install sl
# sl // 火车
92. route 命令
常用 route 命令
# route add -host 192.168.10.2 eth0 // 到 10.2 经过 eth0 一般指定网卡即可
# route del -host 192.168.10.2 // 删除
# route add -net 192.168.20.0/24 ens33 // 添加网段
# route del -net 192.168.30.0/24 // 删除
# route add default gw 192.168.120.240 // 添加 默认网关
# route del default gw 192.168.120.240 // 删除 默认网关
添加永久路由
# vim /etc/sysconfig/network-scripts/route-ens33 // 跟route-网卡名字 跟网卡一个名字 走此网卡的路由
192.168.142.200/32 via 192.168.10.254 // 添加单个路由 主机路由
192.168.142.100/24 via 192.168.10.254 // 添加一个网段
# systemctl restart network
# route -n
route 命令 详解
Destination: 目标网段或者主机
Gateway: 网关地址 * 表示目标是本主机所属的网络 不需要路由
Genmask: 网络掩码
Flags: 标记
U — 路由是活动的
H — 目标是一个主机
G — 路由指向网关
R — 恢复动态路由产生的表项
D — 由路由的后台程序动态地安装
M — 由路由的后台程序修改
! — 拒绝路由
Metric: 路由距离 到达指定网络所需的中转数(linux 内核中没有使用)
Ref: 路由项引用次数(linux 内核中没有使用)
Use: 此路由项被路由软件查找的次数
Iface: 该路由表项对应的输出接口
主机路由: 就是到单个ip 是路由选择表中指向单个IP地址或主机名的路由记录 主机路由的 Flags 字段为 H
网络路由: 就是到网段 是代表主机可以到达的网络 网络路由的 Flags 字段为 N
默认路由: 当主机不能在路由表中查找到目标主机的IP地址或网络路由时 数据包就被发送到默认路由(默认网关)上 Flags字段为 G
# route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
add : 添加一条路由规则
del : 删除一条路由规则
-net : 目的地址是一个网络
-host : 目的地址是一个主机
target : 目的网络或主机
netmask : 目的地址的网络掩码
gw : 路由数据包通过的网关
dev : 为路由指定的网络接口
添加到主机的路由 单个路由
# route add -host 192.168.10.2 eth0 // 到 10.2 经过 eth0 一般指定网卡即可
# route del -host 192.168.10.2 // 删除
# route add -host 192.168.10.2 dev eth0 // dev 可以省略 都一样
# route add -host 192.168.10.2 gw 192.168.10.254 // 到10.2 经过网关10.254 一般不用指定网关
# route add -host 192.168.10.2 gw 192.168.10.254 dev eth0 // 到10.2 经过eth0 发到网关 10.254 一般不用指定网关
添加到网络的路由 网段
# route add -net 192.168.20.0/24 ens33
# route del -net 192.168.30.0/24 // 删除
# route add -net 192.168.20.0 netmask 255.255.255.0 dev ens33 // dev可以省略而已 两个一样
# route add -net 192.168.20.0 netmask 255.255.255.0 ens33
# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.20.1 // 指明 网关 网关要存在
添加默认路由
# route add default gw 192.168.120.240 // 添加 默认网关
# route del default gw 192.168.120.240 // 删除 默认网关
屏蔽路由
# route add -net 192.168.20.0 netmask 255.255.255.0 reject // 屏蔽一条路由
# route del -net 192.168.20.0 netmask 255.255.255.0 reject // 删除 屏蔽路由条目
删除路由
# route del -host 192.168.1.2 dev eth0:0
# route del -host 10.20.30.148 gw 10.20.30.40
# route del -net 10.20.30.40 netmask 255.255.255.248 eth0
# route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
# route del -net 192.168.1.0/24 eth1
# route del default gw 192.168.1.1
93. tee 命令
# ls | tee // tee以标准输入作为输入,标准输出和文件作为输出。
# cat aa.txt | tee b.txt // 把 aa.txt的内容 追加 b.txt 如果没有 b.txt 则创建
# cat aa.txt | tee -a b.txt // 把 aa.txt的内容 追加 b.txt 如果没有 b.txt 则创建
# cat aa.txt | tee a.txt b.txt c.txt // 列出文本文件 aa.txt 的内容 同时复制3份副本 没有a.txt 会创建 如果有会覆盖
# cat aa.txt | tee - // 输出到标准输出两次
# cat aa.txt | tee - - // 输出到标准输出三次
# tee a.sh // 会生成一个 a.sh 的文件 里面包含敲入的内容 ctrl + d 结束 +c 也行
# tee -i a.sh // 不接受中断信号 即 是能使用ctrl + d 结束 crtl + c 不能结束
-a // 追加
-i // 不接受中断信号
--version // 显示版本信息
(
cat <<'EOF'
aaaaaaaaaaaaaaaaaaaaaaaaaa
EOF
) | tee /data/a.txt // 配合 EOF 写入文件
100. 其他命令
# w // 显示当前所有用户登录信息及执行的命令
# mkdir -pv /data/{shell,soft,www} // 建立一串目录
# dhclient -r eth0 // 释放dhcp 获取到的ip
# dhclient -v eth0 // 主动获取ip
# echo "8888" | md5sum // 查看一个字符串 md5的值 可用作 生成密码 随机数
# echo $RANDOM // 生成随机数字
# echo $RANDOM|cksum |cut -c 1-2 // 取两位随机数
# route add -host 192.168.10.30 dve ens33:0 //
# ifconfig ens33:0 192.168.10.30/32 broadcast 192.168.10.30 // 网卡配置多个ip地址
# route -n // 查看路由表
# route add -net 192.168.20.0/24 gw 172.16.100.9 // 添加路由
# cat -n a.txt // 加行号显示 空白行也加行号
# wget --no-check-certificate https://www.ssyy99.com/download/Moniterdb.sql.gz // 下载 --no... 不检测安全性
102.关于证书
❶. 最新 certbot 申请证书 2024.1.10更新
# yum install epel-release
# yum install snapd
# systemctl enable --now snapd.socket
# ln -s /var/lib/snapd/snap /snap // 创建/var/lib/snapd/snap和/snap之间的链接
# snap install core // 可能需要运行两次 需要在epel源上下载
# snap refresh core
# snap install --classic certbot
# ln -s /snap/bin/certbot /usr/bin/certbot
①. 80端口 未占用时 申请证书
# systemctl stop nginx
# certbot certonly --standalone --email k051197@kok.work -d b.kshenbf.com
②. nginx 运行时 yum安装的nginx 申请证书 // 针对 yum 安装的nginx nginx要运行80被监听
# certbot certonly --nginx --nginx-server-root /etc/nginx --email teo@teo.com -d ssyy99.com -d www.ssyy99.com
③. nginx 运行时 编译安装的nginx 申请证书
# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx // 针对 编译安装的nginx 需要 创建软连接
# ln -s /usr/local/nginx/ /etc/nginx
# certbot certonly --nginx --nginx-server-root /usr/local/nginx/conf --email teo@teo.com -d ssyy99.com
注:
❶. 如有证书还未到期 先把原的证书文件夹改其他名字 在改相关配置文件执行新改的名字目录 在新生成证书 修改配置文件证书目录
❷. 如果 有老版本 certbot 先要卸载
# yum remove certbot
# rm /usr/local/bin/certbot-auto
# rm -rf /opt/eff.org/certbot
❸. 提示错误 The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists,
the binary is executable, and your PATH is set correctly.")
The nginx plugin is not working; there may be problems with your existing configuration.
# which nginx // 查看nginx文件执行目录
# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx // 添加软连接 在执行申请证书
❹. 提示错误 打开网页提示 使用了不受支持的协议 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
在nginx配置文件中添加 ssl_ciphers HIGH;
添加定时任务
crontab -e 每10天 晚上22点 自动续期证书
0 22 */10 * * /usr/bin/certbot renew --quiet
检测证书 本地 pem 证书 到期时间
openssl x509 -enddate -noout -in download.midianshangmeng.com.pem | awk -F '=' '{print $2}' | xargs -I {} sh -c 'echo $((($(date -d "{}" +%s)-$(date -u "+%s"))/(3600*24)))'
检测证书 还剩下多少天
timeout 1 openssl s_client -servername ssyy99.com -connect ssyy99.com:443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep 'notAfter' | awk -F '=' '{print $2}' | xargs -I {} sh -c 'echo $((($(date -d "{}" +%s)-$(date -u "+%s"))/(3600*24)))' 2>/dev/null
❷.acme.sh 申请证书
# curl https://get.acme.sh | sh // 必须使用root 会在家目录下生成隐藏文件夹 .acme.sh 或者直接拷贝acme.sh 来此文件夹
# alias acme.sh=~/.acme.sh/acme.sh // 添加别名 方便使用
# echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile // 添加到 环境 方便使用
基于文件验证
# acme.sh --issue -d ssyy99.com -d www.ssyy99.com --webroot /www/wwwroot/ssyy99.cpm/ -m teo@teo.com // 申请证书 指明网址目录
# acme.sh --issue -d ssyy99.com --nginx -m teo@teo.com // 基于 nginx
# acme.sh --issue -d ssyy99.com --apache -m teo@teo.com // 基于 apache
# acme.sh --issue -d ssyy99.com --standalone -m teo@teo.com // 没有80端口监听的情况下
基于 DNS 验证 // 亦可使用 域名解析商提供的 api 自动添加 txt 记录完成验证. 这里不介绍
# acme.sh --issue --dns -d ssyy99.com // 基于 dns 验证 需要在 解析 txt 记录
# acme.sh --renew -d ssyy99.com // 解析 txt 记录 之后 在执行申请申请书
其他命令
# acme.sh --list // 显示已申请的证书信息
# acme.sh --upgrade // 更新 手动更新 acme主程序
# acme.sh --upgrade --auto-upgrade // 自动更新 acme主程序 以后会自动更新
# acme.sh --upgrade --auto-upgrade 0 // 关闭 自动更新
关于 拷贝证书 // 最好使用此命令拷贝证书 不要是用默认的目录 证书60天会自动续签 使用命令拷贝会自动续签
# acme.sh --installcert -d domain.com \
--key-file /usr/local/nginx/conf/ssl/ssyy99.com.key \
--fullchain-file /usr/local/nginx/conf/ssl/ssyy99.com.cer \
--reloadcmd "service nginx reload"
❸. 使用 certbot-auto 脚本 (有可能此方法已经失效)
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
# systemctl stop nginx // 需要停止nginx 使80端口不被占用 生成证书有效三个月
# ./certbot-auto certonly --standalone --email k051535@qq.com -d baidu.com -d www.baidu.com -d ssyy99.com
a
y
注:
❶. 证书目录 及 相关文件
# tree /etc/letsencrypt/live/ // 查看安装的证书的目录
cert.pem // Apache服务器端证书
chain.pem // Apache根证书和中继证书
fullchain.pem // Nginx所需要ssl_certificate文件
privkey.pem // 安全证书KEY文件 Nginx环境,就只需要用到fullchain.pem和privkey.pem两个证书文件
❷. nginx 添加证书关键配置文件
server {
listen 443 ssl;
server_name ssyy99.com;
charset utf-8;
ssl_certificate /etc/letsencrypt/live/ssyy99.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ssyy99.com/privkey.pem;
ssl_stapling on;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
❸. certbot-auto其他命令
./certbot-auto certificates // 查看SSL证书的过期时间
./certbot-auto renew --force-renew // 强制更新证书命令
❹. 续期
# ./certbot-auto renew // 自动续期 需要停止nginx 80 443端口不能被占用
# crontab -e // 亦可以加到 定时任务 自动续期
* * 1 * * systemctl stop nginx;/data/shell/certbot-auto renew --no-self-upgrade;systemctl start nginx
❹. 使用 certbot 申请 通配符域名证书 需要DNS验证 (有可能此方法已经失效)
# yum install epel*
# yum install certbot
# certbot --version
# certbot -d ssyy99.com -d *.ssyy99.com --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory certonly --agree-tos --register-unsafely-without-email
Press Enter to Continue // 第一个 回车 同意 直接按 根据提示解析DNS
_acme-challenge iLS0NjcdP3RR1KphB6xbbVnKS_NS2uMW-xdDRzz85OM // 根据提示 需要DNS解析
# host -t txt _acme-challenge.ssyy99.com // 可开其他机器测试 可测试DNS是否成功
Press Enter to Continue // 第二个 回车 需要 DNS 解析测试完在按
/etc/letsencrypt/live/ssyy99.com/fullchain.pem // 证书地址
/etc/letsencrypt/live/ssyy99.com/privkey.pem
❺. 使用 freessl.org 免费证书申请流程
https://freessl.org
证书类型 RSA
验证类型 文件验证
CSR生成 浏览器生成
添加到nginx文件验证 // 对于DNS验证 添加 @ tet 记录即可
location / { // 对于强制跳转的加如下代码 在80端口下添加注释掉原来的rewrite
rewrite ^/(.*) https://$server_name$1 permanent;
}
location /.well-known/pki-validation { // 对于不是强制跳转 加以下代码即可
charset utf-8;
alias /data/; // godaddy.html 或要验证的文件 复制到此目录下
sendfile on;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
# /usr/local/sbin/nginx -t
# /usr/local/sbin/nginx -s reload // 证书:*.crt 私钥: *.key
❻. 使用 godaddy 购买证书 申请证书
# (umask 077; openssl genrsa -out www.ssyy99.com.key 2048)
# openssl req -new -key www.ssyy99.com.key -out www.ssyy99.com.csr -days 730 // 拿到csr复制到godaddy官网
CN Beijing Beijing ssyy99 OMD www.ssyy99.com ssyy99@google.com
godaddy 验证步骤 https://sg.godaddy.com/zh/help/html-dns-7452
❼. Windows IIS部署证书流程
Linux
# yum install openssl
# rz cs.tskefu.com.key cs.tskefu.com.crt // 需生成 .pfx文件 密码123456即可
# openssl pkcs12 -export -out cs.tskefu.com.pfx -inkey cs.tskefu.com.key -in cs.tskefu.com.crt
Windows
① 把pfx文件复制到证书目录下 D:\zrpfx
② 打开IIS应用池 SERVER-02 --> 服务器证书 --> 导入
③ 打开www.online.com主页 --> 右键编辑绑定 --> 编辑/添加 --> 选择要使用的证书
注:
❶ 此key文件为linux格式 否则会报错 可以使用把key复制到vim编辑另存即可
103. 宝塔
宝塔安装
# wget http://download.bt.cn/install/install_6.0.sh
# chmod +x install_6.0.sh
# ./install_6.0.sh
# bt // 宝塔面板 命令行 文件在 /etc/init.d/bt
# bt restart
# bt stop
# bt reload
卸载
# /etc/init.d/bt stop
# chkconfig --del bt
# rm -f /etc/init.d/bt
# rm -rf /www/server/panel
宝塔配置文件
# vim www/server/panel/data/admin_path.pl // 设置安全 端口
/4084ae67
# rm www/server/panel/data/admin_path.pl // 关闭安全入口 删除此文件即可
# vim /www/server/panel/data/port.pl // 修改宝塔端口
8888
# cat /tmp/panelBoot.pl // 日志
# vim /www/server/panel/tools.py // 面板配置文件
绕过 注册页面
1.修改配置文件
# vim /www/server/panel/BTPanel/static/js/index.js
if (bind_user == 'REMOVED') { // 修改此项 绕过 注册
2. 临时 绕过注册页面
链接后面加上/soft /files这样即可轻松越过强制绑定
3. 删除登录页面 前面两种在新版中已经不管用了
# cd /www/server/panel/BTPanel/templates/default
# mv bind.html bind.html.bak
备份数据
注意 PHP mysql nginx apache 版本
sz /www/wwwroot // 网址目录
sz /www/server/panel/vhost // 网址配置文件
sz /www/server/panel/data // 主要备份default.db 宝塔面板数据文件
# ./mysql_bak.sh // 备份mysql数据库 注意mysql版本 5.5 5.7不互通
推送 到服务器安装rsync
# vim /etc/rsyncd.conf
uid = www
gid = www
port = 63873
use chroot = no
max connections = 10
hosts allow = 192.168.10.10
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
[cp_web]
path = /data/www
read only = no
# groupadd www
# useradd -g www www
# chown -R www.www /data/wwwroot
# rsync --daemon
# ss -tnl
# pkill rsync
# iptables -A INPUT 4 -p tcp --dport 63873 -j ACCEPT
# rsync -avzP --port=63873 /www/wwwroot/ www@192.168.10.11::cp_web // 推送到目标
还原数据
rz /www/wwwroot // 网址目录
rz /www/server/panel/vhost // 网址配置文件
rz /www/server/panel/data/default.db // 使用Navicat修改宝塔数据库 此文件存放宝塔面板的信息
# ./mysql_re.sh // 还原mysql数据 注意测试
修改面板数据
使用navicat 导出sites domain databases表格
sites 表格k列设置id
domain 表格G列设置id I列=VLOOKUP(B2,sites.xlsx!$A$2:$K$153,11,1) 替换id 和pid列 删除G I 列保存
databases 表格J列设置id L列=VLOOKUP(B2,sites.xlsx!$A$2:$K$153,11,1 ) 替换id和pid列 删除J L列保存
sites 替换id列 删除k列保存
宝塔数据面板 sqlite数据库 /www/server/panel/data/default.db
sites 网站
domain 网站-->域名管理的端口 pid要与sites表的 id 对应
firewall 安全
databases 数据库
users 登陆密码
crontab 计划任务
宝塔 问题
1. 一些网站会提示 php短标签(short_open_tag)功能才能运行!
# vim /www/server/php/56/etc/php.ini
short_open_tag = Off
104. 苹果包做分发 做下载链接
1. 包需要先做签名 具体在此不论述
2. 配置苹果包下载地址 必须为ssl https://m.ssyy99.com/ssyy99.com.ipa
3. 创建plist文件 路径为 https://m.ssyy99.com/ssyy99.plist 格式如下
4. 下载路径为 itms-services://?action=download-manifest&url=https://m.ssyy99.com/ssyy99.plist
# vim ssyy99.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://m.ssyy99.com/ssyy99.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.youmi.shangpin</string>
<key>bundle-version</key>
<string>1.0</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>ssyy99</string>
</dict>
</dict>
</array>
</dict>
</plist>
注:
plist文件详解
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://sss/ss/ss.ipa</string> ipa包下载地址
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>url</key>
<string>https://sss/ss/icon.png</string> 这里是APP图标
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>url</key>
<string>https://sss/ss/ss.png</string> 这里是APP图标
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>sss</string> IPA打包包名
<key>bundle-version</key>
<string>1.0</string> APP版本
<key>kind</key>
<string>software</string>
<key>title</key>
<string>ss</string> APP名字
</dict>
</dict>
</array>
</dict>
</plist>
完整访问路径: itms-services://?action=download-manifest&url=https://xxx/manifest.plist
js代码跳转: window.location.href = “itms-services://?action=download-manifest&url=https://域名/manifest.plist”;
105. linux 使用 其他邮箱 SMTPS 465 端口 发送邮件 // 可做成脚本
# mkdir -p /root/.certs/ // 创建证书 证书随便即可
# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
# certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
# certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
# certutil -L -d /root/.certs
# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt // 信任证书
# vim /etc/mail.rc // 追加即可
set smtp="smtps://smtp.qq.com:465"
set smtp-auth=login
set smtp-auth-user="aaaaaaaaa@qq.com" // 换成你的邮箱
set smtp-auth-password="123456" // 换成你的邮箱第三方登录密码
set ssl-verify=ignore
#set nss-config-dir=/etc/pki/nssdb
set nss-config-dir=/root/.certs
# echo 123456 | mail -v -r "228444347@qq.com" -s "hello world" 228444347@qq.com // 发送邮件 一定要带-r参数 -v调试
106. 关于 百度统计 及 网页代码 跳转
百度统计代码 类似 下面的形式 加到网页即可
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?def0d57de38ea6e5180ad67193da61e9";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
# vim index.html // 使用nginx root 指向此index.html 即可 跳转
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<title>美女都让狗咬了</title>
<meta http-equiv="keywords" content="美女,都让,狗,咬了,linux,">
<link rel="shortcut icon" href="./icon.png"/>
<meta name=”Description” Content=”linux技术博客”>
</head>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?ff6f1626d0efb1cdbe7c261b62beeafe";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script>
var url="https://www.ssyy99.com"; var str1=document.title; document.write('<meta id="viewport" name="viewport" content="user-scalable=no,width=device-width, initial-scale=1.0" />'); document.write('<style>html,body{width:100%;height:100%;overflow:hidden; clear:both;}</style>'); document.write('<div style="width:100%;height:100%;position:absolute;top:0;left:0;z-index:2147483647;">'); document.write('<iframe src=" '+url+'" frameborder="0" style="border:0;width: 100%; text-align: center; border: medium none; height:100%;max-height: 4000px;"></iframe>'); document.write('</div>');
</script>
<script>
!function () {
var devices = ["iPhone","Android","Windows Phone"]
var ua = window.navigator.userAgent
for (var i = 0; i < devices.length; i++) {
if (ua.indexOf(devices[i]) != -1) {
window.location.href = 'https://m.ssyy99.com'
}
}
}()
</script>
<body>
</body>
</html>