• [技术干货] Zabbix监控内存信息收集
    介绍:         通过Zabbix系统监控记录应用在服务器上进程内存的使用情况,以便于分析服务器的性能瓶颈,首先编写shell脚本来获取服务器内存资源使用率最大的进程,然后通过Zabbix对这些进程的内存资源使用情况进行监控并收集数据。方法:         第一种方法:使用free命令可以获得当前内存使用情况,Centos6的命令和OS7的命显示有所不同,区别在于CentOS7多显示了/+buffers/cache         第二种方法:使用/proc/meminfo文件把系统状态信息很详细的显示出来,使用代码: less /proc/meminfo参数:         Mem/total值:代表总的物理内存          Mem/available值:代表系统还剩下多少内存可用-其实大概等于buff/cache+free的值         Mem/used值:代表已经使用的内存(total-free)包含buffers和cached分配出去的量(与7used区别)        (-/+ buffers/cache)/used值:total-free-buffers-cached       (-/+ buffers/cache)/free值:free+buffers+cached 脚本:#touch memroy_status.sh#!/bin/bashMemTotal(){awk'/^MemTotal/{print $2}/proc/meminfo'}MemFree(){awk'/^MemFree/{print $2}/proc/meminfo'}Dirty(){awk'/^Dirty/{print $2}/proc/meminfo'}Buffers(){awk'/^Buffers/{print $2}/proc/meminfo'}$1         同前俩次文章一样可以添加类似的权限 chmod a+x memory_status.sh执行脚本,./memory_status.sh Memtotal/MemFree/Diry/Buffers。即可显示对应结果。当业务需求对特定服务器进行监控时,可以通过编写脚本获取各个进程占用系统资源的信息,从而使用Zabbix采集这些数据并对特定进程进行监控,如Zabbix监控内存信息收集等等。
  • [技术干货] Zabbix监控Mysql状态
    介绍:         在日常的运维工作中,mysql数据是相当重要的一部分,使用Zabbix进行监控Mysql状态数据收集,与采集CPU、内存、I/O、磁盘等信息类似。步骤:         先yum安装mariadb-server mariadb:yum -y install mariadb-server mariadb。         启动mariadb:systemctl start mariadb。         使用空密码登录mysql控制台可以执行增删改查等操作,登录mysql后回介绍当前的版本信息可以通过\q来退出当前操作。         mysqladmin命令可以管理mysql,看mysql的状态,也可以改密码:mysqladmin status。         mysqladmin extended-status来查看扩展状态信息。         Zabbix对mysql的性能监控,通过mysql状态值将这些状态值传递给服务器并绘制成图片,这样可以观察mysql 的工作状态。参数:这里介绍的参数将在下方脚本中用到也是比较常见的参数,所以很重要!         Bytes_sent  发送字节数         Bytes_received 接受的字节数          Com_delete 执行删除的个数         Com_rollback 执行回滚的个数         Com_insert  Mysql执行插入的个数         Com_update Mysql执行更新的个数         Slow_queries 慢查询语句的个数脚本:         vim zabbix_mysql_status.sh#!/bin/bash#mysql for zabbixuptime(){mysqladmin status | awk '{print $2}'}Slow_queries(){mysqladmin status | awk '{print $9}'}Com_insert(){mysqladmin extended-status |awk '/\<Com_insert\>/{print $4}'}Com_delete(){mysqladmin extended-status |awk '/\<Com_delete\>/{print $4}'}Com_update(){mysqladmin extended-status |awk '/\<Com_update\>/{print $4}'}Com_select(){mysqladmin extended-status |awk '/\<Com_select\>/{print $4}'}Com_commit(){mysqladmin extended-status |awk '/\<Com_commit\>/{print $4}'}Com_rollback(){mysqladmin extended-status |awk '/\<Com_rollback>/{print $4}'}Bytes_sent(){mysqladmin extended-status |awk '/\<Bytes_sent>/{print $4}'}Bytes_received(){mysqladmin extended-status |awk '/\<Bytes_received>/{print $4}'}Com_begin(){mysqladmin extended-status |awk '/\<Com_begin>/{print $4}'}$1权限:         chmod a+x zabbix_mysql_status.sh来赋予权限后可以直接查看当前的mysql数据信息,比如:./zabbix_mysql_status.sh uptime/Com_delete/Com_insert/slow_queries和上面代码介绍过的com_xxx或bytes_xxx来实现。
  • [技术干货] zabbix监控tcp状态
    介绍:        常见的获取TCP连接状态的方法有俩种,一种是netstart命令,另一种是ss命令。通过netstat来获取tcp的状态信息,netstat -an | grep ^tcp 或 ss -an | grep ^tcp 通过ss来统计tcp的状态连接数。  ss -an | grep ^tcp | awk '{tcp_connect_status[$2]++} END {for i in top_connect_status) {print i,tcp_connect_status[i]}}' 结果显示当前的tcp状态连接数是多少。TCP协议:        tcp被称为可靠的数据传输协议,主要是通过许多机制来实现的,其中最重要的就是三次握手和四次挥手的功能。如图:         常见的TCP状态信息描述如下:        CLOsed  socket 没有被使用 无连接。        CLOSING  服务器和客户端同时关闭连接,等待远程tcp的连接终止请求确认。        LISTEN     监听状态,等待从任何远程端口TCP和端口的连接请求。        SYN_RECV   接收到SYN报文。        SYN_SENT   已经发送SYN报文,发送完一个连接请求后等待一个匹配的连接请求。        LAST_ACK 远程关闭,当前socket被动关闭后发送FIN报文,等待对方ACK报文。        FIN_WAIT_1   等待远端TCP的连接终止请求,或者等待之前发送的连接终止请求的确认。        FIN_WAIT_2   等待远程TCP的连接终止请求。编写TCP连接数的 shell脚本:        vim  zabbix_tcp_connect_status.sh#!/bin/env bashListen(){               ss -an |grep '^tcp' |grep 'LIsten' |wc -lSYN_RECV(){               ss -an |grep '^tcp' |grep 'SYN[_-]RECV' wc -l}}ESTABLISHED(){               ss -an |grep '^tcp' |grep 'estab' |wc -l }TIME_WAIT(){               ss -an |grep '^tcp' |grep'TIME[_-]WAIT' |wc -l}$1         也可以用代码 ss -an |grep '^tcp' |grep 'linten' |wc -l 来看下状态数量 或者 ss -an |grep '^tcp' |grep 'linten'来看一下当前的连接状态可以具体看到ip地址等信息。也可以给脚本加上权限,chmod a+x zabbix_tcp_connect_status.sh  同理  ./zabbix_tcp_connect_status.sh  listen 或 /zabbix_tcp_connect_status.sh  TIME_WAIT 或 /zabbix_tcp_connect_status.sh  ESTABLISHED 。         当服务器的连接数很大,统计TCP状态也很频繁时,使用Zabbix监控TCP状态信息是一个很好的方案。  
  • 草原三剑客之awk
    介绍:        在开头时和大家说过,三剑客最厉害的就是awk,awk是由创建者的名字来命名的。awk是一种报表生成的工具,对文件内容进行各种排版的操作,它允许您创建简短的程序,这些程序的功能包括读入输入文件,数据排版,处理数据。awk是一种过程式编程语言或脚本语言解释器,支持条件判断、数组、循环等功能。       awk的处理文件和数据的流程是从第一行开始到最后一行,匹配的特定模式的行,并在这些行上进行你想要的操作,如果没有指定处理动作,则把匹配的行显示到标准输出;如果没有指定模式,则所有被操作所执行的行都被处理。       awk有俩个特殊的模式:begin和end,它们分别被防止在没有读取任何数据之前及在所有的数据读取完完成以后执行。原理:       awk格式为: awk 'begin{commands} pattern {commands} END {commands}'       begin的语句在awk开始输入流中读取之前被执行,这是一个可选的语句,如变量初始化、打印输出表格的表头等情况。end语言在awk处理完所有文件后被执行,对所有行的数据进行分析,之后打印出分析结果这类操作,都可以在end语句中完成,他也是一个可选语句。       pattern语句中的通用命令是最重要的部分,同样是一个可选的语句。如果没有提供pattern语句则默认执行{print},即可打印读取的每一行,awk读取的每一行都会执行该语句.语法:       awk 'pattern' filename 或 awk '{action}' filename 或 awk 'pattern {action}' filename      例如:               cat /etc/passwd               awk '/root/' /etc/passwd      结果就会显示在文件 /etc/passwd中匹配到root的行。同样awk也支持打印,      比如:               echo 123 | awk '{print "hello,awk"}' 结果就是hello awk内直变量:       awk提供乐非常丰富的内直变量,了解这些内直变量也是非常重要的,相对于grep和sed而言,awk优于他们原因是支持对记录和字段的处理。这些内直变量在用awk工具的同事也可以被修改或引用,比如说,可以使用NR这个内置的变量改变模式匹配中指定的工作范围,也可以通过修改记录的分隔符RS让一个特殊字符作为记录的分隔符,而不是换行符。
  • [技术干货] 草原三剑客之sed
    介绍:  sed一次处理一行内容,处理时把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,再把缓冲区的内容输出到屏幕,接着处理下一行,这样不断重复,直到把缓冲区中的内容全部输出到屏幕。接着处理下一行,这样不断的重复反复,直到文件末尾,除非使用重定向存储输出,否则文件内容并不改变,sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序,sed的缓冲区分别为:模式空间和保持空间。  一般情况下,sed首先把第一行内容装入模式空间,处理后输出到屏幕,然后继续把第二行装入模式空间,再处理输出到屏幕,依次循环,直到结束。语法:  sed从文件读取数据,如果没有输入文件,则默认对标准的输入进程数据进行处理,sed可以将数据进行替换、删除、新增、选取等功能。首先了解下sed的语法格式。  sed [options] command file1 file2 这是sed的调用方法,再该方法中将编辑指令直接放选项后面,这是最常见的方法,当执行一些较为复杂的编辑年纪操作时,使用的编辑命令可能会很长,这时通常将编辑指令放入一个脚本文件中,就会用到第二种方法,sed [options] -f scriptfile来调用sed文件。特点:(1)非交互,基于模式匹配的过滤及修改文本。(2)脚本化,再shell编程中sed比vim方便。(3)可对文本实现输出,删除,复制,剪切等编辑。常见参数:  和grep相比,常见的选项如,-r支持扩展正则表达式、-h输出sed的帮助信息、-i直接修改读取的文件内容,而不是由屏幕输出、d 删除、i\输出内容 i的后面可以接字符常、p 打印 将处理过的字符常打印出来、q退出sed、p打印模式空间的第一行。正则表达式:  和grep相比,sed再文件中查找模式时,也可以使用正则表达式和各种元字符。正则表达式是括再斜杠间的模式,用于查找和替换。支持的元字符集如:^ [] [^] . *等等。使用的扩展元字符集如:?、+、{} ()|。 例如,删除/etc/passwd文件第四行。           sed '4d'passwd最后同样是给大家留下一个小问题:用sed命令将文本12345.txt写成倒叙。上期答案:              正则表达式和扩展表达式类似,但是扩展表示更加简单,正则表达式需要用\来转移字符,来表示某些字符的意思,而扩展表示则不需要。
  • [技术干货] 草原三剑客之grep
    介绍:        linux中的三剑客grep、sed、awk作为强大的文本搜索工具,你知道哪个是最厉害啊么?当然是awk。今天我们来聊一聊grep。grep和正则表达式息息相关,它能用正则表达式来搜索文本,在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行。通常grep有三种版本,即grep、egrep和fgrep。egrep为扩展的grep,其支持更多的正则表达式元字符,fgrep则为快速grep它按照字面意思解释所有字符。命令及格式:        grep [options选项] PATTERN [FILENAME  FILENAME...]        例如: grep 'lizeyu' /etc/passwd                   grep  'bash  shell' /etc/test        结果:找到匹配模式:返回的退出状态是0、没找到匹配文件返回的退出状态是1、找不到指定文件返回的退出状态为2。        grep命令输入可以来自标准的输入或管道,而不仅仅是文件的使用比如:                   ps aux | grep 'sshd'                   ll |grep '^d'        grep的选项参数常见的我们来举例学习, -i忽略字符的大小写,-l只列出匹配行所在的文件名,-n在每一行前面加上它在文件中的相对行号,-c显示成功匹配的行数,-s禁止显示文件不存在或文件不可读的错误信息,-o仅显示匹配的字符串文件本身。注意:        针对搜索字符常的选项,使用正则表达式时必须用单引号括起来,避免于shell的元字符冲突,结合grep与正则表达式,能快速的找到希望匹配的字符常和行,提高工作效率。grep命令和正则表达式:        grep命令结合正则表达式使得linux运维工作不仅简单化,而且还能高效的使用。        例如:                 使用egrep匹配文件中root字符串,egrep 'root' /etc/passwd /etc/shadow /etc/hosts                 使用egrep列出匹配行的文件名,egrep -l 'root' /etc/paswd /etc/shadow /etc/hosts                 使用egrep匹配ip地址,egrep  '({0-9},{1,3}\.){3}{0-9}{1,3}'/etc/sysconfig/network-scripts/ifcfg-eth0最后给大家提一个问题,正则表达式和扩展正则表达式的区别是什么?       下期揭晓。
  • [技术干货] shell中还有数组么?你知道定义shell数组有几种方式吗?
    概念:         数组中有限个相同类型的变量用一个名字命名,然后用编号区分它们,用于区分不同元素的编号称为数组下标,数组的元素有时也称为下标变量。类型:         数组分为普通数组和关联数组。普通数组中的索引都是整数,关联数组的数组索引可以用任意的文本。关联数组使用之前需要声名,关联数组于普通数组的最大区别就是,他是由特定格式的键值对组成的,。         普通数组中的数组元素的索引从0开始编号,获取数组中的元素要利用索引。索引也就是下标,可以是算数表达式,其结果必须是一个整数。         例:普通数组的定义               zeyuli={linux shell awk openstack docker} 对应中的单词下标就是 0 1 2 3 4         关联数组和普通数组所不同的是,它的索引下标可以是任意的整数和字符串.         例:关联数组的定义                zeyuli=([name]=lizeyu [sex]=male  [age]=23 对应中的下标就是name  sex  age 形式可以为任意的字符串不必为整数的编号。         综上所述,在shell中,数组分为普通数组和关联数组,用户定义的是普通数组,如需使用关联数组需要先声明在使用,用户声明关联数组使用-A的参数,通常情况下shell解释器隐藏式声明普通数组,用户无需操作,用户要显示声明的普通数组,需要用-a的参数。         例如:声明普通数组的方法  #declare -a array   声明关联数组的方法 #declare -A array 定义:         在shell中,定义一个数组有很多的方法,需要先按照命令规则给数组命名,然后再定义数组的值,数组的定义方法有:直接定义数组、下标定义数组、间接定义数组和从文件中读入定义数组,一共四种方法。         直接定义数组是用小括号将变量值括起来赋值给数组变量,每个变量的值之间要用空格进行分割。下标定义数组使用小括号将变量值括起来,同时采用键值对的方式来赋值。间接定义数组是分别通过定义数组的方法来定义,从文件读入定义数组是使用命令的输出结果作为数组的内容。
  • [技术干货] 用户无数据定位指导
    确认license状态登录CI业务面》资源》确认设备license状态正常确认设备建链状态登录设备通过命令行查看http2协议命令# 进入诊断视图 sys diagnose # 查看建链状态 dis http2-client item 4 其中uiDestPort为27371的是与分析器建链信息,若uiDestPort均不是27371,排查配置 ucConnStatus为建链状态,含义为:正常应该是3 , CONN_UP 0 , CONN_IDLE 初始化状态,未发起连接 1 , CONN_GETCERT 证书认证 2 , CONN_INITRETRY 等待重连状态 3 , CONN_UP 已建立连接--------建链正常,对应分析器ss -anp|grep 27371可查看ESTAB状态 4 , CONN_RECONN 失败,等待重连--------可能是南向公网IP带宽超了被限流 5 , CONN_ABORT 超过重试次数后终止telemetry协议命令sys diagnose d g c c如果建链状态不正常,确认网络是否是通的在设备上pingCI南向地址,看是否能ping通ping CI南向IP 如果ping不通,需要客户排查网络如果能ping通,尝试Telnet端口,看端口是不是通的telnet 南向ip 27371/30003 如果端口不通,需要客户排查是否存在防火墙等未放通对应端口查看数据上报状态sys # ap查看wmi状态 display wmi status # 交换机查看smi状态 display smi status查看druid表中是否有数据初始版本R21.1前su ossadm source /opt/oss/manager/agent/bin/engr_profile.sh python from util import common, httpclient client = httpclient.CommonHttpClient(common.getLocalIP(),32018,isHttps=True,gzip=False) client.post("/rest/odae/v1/queryengine/aql/query",{"aql":"ci_campusclient_clientkpi|where __time>ago(1d) and usermac='xx-xx-xx-xx-xx-xx'|distinct usermac,apmac,tenantId,siteId"})初始版本R21.1及以后su ossadm source /opt/oss/manager/bin/engr_profile.sh export SSL_ROOT=/opt/oss/manager/etc/ssl/ export CIPHER_ROOT=/opt/oss/manager/etc/cipher/ python from util import common, httpclient client = httpclient.CommonHttpClient(common.getLocalIP(),32018,True,False) client.post("/rest/odae/v1/queryengine/aql/query",{"aql":"ci_campusclient_clientkpi|where __time>ago(1d) and usermac='xx-xx-xx-xx-xx-xx' |distinct usermac,apmac,tenantId,siteId"});查看kafka中是否有数据grep "[usermac]" /srv/BigData/hadoop*/kafka/*clientkpi*/*.log数据库查看实时流任务运行状态连接数据库初始版本R21.1之前su - dbuser zsql odaesparkdispservicedb/XXXXXXX@127.0.0.1:32081初始版本R21.1及以后export dbName='odaesparkdispservicedb';export instance_name=`grep -A 12 ${dbName} /opt/zenith/ResourcePool.json|grep instance_name|awk -F\" '{print $4}'`;export IP=`grep LSNR_ADDR /opt/zenith/data/${instance_name}/cfg/zengine.ini|awk '{print $3}'|awk -F \, '{print $NF}'`;export port=`grep LSNR_PORT /opt/zenith/data/${instance_name}/cfg/zengine.ini|awk '{print $3}'`;export ZenithDBPasswd=`grep -A 12 $dbName /opt/zenith/ResourcePool.json|grep password|awk -F\" '{print $4}'`;export pwd=`su - ossadm -c ". /opt/*/manager/bin/engr_profile.sh;python -c \"from util import ossext;print(ossext.Cipher.decrypt('${ZenithDBPasswd}'))\""`;su - dbuser -c "zsql ${dbName}/${pwd}@${IP}:${port}"查询任务状态select * from TASK_RECORD_V2_TBL where APPLICATIONNAME = 'campus_wlan_etl_v2' and PIPELINENAME like '%campusInsight_realtime_wlan_client_original%' order by CREATETIME desc limit 10;
  • Shell中for循环的几个写法【转】
     第一类:数字性循环 ----------------------------- for1-1.sh #!/bin/bash   for((i=1;i<=10;i++)); do  echo $(expr $i \* 3 + 1); done  ----------------------------- for1-2.sh #!/bin/bash   for i in $(seq 1 10) do  echo $(expr $i \* 3 + 1); done  ----------------------------- for1-3.sh #!/bin/bash   for i in {1..10} do echo $(expr $i \* 3 + 1); done  ----------------------------- for1-4.sh #!/bin/bash   awk 'BEGIN{for(i=1; i<=10; i++) print i}'  第二类:字符性循环 ----------------------------- for2-1.sh #!/bin/bash   for i in `ls`; do  echo $i is file name\! ; done  ----------------------------- for2-2.sh #!/bin/bash   for i in $* ; do echo $i is input chart\! ; done  ----------------------------- for2-3.sh #!/bin/bash   for i in f1 f2 f3 ; do echo $i is appoint ; done  ----------------------------- for2-4.sh #!/bin/bash   list="rootfs usr data data2" for i in $list; do echo $i is appoint ; done  第三类:路径查找 ----------------------------- for3-1.sh #!/bin/bash   for file in /proc/*; do echo $file is file path \! ; done  ----------------------------- for3-2.sh #!/bin/bash   for file in $(ls *.sh) do echo $file is file path \! ; done  ———————————————— 版权声明:本文为CSDN博主「BabyFish13」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/BabyFish13/article/details/52981110 
  • [技术干货] 打造属于自己的云网盘—Shell代码实现
    一:实验环境1.一台云服务器2.服务器重装系统(如果第一次使用云服务器可忽略)3.finalshell远程连接二:项目部署1.安装LAMP架构1.关闭防火墙[root@ecs-20200608 ~]# iptables -L ----列出防火墙规则[root@ecs-20200608 ~]# iptables -F ----清空防火墙规则[root@ecs-20200608 ~]# systemctl stop firewalld[root@ecs-20200608 ~]# systemctl disable firewalld ----开机自动关闭2. 关闭selinux 临时关闭[root@ecs-20200608 ~]# setenforce 0[root@ecs-20200608 ~]# getenforce ----查看selinxu状态 永久关闭[root@ecs-20200608 ~]# vim /etc/selinux/config SELINUX=disabled 把原来的enforcing修改为disabled 注: 想要生效需重启系统(reboot) 状态: enforcing permissive disabled 安装数据库服务[root@ecs-5680 ~]# yum -y install mariadb-server mariadb 安装php和apache服务[root@ecs-5680 yum.repos.d]# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm[root@ecs-5680 yum.repos.d]# yum install yum-utils[root@ecs-5680 yum.repos.d]# yum-config-manager --enable remi-php722.启动服务 3.服务部署 删除之前的配置文件(选中那个文件右键删除)[root@ecs-5680 yum.repos.d]# yum install httpd php php-gd php-json php-mysql php-curl php-mbstring php-intl php-mcrypt php-imagick php-xml php-zip [root@ecs-5680 yum.repos.d]# systemctl start httpd mariadb[root@ecs-5680 yum.repos.d]# ss -antp |grep 80 ESTAB 0 52 192.168.0.201:22 120.244.60.80:14874 users:(("sshd",pid=1562,fd=3)) LISTEN 0 511 [::]:80 [::]:* users:(("httpd",pid=8037,fd=4),("httpd",pid=8036,fd=4),("httpd",pid=8035,fd=4), ("httpd",pid=8034,fd=4),("httpd",pid=8033,fd=4),("httpd",pid=7994,fd=4)) [root@ecs-5680 yum.repos.d]# ss -antp |grep 3306 LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=8262,fd=14))部署数据库服务:[root@ecs-5680 yum.repos.d]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.65-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit apache服务部署:(直接上传使用,事先已经写好了)[root@ecs-5680 yum.repos.d]# cd /etc/httpd/conf/[root@192 conf]# rm -rf httpd.conf 上传新的配置文件(右下角空白处右键上传,见到下面的界面) 选中那个文件上传即可4.产品上线 下载项目包:[root@ecs-5680 etc]# cd [root@ecs-5680 ~]# wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.zip解压项目包:[root@ecs-5680 ~]# unzip nextcloud-15.0.0.zip项目拷贝到网站发布目录下:[root@ecs-5680 ~]# mv nextcloud /var/www/设置权限:[root@ecs-5680 ~]# chown apache.apache /var/www/nextcloud/ -R 重新启动apache5.浏览器访问(输入公网ip地址访问)[root@ecs-5680 ~]# systemctl restart httpd6.安装完成后 如果不出现登录界面,换一个浏览器访问(看到这个界面后输入自己设置的用户名和密码)7.使用网盘8.上传文件 共享链接 复制链接(这个需要复制自己的,以下是举了一个案例:) http://119.8.98.63/index.php/s/Y5dryD6QkmCE7C
  • [技术干货] 玩转云计算--打造专属的云笔记—Shell代码实现
    一、环境准备1、准备一台云服务器(华为云)2、使用finalshell远程连接云服务器3、操作之前重装服务器系统4、关闭防火墙5.关闭selinux二、服务部署1.关闭防火墙并设置开机自动关闭2.关闭selinux三、VuePress 程序VuePress是以Vue驱动的静态⽹站⽣成器,我理解功能有点类似gitbook,可以做 博客或者⽂档说明 官网: https://www.vuepress.cn/1.安装 Node.js 1.Node.js 部署[root@server-1 ~]# systemctl stop firewalld[root@server-1 ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. a.临时关闭[root@server-1 ~]# setenforce 0 b.永久关闭[root@server-1 ~]# vi /etc/selinux/config SELINUX=enforcing 注意:把enforcing修改为disabled2.创建Node.js 安装目录3.将⼆进制⽂件解压到要安装⽬录4. 使⽤查看node.js版本号命令验证是否解压成功5. 修改环境变量,使得能在任意⽬录下执⾏node命令 安装wget命令: [root@server-1 ~]# yum install -y wget 下载node.js软件包[root@server-1 ~]# wget https://npm.taobao.org/mirrors/node/v13.9.0/nodev13.9.0-linux-x64.tar.xz[root@server-1 ~]# ls anaconda-ks.cfg node-v13.9.0-linux-x64.tar.xz[root@server-1 ~]# mkdir -p /usr/local/lib/nodejs[root@server-1 ~]# tar -xJvf node-v13.9.0-linux-x64.tar.xz -C /usr/local/lib/nodejs 进⼊⽬录:[root@server-1 ~]# cd /usr/local/lib/nodejs/node-v13.9.0-linux-x64/bin 执⾏[root@server-1 bin]# pwd /usr/local/lib/nodejs/node-v13.9.0-linux-x64/bin[root@server-1 bin]# ./node -v v13.9.0[root@server-1 bin]# vim ~/.bash_profile 找到 PATH=$PATH:$HOME/bin,在PATH=$PATH:$HOME/bin 后⾯添加路 径:/usr/local/lib/nodejs/node-v13.9.0-linux-x64/bin, 结果为: PATH=$PATH:$HOME/bin:/usr/local/lib/nodejs/node-v13.9.0-linux-x64/bin 6. 到其他⽬录下验证 截图如下: ⾄此,nodejs安装完毕。2.安装 VuePress 1.全局安装 表示安装成功!!!2.准备相关目录[root@server-1 bin]# cd [root@server-1 ~]# node -v[root@server-1 ~]# npm version[root@server-1 ~]# npx -v 为加快下载安装速度,采⽤淘宝镜像。[root@server-1 ~]# npm config set registry https://registry.npm.taobao.org[root@server-1 ~]# npm install -g vuepress 3.项目初始化 3. 配置 VuePress1. 设置package.json的脚本配置2.创建相关目录 [root@server-1 ~]# mkdir try_blogs[root@server-1 ~]# cd try_blogs [root@server-1 try_blogs]# npm init -y 初始化后会⽣成⼀个package.json⽂件 之后进⼊配置步骤。修改scripts中的内容如下: "scripts": { "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs" }, try_blogs ├─ docs//以后要在这⾥⾯写⽂章,直接在此⽂件夹下新建⽂件夹,然后再建 md⽂档就⾏,链接会⾃动⽣成 │ ├─ README.md// 这个将会是我们以后的⾸页 │ └─ .vuepress // 这个⾥⾯会存放⼀些配置和组件 │ └─ public// 静态⽂件存放地 │ └─ config.js //配置⽂件,以后的所有配置基本都在这⾥写└─ package.json 开始创建相关文件和目录:[root@server-1 try_blogs]# mkdir docs [root@server-1 try_blogs]# cd docs[root@server-1 docs]# mkdir .vuepress [root@server-1 docs]# echo '# Hello VuePress - first blog!' >README.md3.启动本地服务进行访问4.客户端测试访问 http://ECS公⽹IP:8080 注意:使用云服务器的时候要开放8080端口。5.首页配置示例 注意: 在修改配置文件的时候重新开启一个终端进行修改文件,切不可关闭原有进程。修改README.md⽂件,将原来的内容删除后,将以下内容拷贝进去 修改完成后的配置文件:[root@server-1 docs]# cd .vuepress [root@server-1 .vuepress]# echo >config.js [root@server-1 .vuepress]# mkdir public 回到try_blogs⽬录,执⾏命令 [root@server-1 try_blogs]# vuepress dev docs ...... success [12:13:16] Build 721ba5 finished in 214 ms! ( http://localhost:8080/ ) --- home: true heroText: Vue技术博客初试 tagline: 项⽬结构,关注讨论,每⽇分享 actionText: 每⽇更新 →→ actionLink: /testlink/ features: - title: 项⽬结构 details: 以 Markdown 为中⼼的项⽬结构,以最少的配置帮助你专注于写作。 - title: 关注讨论 details: 享受 Vue + webpack 的开发体验,在 Markdown 中使⽤ Vue 组件,同时可以使⽤ Vue 来开发⾃定义主题。 - title: 每⽇分享 details: VuePress 为每个⻚⾯预渲染⽣成静态的 HTML,同时在⻚⾯被加载的时候,将作为 SPA 运 ⾏。 footer: LearnVueonECS Licensed | Copyright © 2020-present --- 重新刷新页面访问
  • Shell编程语言实例教程
    基本介绍:今天给大家带来shell编程语言的基本网络攻防操作代码,包括:Dos攻击防范、Linux系统发送告警脚本、MySQL 数据库备份单循环、MySQL 数据库备份多循环、Nginx 访问访问日志按天切割、Nginx 访问日志分析脚本的代码分析,写的比较细致 亲测有效~1.Dos 攻击防范(自动屏蔽攻击 IP)#!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}') for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log fi done2.Linux 系统发送告警脚本#!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}') for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log fi done # yum install mailx # vi /etc/mail.rc set from=baojingtongzhi@163.com smtp=smtp.163.com set smtp-auth-user=baojingtongzhi@163.com smtp-auth-password=123456 set smtp-auth=login3.MySQL 数据库备份单循环#!/bin/bash DATE=$(date +%F_%H-%M-%S) HOST=localhost USER=backup PASS=123.com BACKUP_DIR=/data/db_backup DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys") for DB in $DB_LIST; do BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then echo "$BACKUP_NAME 备份失败!" fi done4.MySQL 数据库备份多循环!/bin/bash DATE=$(date +%F_%H-%M-%S) HOST=localhost USER=backup PASS=123.com BACKUP_DIR=/data/db_backup DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys") for DB in $DB_LIST; do BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE} [ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null) for TABLE in $TABLE_LIST; do BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then echo "$BACKUP_NAME 备份失败!" fi done done5.Nginx 访问访问日志按天切割#!/bin/bash LOG_DIR=/usr/local/nginx/logs YESTERDAY_TIME=$(date -d "yesterday" +%F) LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m") LOG_FILE_LIST="default.access.log" for LOG_FILE in $LOG_FILE_LIST; do [ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIR mv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME} done kill -USR1 $(cat /var/run/nginx.pid)6.Nginx 访问日志分析脚本#!/bin/bash # 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" LOG_FILE=$1 echo "统计访问最多的10个IP" awk '{a[$1]++}END{print "UV:",length(a);for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr |head -10 echo "----------------------" echo "统计时间段访问最多的IP" awk '$4>="[01/Dec/2018:13:20:25" && $410)print v,a[v]}}' $LOG_FILE |sort -k2 -nr echo "----------------------" echo "统计访问页面状态码数量" awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}'总结:shell语言是网络攻防的 基本操作语言 跟着小编学习网络攻防实践 月入百万
  • [技术干货] expect 交互安装httpd服务
     [root@lzw sbin]# more install_http.exp  #!/usr/bin/expect -f  set timeout 3 set TERM  ANSI  set SERVER [lindex $argv 0] set USER [lindex $argv 1] set PASSWD [lindex $argv 2] sleep 1 spawn ssh -p22 $USER@$SERVER sleep 1 expect {     "yes/no"      { send "yes\r" }          sleep 1 } expect "*password:" { send "$PASSWD\r" } sleep 1 expect "#" {send  "yum -y install httpd\r"} expect "#" {send  "systemctl enable httpd\r"} expect "#" {send  "exit\r"} expect eof  [root@lzw sbin]# more install.sh  #!/bin/sh PATH="/sbin:/usr/local/sbin:/usr/sbin:/bin:/usr/bin" export PATH  cd /usr/local/sbin while read Ip User Pass  do ./install_http.exp ${Ip} ${User} ${Pass} | sed 's/   //g' >/root/work/http.txt done < user.list  [root@lzw sbin]# more user.list  192.168.189.140  root  lzw123  测试: [root@lzw sbin]# sh -x install.sh   [root@lzw sbin]# more /root/work/http.txt   验证客户机安装: [[root@keepalived2 ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server    Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)    Active: inactive (dead)      Docs: man:httpd(8)            man:apachectl(8) 建议有ansible基础的同学可以比较这个shell脚本,ansible方式要简单。
  • 速进!!!新一年技术干货合集来啦,高大全。
    新一年新的合集来啦,本次整理的全部是技术干活,省去爬楼的烦恼,技术涉及到JAVA基础,linux shell命令,python 前端vue,协议,日志打印。高大全,希望能有所帮助。 1.NVIDIA查看CPU、内存、GPU、DLA使用情况 https://bbs.huaweicloud.com/forum/thread-0279110443149219032-1-1.html?isStOrKp=false  2.LINUX查看进程的4种方法(小结) https://bbs.huaweicloud.com/forum/thread-0282110442926437031-1-1.html?isStOrKp=false  3.Linux之常用的压缩解压缩命令 https://bbs.huaweicloud.com/forum/thread-0294110442773298036-1-1.html?isStOrKp=false  4.shell输出重定向的实现【转】 https://bbs.huaweicloud.com/forum/thread-0279110442503633031-1-1.html?isStOrKp=false  5.shell wait等待命令的具体使用【转】 https://bbs.huaweicloud.com/forum/thread-02101110442346704021-1-1.html?isStOrKp=false  6.Bash EOF的使用小结【转】 https://bbs.huaweicloud.com/forum/thread-0279110441887515030-1-1.html?isStOrKp=false  7.Window11 WSL2 添加静态IP的脚本【转】 https://bbs.huaweicloud.com/forum/thread-0279110441635248029-1-1.html?isStOrKp=false  8.Shell脚本read用法实现【转】 https://bbs.huaweicloud.com/forum/thread-0282110431793299029-1-1.html?isStOrKp=false  9.Shell[[]]检测某个条件是否成立【转】 https://bbs.huaweicloud.com/forum/thread-02101110431652353020-1-1.html?isStOrKp=false  10.shell sleep睡眠命令的具体使用【转】 https://bbs.huaweicloud.com/forum/thread-0297110431557287028-1-1.html?isStOrKp=false  11.getopts解析shell脚本命令行参数的方法【转】 https://bbs.huaweicloud.com/forum/thread-02109110431398645036-1-1.html?isStOrKp=false  12.使用PowerShell获取Trustedinstaller权限的问题【转】 https://bbs.huaweicloud.com/forum/thread-0279110431217810027-1-1.html?isStOrKp=false  13.pip安装python库时报Failed building wheel for xxx错误的解决方法【转】 https://bbs.huaweicloud.com/forum/thread-02109110431020379035-1-1.html?isStOrKp=false  14.Python中__str__()的妙用【转】 https://bbs.huaweicloud.com/forum/thread-0279110389353151025-1-1.html?isStOrKp=false  15.Python学习之configparser模块的使用详解【转】 https://bbs.huaweicloud.com/forum/thread-0297110389142020024-1-1.html?isStOrKp=false  16.Python实现内存泄露排查的示例详解【转】 https://bbs.huaweicloud.com/forum/thread-0279110388970941024-1-1.html?isStOrKp=false  17.python如何在pygame中设置字体并显示中文详解【转】 https://bbs.huaweicloud.com/forum/thread-0282110388812371026-1-1.html?isStOrKp=false  18.一文详解pygame.sprite的精灵碰撞【转】 https://bbs.huaweicloud.com/forum/thread-0229110388691079025-1-1.html?isStOrKp=false  19.微信小程序使用uni-app一键获取用户信息 https://bbs.huaweicloud.com/forum/thread-02109110354721580028-1-1.html?isStOrKp=false  20.常见的Slf4j日志打印 https://bbs.huaweicloud.com/forum/thread-0219110344870256025-1-1.html?isStOrKp=false  21.Java的四个核心概念 https://bbs.huaweicloud.com/forum/thread-0297110343600852017-1-1.html?isStOrKp=false  22.Java-smartUpload全攻略 https://bbs.huaweicloud.com/forum/thread-0279110341387505015-1-1.html?isStOrKp=false  23.UDP协议发送/接收数据实现 https://bbs.huaweicloud.com/forum/thread-0279109389033415003-1-1.html?isStOrKp=false  24.TCP协议发送/接收数据实现 https://bbs.huaweicloud.com/forum/thread-0282109388725936002-1-1.html?isStOrKp=false  25.vue标题闪烁+声音提醒的实现 https://bbs.huaweicloud.com/forum/thread-0297109387622356007-1-1.html?isStOrKp=false 
  • [技术干货] shell输出重定向的实现【转】
    1.输入输出重定向介绍重定向简单来说就是把本来已经默认的、确定的输入输出给重新定位到你想要的地方。 重定向这个概念在C语言中就有,在C语言编程中,标准输出是屏幕,使用printf()函数默认是输出到屏幕显示。但是有时候我们需要将信息输出到文件或者申请的内存中,这时候就可以用sprintf()和fprintf()函数;也可以将标准输出的文件描述符给强行占用,使标准输出的文件描述符指向自己想要的文件。在shell中默认打开了三个文件,分别是标准输出(文件描述符0)、标准输出(文件描述符1)、错误输出(文件描述符2),标准输入默认是键盘,标准输出和错误输出默认是屏幕。2.>和>>介绍解析:>和>>都是重定向的符号,符号的左边表示文件描述符或者要重定位的内容,如果不写默认是文件描述符1,即标准输出;右边可以是文件也可以是设备。1.当使用>时,如果右边的文件存在则会先删除在创建,如果右边的文件不存在则创建;2.当使用>>时,表示追加,右边的文件不会被删除,新的内容会添加到文件的末尾。3.命令:>/dev/null 2>&1解析:这可以理解成两句指令:>/dev/null 和 2>&1(1)>/dev/null :将文件描述符1重定向到/dev/null,文件描述符1是标准输出,/dev/null在linux中是空的设备文件,所以往这个设备文件输入的内容都会丢失;这句指令的作用就是将标准输出重定向到/dev/null这个空的设备文件里,效果就是全部的输出都会丢掉。(2)2>&1:将文件描述符2重定向到文件描述符1指向的地方,也就是空的设备文件。执行该指令后,标准输出和错误输出都往空设备文件里写,效果就是两者都丢不再打印到屏幕。4.命令:2>&1 >/dev/null解析:同样分成两个语句理解、(1)2>&1:将文件描述符2重定向到文件描述符1指向的地方,此时标准输出是屏幕。该指令的效果是标准输出和错误输出都输出到屏幕。(2)>/dev/null:将标准输出重定向到空的设备文件,即屏幕不再打印标准输出;但是错误输出此时还是会往屏幕输出,因为错误输出并没有重定向到空的设备文件。5.总结:(1)**>/dev/null 2>&1:**标准输出和错误输出都舍弃掉;(2)**2>&1 >/dev/null:**标准输出被舍弃掉,错误输出被重定位到屏幕;在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流即stdin stdout stderr。在shell里面,分别用0,1,2代表stdin stdout stderr。stdin默认从键盘接收输入,而stdout和stderr默认向console输出。echo默认将hello送到stdout显示。而"|"管道符接收来自stdout的输入 。所以echo hello的结果被送到grep处理,最终显示hello。示例2echo hello本来是要把hello输出到stdout,但是由于1>&2的作用,最终hello交给了stderr。其实stderr也是在console上显示,所以输出结果是hello。但是管道符|只收到stdout,收不到stderr的数据,所以hello传不到grep,最终只通过stderr打印hello。再举一个从stderr向stdout定向的示例3ls 查找一个并不存在的文件,将打印错误信息将ls c.cpp与 grep cpp连用,打印相同的信息。但是这是出错信息,通过stderr输出的,而管道符只接受stdout的输出所以grep不处理信息,打印出来的cpp字符串也不标红。只有把stderr重定向到stdout---2>&1,才能让grep起作用,看到标红的cpp。