Linux基础命令-Nginx-正则表达式( grep sed awk )-Shell Script--etc
Linux基础使用
内存
- 查看swap分区信息 >
swapon -s
- 添加swap分区 >
mkswap /dev/sdb2
> 激活swapon -a /dev/sdb2
即可 - 移除swap分区 >
swapoff /dev/sdb2
- 查看系统版本 >
cat /etc/redhat-release
>more /etc/*release
可以看到更多信息 - buffer A buffer is something that has yet to be "written" to disk
- cache A cache is something that has been "read" from the disk and stored for late use
- 清理cache >
echo 3 > /proc/sys/vm/drop_caches
echo $[88316+8764]
进行简单的计算(+-*/)- total-used=free+buff/cache 内存就是用来分buffer和cache的
dd if=/dev/zero of=/root/test bs=50M count=1
测试磁盘速度,zero为空文件
进程管理
ps aux
查看所有进程 >grep
过滤的意思- 查看特定的进程 >
ps aux | grep firefox
- 杀死进程 >
kill -9 3489
( 9表示强制杀) 或者pkill -9 firefox
firefox &
即命令后接&
在后台启动,在当前终端使用jobs
可以查看工作号 >kill -9 %1
使用工作号杀- centos7最小化安装没有ptree (树型显示当前运行的进程),需要安装
yum install psmisc
- pgrep sshd 直接显示包含sshd的进程的PID号
软件包管理
-
rpm -ivh rpm文件名
i 安装, v 显示安装信息, h显示进度条 后接--nodeps
忽略以来,--force
覆盖安装 -
rpm -qi 软件名
查看软件的详细信息 ,q 表示查询, i information -
rpm -ql 软件名
查看软件位置, l 表示位置 -
rpm -qf 文件名
查看该文件是由哪个软件包产生的 -
查看命令对应的文件的真实位置
which ls
-
rpm -qa
显示全部安装的rpm包,跟grep结合验证是否安装了某个包,rpm -qa | grep vsftp
或者rpm -q vsftpd
必须知道软件包全名 -
ls ----> /etc/usr/ls --color=auto 这是流程 ,
alias s='ls'
为ls命令起别名, 永久的话修改vim /etc/bashrc
或者vim /etc/profile
-
rpm -e 软件包名
卸载软件 -
rpm -e `rpm -qa \grep vsftp
这里反引号的作用是把后面的结果看作变量作为前面的输入 -
rpm安装对依赖性问题不好解决,需要先手动安装依赖包,yum自动解决依赖性
-
手动配置yum源,事先将完整的光盘挂载到
/opt
,移走原有的repo,然后vi /etc/yum.repos.d/loal.repo
[local] name=local.repo baseurl=file:///opt #可以本地也可以网上 enable=1 gpgcheck=0
yum clean all
清除缓存后就可以用自己配置的yum源安装yum -y install xxxxx
-
yum erase xxx
删除已经安装的软件 或yum remove xxx
-
yum install epel-*
安装扩展源 -
yum makecache
创建缓存提高下次装软件的速度 -
要想保留yum下载的rpm包,需要更改设置
vim /etc/yum.conf
cachedir=/root/rpm_bak #路径自己设置 keepcache=1 #0改为1
-
部署自己的yum仓库
- 新建仓库文件夹
mkdir /repo_httpd
- 将所有依赖包和该rpm包放在这个文件夹中,方法如上一条所示
- 创建依赖关系
createrepo /repo_httpd
, 之后在该文件夹中生成repodata文件夹 - 手动配置yum源,如之前所示, 其中
baseurl=file:///repo_httpd
- 同理修改
baseurl=http://xxxxx
可以自定义网络yum源
- 新建仓库文件夹
-
yum grouplist
列出有哪些软件包组,yum groupinstall "开发工具"
安装开发工具 -
wget --no-check-certificate https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
下载,tar xvf Python-3.6.1.tgz
解压,进入目录,configure为安装配置文件,为了生成makefile文件,./configure --prefix=/usr/local/python3.6
, 然后make && make install
编译并安装,报错的话缺啥装啥yum install zlib*
-
PATH=/usr/local/python3.6/bin:$PATH
设置临时的环境变量, 永久的话vim /etc/profile
在末尾加上PATH=/usr/local/python3.6/bin:$PATH export PATH
-
yum update
全部更新包括配置和内核,yum upgrade
只更新软件包 -
安装
yum install sysstat*
里面有查看运行信息的软件vmstat
iostat
-
安装
yum install net-tools
,执行netstat -tunalp
查看端口详细信息 可以netstat -tunalp | grep 22
查看目的端口 。另外sar
啥也能看
n g i n x
-
yum install nginx
安装 -
写配置
vim /etc/nginx/nginx.conf
摘取部分如下worker_processes auto; #自动检测CPU数目,几个CPU开几个进程 error_log /var/log/nginx/error.log; #错误日志 include /usr/share/nginx/modules/*.conf; #包含的模块 events { #一个进程开多少线程 worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #日志格式 access_log /var/log/nginx/access.log main; #访问日志,以main格式写入 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; #包含的配配置文件 server { #核心配置 listen 80 default_server; #监听端口号 listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; #Web根目录 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { #匹配/a/b/c/d.txt,若以/开头则匹配这个配置,没有内容则按全局配置 } }
-
URL 统一资源定位符 11.12.13.14:80 找到唯一的一个软件
-
URI 统一资源标识符 /a/b/c/d.txt 找到唯一的一个文件 /usr/share/nginx/html/a/b/c/d.txt
-
systemctl start nginx
启动nginx status查看状态 -
systemctl stop firewalld
关闭防火墙,systemctl disable firewalld
开机不启动,enable开机启动,iptables -F
清除防火墙配置 -
tail -f /var/log/nginx/access.log
动态查看日志文件
反向代理
-
将虚拟机拷贝3个提供Web功能,原虚拟机提供反向代理
-
按照官网的手册 Using nginx as HTTP load balancer 配置提供反向代理的机器
-
为实现数据的一致,给几台Web服务器提供共享存储 如 NFS,文件存储
对象存储--->像网盘一样,下载下来修改再上传覆盖,通过URI定位。 块存储 ---> 类似一整块磁盘
-
可以给NFS服务器专门挂载一块硬盘
-
临时配置IP地址
ifconfig 网卡名 IP地址
-
##服务端配置 [root@localhost ~]# mkdir /share #新建文件夹 [root@localhost ~]# mount /dev/sdb1 /share/^C #挂载一块硬盘 [root@localhost ~]# touch /share/share.txt [root@localhost ~]# echo 'hello share' > /share/share.txt [root@localhost ~]# vim /etc/exports #编辑配置文件 [root@localhost ~]# cat /etc/exports /share 192.168.58.0/24(rw,sync,fsid=0) #配置文件内容 [root@localhost ~]# chmod -R o+w /share #为文件夹添加权限 [root@localhost ~]# systemctl start rpcbind.service #先开启RPC服务 [root@localhost ~]# systemctl start nfs-server.service #再开启NFS服务 [root@localhost ~]# systemctl enable nfs-server.service #设置开机启动 Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. [root@localhost ~]# systemctl enable rpcbind.service
-
##客户端配置 [root@localhost ~]# systemctl enable rpcbind.service && systemctl enable nfs-server.service Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. #开机启动 [root@localhost ~]# showmount -e 192.168.58.129 #查看共享服务 Export list for 192.168.58.129: /share 192.168.58.0/24 [root@localhost ~]# mount -t nfs 192.168.58.129:/share /usr/share/nginx/html/ #挂载 [root@localhost ~]# ls /usr/share/nginx/html/ #查看挂载后文件内容 share.txt [root@localhost ~]# df |grep 129 #查看磁盘信息 192.168.58.129:/share 18351104 2376448 15974656 13% /usr/share/nginx/html
网络配置
ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>#功能# mtu 1500#最大传输单元,字节单位#
inet 192.168.58.129 netmask 255.255.255.0 broadcast 192.168.58.255
inet6 fe80::c00d:cb8b:4aed:6cc7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1c:9a:5a#MAC地址# txqueuelen 1000 (Ethernet)
RX packets 3422 bytes 444096 (433.6 KiB) #收了多少包#
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2374 bytes 418819 (409.0 KiB) #传了多少包#
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 20 bytes 1524 (1.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20 bytes 1524 (1.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
-
ifconfig ens33 192.168.58.200/24
手动配置IP地址, 24表示子网掩码255.255.255.0 -
vim /etc/resolv.conf
修改DNS信息nameserver 192.168.58.2
-
route add default gw 192.168.58.254 netmask 255.255.255.0
添加网关,route -n
查看路由信息, del为删除[root@localhost share]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.58.2 0.0.0.0 UG 100 0 0 ens33 #不一个子网 192.168.58.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 #同一个自网内
-
要想永久修改
cd /etc/sysconfig/network-scripts/
该目录下有很多配置信息vim ifcfg-ens33
TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.58.200 NETMASK=255.255.255.0 GATEWAY=192.168.58.254 DNS1=192.168.58.254 DNS2=114.114.114.114 DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=2ceec922-bd48-4fcb-8c96-56a288ddb680 DEVICE=ens33 ONBOOT=yes #开机激活网卡
重启网络服务
systemctl restart network
即可 -
vim /etc/hosts
修改hosts -
[root@localhost network-scripts]# hostnamectl set-hostname centostest #设置hostname [root@localhost network-scripts]# hostname #查看hostname centostest
SSH
-
[root@localhost ~]# ssh 192.168.58.129 #登录默认root 实际ssh root@192.168.58.129 The authenticity of host '192.168.58.129 (192.168.58.129)' can't be established. ECDSA key fingerprint is 82:68:11:05:e9:98:f9:bb:df:a1:02:e2:72:59:cb:0e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.58.129' (ECDSA) to the list of known hosts. root@192.168.58.129's password: #输入密码 Last login: Mon Apr 3 22:48:51 2017 from 192.168.58.1 [root@centostest ~]# #SSH登录成功,前后主机名不一样
-
scp远程复制文件
[root@centostest ~]# scp /etc/hosts 192.168.58.131:/tmp #远程复制,也可用域名,前后位置可换 -r目录 The authenticity of host '192.168.58.131 (192.168.58.131)' can't be established. ECDSA key fingerprint is 82:68:11:05:e9:98:f9:bb:df:a1:02:e2:72:59:cb:0e. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '192.168.58.131' (ECDSA) to the list of known hosts. root@192.168.58.131's password: #输入密码 hosts 100% 159 0.2KB/s 00:00 #复制成功
-
在客户端把SSH密钥生成
ssh-keygen
之后在/root/.ssh/
目录下有生成的信息id_rsa.pub
-
把密钥等发给服务端
ssh-copy-id -i 192.168.58.131
之后在服务端的相同路径下会找到相关文件authorized_keys
, 即发给了root用户目录下,如发给其他用户可以在该用户目录下找到公钥 -
之后客户端直接
ssh 192.168.58.131
不需要输入密码即可登陆成功 -
配置文件在
vim /etc/ssh/sshd_config
。若服务端更改端口为8888,以上发送密钥时需要ssh-copy-id -i id_rsa.pub 192.168.58.131 -p 8888
,连接时ssh 192.168.58.131 -p 8888
即可
bash
-
source a.sh
没加权限也可以执行 -
命令优先级
1. alias #alias查看当前的别名 alias ppp='ls -l'设置 unalias ppp取消 2. compound commands #if for while 3. function #function ppp() { echo hello;echo bash; }定义 ppp执行 set查看当前函数 unset ppp清除 4. build_in #内建 如cd 5. hash #hash查看 hash -r清除 6. $PATH #路径 7. error:command not found
-
通配符
$[] #运算 同$(()) $() #同``一样 ${} # % 取余 ^ ! #取反 & #后台运行 && 与 | 管道 || 或 * 任意 ? 任意一个 = 赋值 == 判断是否相等 [ $x == $y ] ---> test echo $? 取上一条命令的执行结果 \ ---> "$x"软引用,取值 '$x'硬引用,$没有其他意义 : 永远为真,常与while连用 ; 命令分割 / 路径分割符 >> 追加 > 覆盖
固化命令的方式
#以登录的方式加载顺序
/etc/profile
/etc/profile.d/a.sh
/root/.bash_profile
/root/.bashrc
/etc/bashrc
#不登录的方式加载顺序
/root/.bashrc
/etc/bashrc
/etc/profile.d/a.sh
正则表达式
grep ----
-
常用参数
-n :显示行号 -e :指定多个规则 -o :只显示匹配的内容 -q :静默模式,没有任何输出,得用echo $?来判断执行成功(0)没有,即有没有过滤到想要的内容 -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc -A :如果匹配成功,则将匹配行及其后n行一起打印出来 如 grep -A 2 'root' test.txt -B :如果匹配成功,则将匹配行及其前n行一起打印出来 -C :如果匹配成功,则将匹配行及其前后n行一起打印出来 --color -c :如果匹配成功,则将匹配到的行数打印出来 -E :等于egrep,扩展 -i :忽略大小写 -v :取反,不匹配 -w:匹配单词 例:过滤掉无用的行,包括注释和空格 grep -v '^#' /etc/ssh/sshd_config | grep -v '^ *$'
-
正则表达式
^ 行首 $ 行尾 . 除了换行符以外的任意单个字符 * 前导字符的零个或多个 .* 所有字符 [] 字符组内的任一字符 #若要匹配-需要放在最后\- [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符) ^[^] 非字符组内的字符开头的行 [a-z] 小写字母 [A-Z] 大写字母 [a-Z] 小写和大写字母 [0-9] 数字 \< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 \> 单词尾 ? 前导字符零个或一个 + 前导字符一个或多个 abc|def abc或def a(bc|de)f abcf 或 adef x\{m\} x出现m次 #egrep不加\ x\{m,\} x出现m次至多次(至少m次) x\{m,n\} x出现m次至n次
sed ---- 流编辑器 stream editer,是以行为单位的处理程序
sed [options] 'command' in_file[s]
options 部分
-n 静默模式,不显示默认输出
-e 指定多个规则
-i 直接修改原文件
-f 指定匹配规则文件
command 部分
'[地址1,地址2] [函数] [参数(标记)]'
//里面正则表达式定址
例: sed -r '1 s/()()()/\1\2\3/g' passwdbk 1表示定位第几行,g表示把这一行的所有匹配的都修改了,括号表示第几部分,后面的\1表示第一部分显示的位置
awk ---- 处理有格式的文件 !!!!!!
awk [options] 'commands' files
option
-F 定义字段分隔符,默认的分隔符是连续的空格或制表符
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域 例:awk -F: '{print $1,$4}' passwdbk $0所有
NF变量表示当前记录的字段数 可用 $NF 取最后一段
NR表示行号 例: awk -F: 'NR>=3 && NR<=5{print NR,"----",$1}' passwdbk ||或
//里面正则表达式定址 例 awk -F: '/nologin$/{print $1}' passwdbk
让某一部分匹配正则 awk -F: '$1~/^r.*t$/{print $NF}' passwdbk
-v 定义变量并赋值 也可以借用次方式从shell变量中引入
例:
count=7
awk -v x=$count -F: '$3 >= x{print $1}' passwdbk
addr=`ifconfig |awk 'NR==2{print $2}'` 取IP地址
其他命令
du -sh /boot/ #统计目录大小
cat test |sort |uniq -c #排序去重,c显示重复的行数
cat /etc/passwd |cut -d: -f2,3 #d表示以什么分割 f指定取第几部分 可作为awk的简单模式
dd if=/dev/zero of=/test.ha bs=20M count=1 #新建一个指定大小的文件
find / -size +10M -size -30M -type f -name \*.ha #在/目录下寻找文件大小>10M且<30M,类型为普通文件,后缀名为ha的文件
grep -rl 'root' /etc #在/etc目录下寻找文件内含有'root'的文件并把文件名输出,r表示递归,l表示显示文件名
shell script
中括号 [] 相当于 test
获取当前内存使用率:
mem_per=`echo "scale=2;$mem_used/$mem_total" | bc -l | cut -d. -f2` #scale保留几位小数,bc浮点运算
echo ${mem_per}%
$$ 进程PID
$* 所有参数
$# 参数个数
当nginx关闭时开启nginx
#!/bin/bash
var=`systemctl status nginx| awk 'NR==3{print $2}'`
if [ $var = inactive ]
then
systemctl start nginx
fi
将x.sh文件移动到/usr/bin/目录下可以在任何位置使用x执行改脚本
计划任务
rondtab -e -u root #e表示编辑 u表示用户
在计划任务中所有命令都使用绝对路径!!!
------------本地有md文件备份----------
-----------------end------------------