首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10002篇文章
优秀的个人博客,低调大师

python自动化巡检

#!/usr/bin/envpython #-*-coding:utf-8-*- #__author__="chenhao" #Email:312779641@qq.com #Date:2017/8/22 importparamiko defsftp_exec_command(host,port,username,password,command): ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=host,port=port,username=username,password=password) stdin,stdout,stderr=ssh.exec_command(command) list=[] foriteminstdout.readlines(): list.append(item.strip()) returnlist ssh.close() defsftp_down_file(host,port,username,password,server_path,local_path): try: t=paramiko.Transport((host,port)) t.connect(username=username,password=password) sftp=paramiko.SFTPClient.from_transport(t) sftp.get(server_path,local_path) t.close() exceptExceptionase: print(e) if__name__=='__main__': hosts_file=open('./hosts/host.info','r') forlineinhosts_file.readlines(): ifline[0:1]=='#':continue line=line.strip('\n') items=line.split() port=22 host=items[0] username=items[1] password=items[2] sftp_exec_command(host,port,username,password,"sh/root/xunjian.sh") n=sftp_exec_command(host,port,username,password,"ls-t/root/log/|head-1") filename="/root/log/%s"%(n[0]) print(filename) sftp_down_file(host,port,username,password,filename,"D:/大数据数据/%s"%(n[0])) 执行后自动巡检python脚本 shell运维脚本 #!/bin/bash #主机信息每日巡检 IPADDR=$(ifconfigeth0|grep'inetaddr'|awk-F'[:]''{print$13}') #环境变量PATH没设好,在cron里执行时有很多命令会找不到 exportPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source/etc/profile [$(id-u)-gt0]&&echo"请用root用户执行此脚本!"&&exit1 centosVersion=$(awk'{print$(NF-1)}'/etc/redhat-release) VERSION="2017.08.22" #日志相关 PROGPATH=`echo$0|sed-e's,[\\/][^\\/][^\\/]*$,,'` [-f$PROGPATH]&&PROGPATH="." LOGPATH="$PROGPATH/log" [-e$LOGPATH]||mkdir$LOGPATH RESULTFILE="$LOGPATH/HostDailyCheck-$IPADDR-`date+%Y%m%d`.txt" #定义报表的全局变量 report_DateTime=""#日期ok report_Hostname=""#主机名ok report_OSRelease=""#发行版本ok report_Kernel=""#内核ok report_Language=""#语言/编码ok report_LastReboot=""#最近启动时间ok report_Uptime=""#运行时间(天)ok report_CPUs=""#CPU数量ok report_CPUType=""#CPU类型ok report_Arch=""#CPU架构ok report_MemTotal=""#内存总容量(MB)ok report_MemFree=""#内存剩余(MB)ok report_MemUsedPercent=""#内存使用率%ok report_DiskTotal=""#硬盘总容量(GB)ok report_DiskFree=""#硬盘剩余(GB)ok report_DiskUsedPercent=""#硬盘使用率%ok report_InodeTotal=""#Inode总量ok report_InodeFree=""#Inode剩余ok report_InodeUsedPercent=""#Inode使用率ok report_IP=""#IP地址ok report_MAC=""#MAC地址ok report_Gateway=""#默认网关ok report_DNS=""#DNSok report_Listen=""#监听ok report_Selinux=""#Selinuxok report_Firewall=""#防火墙ok report_USERs=""#用户ok report_USEREmptyPassword=""#空密码用户ok report_USERTheSameUID=""#相同ID的用户ok report_PasswordExpiry=""#密码过期(天)ok report_RootUser=""#root用户ok report_Sudoers=""#sudo授权ok report_SSHAuthorized=""#SSH信任主机ok report_SSHDProtocolVersion=""#SSH协议版本ok report_SSHDPermitRootLogin=""#允许root远程登录ok report_DefunctProsess=""#僵尸进程数量ok report_SelfInitiatedService=""#自启动服务数量ok report_SelfInitiatedProgram=""#自启动程序数量ok report_RuningService=""#运行中服务数ok report_Crontab=""#计划任务数ok report_Syslog=""#日志服务ok report_SNMP=""#SNMPOK report_NTP=""#NTPok report_JDK=""#JDK版本ok functionversion(){ echo"" echo"" echo"系统巡检脚本:Version$VERSION" } functiongetCpuStatus(){ echo"" echo"" echo"############################CPU检查#############################" Physical_CPUs=$(grep"physicalid"/proc/cpuinfo|sort|uniq|wc-l) Virt_CPUs=$(grep"processor"/proc/cpuinfo|wc-l) CPU_Kernels=$(grep"cores"/proc/cpuinfo|uniq|awk-F':''{print$2}') CPU_Type=$(grep"modelname"/proc/cpuinfo|awk-F':''{print$2}'|sort|uniq) CPU_Arch=$(uname-m) echo"物理CPU个数:$Physical_CPUs" echo"逻辑CPU个数:$Virt_CPUs" echo"每CPU核心数:$CPU_Kernels" echo"CPU型号:$CPU_Type" echo"CPU架构:$CPU_Arch" #报表信息 report_CPUs=$Virt_CPUs#CPU数量 report_CPUType=$CPU_Type#CPU类型 report_Arch=$CPU_Arch#CPU架构 } functiongetMemStatus(){ echo"" echo"" echo"############################内存检查############################" if[[$centosVersion<7]];then free-mo else free-h fi #报表信息 MemTotal=$(grepMemTotal/proc/meminfo|awk'{print$2}')#KB MemFree=$(grepMemFree/proc/meminfo|awk'{print$2}')#KB letMemUsed=MemTotal-MemFree MemPercent=$(awk"BEGIN{if($MemTotal==0){printf100}else{printf\"%.2f\",$MemUsed*100/$MemTotal}}") report_MemTotal="$((MemTotal/1024))""MB"#内存总容量(MB) report_MemFree="$((MemFree/1024))""MB"#内存剩余(MB) report_MemUsedPercent="$(awk"BEGIN{if($MemTotal==0){printf100}else{printf\"%.2f\",$MemUsed*100/$MemTotal}}")""%"#内存使用率% } functiongetDiskStatus(){ echo"" echo"" echo"############################磁盘检查############################" df-hiP|sed's/Mountedon/Mounted/'>/tmp/inode df-hTP|sed's/Mountedon/Mounted/'>/tmp/disk join/tmp/disk/tmp/inode|awk'{print$1,$2,"|",$3,$4,$5,$6,"|",$8,$9,$10,$11,"|",$12}'|column-t #报表信息 diskdata=$(df-TP|sed'1d'|awk'$2!="tmpfs"{print}')#KB disktotal=$(echo"$diskdata"|awk'{total+=$3}END{printtotal}')#KB diskused=$(echo"$diskdata"|awk'{total+=$4}END{printtotal}')#KB diskfree=$((disktotal-diskused))#KB diskusedpercent=$(echo$disktotal$diskused|awk'{if($1==0){printf100}else{printf"%.2f",$2*100/$1}}') inodedata=$(df-iTP|sed'1d'|awk'$2!="tmpfs"{print}') inodetotal=$(echo"$inodedata"|awk'{total+=$3}END{printtotal}') inodeused=$(echo"$inodedata"|awk'{total+=$4}END{printtotal}') inodefree=$((inodetotal-inodeused)) inodeusedpercent=$(echo$inodetotal$inodeused|awk'{if($1==0){printf100}else{printf"%.2f",$2*100/$1}}') report_DiskTotal=$((disktotal/1024/1024))"GB"#硬盘总容量(GB) report_DiskFree=$((diskfree/1024/1024))"GB"#硬盘剩余(GB) report_DiskUsedPercent="$diskusedpercent""%"#硬盘使用率% report_InodeTotal=$((inodetotal/1000))"K"#Inode总量 report_InodeFree=$((inodefree/1000))"K"#Inode剩余 report_InodeUsedPercent="$inodeusedpercent""%"#Inode使用率% } functiongetSystemStatus(){ echo"" echo"" echo"############################系统检查############################" if[-e/etc/sysconfig/i18n];then default_LANG="$(grep"LANG="/etc/sysconfig/i18n|grep-v"^#"|awk-F'"''{print$2}')" else default_LANG=$LANG fi exportLANG="en_US.UTF-8" Release=$(cat/etc/redhat-release2>/dev/null) Kernel=$(uname-r) OS=$(uname-o) Hostname=$(uname-n) SELinux=$(/usr/sbin/sestatus|grep"SELinuxstatus:"|awk'{print$3}') LastReboot=$(who-b|awk'{print$3,$4}') uptime=$(uptime|sed's/.*up\([^,]*\),.*/\1/') echo"系统:$OS" echo"发行版本:$Release" echo"内核:$Kernel" echo"主机名:$Hostname" echo"SELinux:$SELinux" echo"语言/编码:$default_LANG" echo"当前时间:$(date+'%F%T')" echo"最后启动:$LastReboot" echo"运行时间:$uptime" #报表信息 report_DateTime=$(date+"%F%T")#日期 report_Hostname="$Hostname"#主机名 report_OSRelease="$Release"#发行版本 report_Kernel="$Kernel"#内核 report_Language="$default_LANG"#语言/编码 report_LastReboot="$LastReboot"#最近启动时间 report_Uptime="$uptime"#运行时间(天) report_Selinux="$SELinux" exportLANG="$default_LANG" } functiongetServiceStatus(){ echo"" echo"" echo"############################服务检查############################" echo"" if[[$centosVersion>7]];then conf=$(systemctllist-unit-files--type=service--state=enabled--no-pager|grep"enabled") process=$(systemctllist-units--type=service--state=running--no-pager|grep".service") #报表信息 report_SelfInitiatedService="$(echo"$conf"|wc-l)"#自启动服务数量 report_RuningService="$(echo"$process"|wc-l)"#运行中服务数量 else conf=$(/sbin/chkconfig|grep-E":on|:启用") process=$(/sbin/service--status-all2>/dev/null|grep-E"isrunning|正在运行") #报表信息 report_SelfInitiatedService="$(echo"$conf"|wc-l)"#自启动服务数量 report_RuningService="$(echo"$process"|wc-l)"#运行中服务数量 fi echo"服务配置" echo"--------" echo"$conf"|column-t echo"" echo"正在运行的服务" echo"--------------" echo"$process" } functiongetAutoStartStatus(){ echo"" echo"" echo"############################自启动检查##########################" conf=$(grep-v"^#"/etc/rc.d/rc.local|sed'/^$/d') echo"$conf" #报表信息 report_SelfInitiatedProgram="$(echo$conf|wc-l)"#自启动程序数量 } functiongetLoginStatus(){ echo"" echo"" echo"############################登录检查############################" last|head } functiongetNetworkStatus(){ echo"" echo"" echo"############################网络检查############################" if[[$centosVersion<7]];then /sbin/ifconfig-a|grep-vpackets|grep-vcollisions|grep-vinet6 else #ipa foriin$(iplink|grepBROADCAST|awk-F:'{print$2}');doipaddshow$i|grep-E"BROADCAST|global"|awk'{print$2}'|tr'\n''';echo"";done fi GATEWAY=$(iproute|grepdefault|awk'{print$3}') DNS=$(grepnameserver/etc/resolv.conf|grep-v"#"|awk'{print$2}'|tr'\n'','|sed's/,$//') echo"" echo"网关:$GATEWAY" echo"DNS:$DNS" #报表信息 IP=$(ip-finetaddr|grep-v127.0.0.1|grepinet|awk'{print$NF,$2}'|tr'\n'','|sed's/,$//') MAC=$(iplink|grep-v"LOOPBACK\|loopback"|awk'{print$2}'|sed'N;s/\n//'|tr'\n'','|sed's/,$//') report_IP="$IP"#IP地址 report_MAC=$MAC#MAC地址 report_Gateway="$GATEWAY"#默认网关 report_DNS="$DNS"#DNS } functiongetListenStatus(){ echo"" echo"" echo"############################监听检查############################" TCPListen=$(ss-ntul|column-t) echo"$TCPListen" #报表信息 report_Listen="$(echo"$TCPListen"|sed'1d'|awk'/tcp/{print$5}'|awk-F:'{print$NF}'|sort|uniq|wc-l)" } functiongetCronStatus(){ echo"" echo"" echo"############################计划任务检查########################" Crontab=0 forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(grep"$shell"/etc/passwd|awk-F:'{print$1}');do crontab-l-u$user>/dev/null2>&1 status=$? if[$status-eq0];then echo"$user" echo"--------" crontab-l-u$user letCrontab=Crontab+$(crontab-l-u$user|wc-l) echo"" fi done done #计划任务 find/etc/cron*-typef|xargs-ils-l{}|column-t letCrontab=Crontab+$(find/etc/cron*-typef|wc-l) #报表信息 report_Crontab="$Crontab"#计划任务数 } functiongetHowLongAgo(){ #计算一个时间戳离现在有多久了 datetime="$*" [-z"$datetime"]&&echo"错误的参数:getHowLongAgo()$*" Timestamp=$(date+%s-d"$datetime")#转化为时间戳 Now_Timestamp=$(date+%s) Difference_Timestamp=$(($Now_Timestamp-$Timestamp)) days=0;hours=0;minutes=0; sec_in_day=$((60*60*24)); sec_in_hour=$((60*60)); sec_in_minute=60 while(($(($Difference_Timestamp-$sec_in_day))>1)) do letDifference_Timestamp=Difference_Timestamp-sec_in_day letdays++ done while(($(($Difference_Timestamp-$sec_in_hour))>1)) do letDifference_Timestamp=Difference_Timestamp-sec_in_hour lethours++ done echo"$days天$hours小时前" } functiongetUserLastLogin(){ #获取用户最近一次登录的时间,含年份 #很遗憾last命令不支持显示年份,只有"last-tYYYYMMDDHHMMSS"表示某个时间之间的登录,我 #们只能用最笨的方法了,对比今天之前和今年元旦之前(或者去年之前和前年之前……)某个用户 #登录次数,如果登录统计次数有变化,则说明最近一次登录是今年。 username=$1 :${username:="`whoami`"} thisYear=$(date+%Y) oldesYear=$(last|tail-n1|awk'{print$NF}') while(($thisYear>=$oldesYear));do loginBeforeToday=$(last$username|grep$username|wc-l) loginBeforeNewYearsDayOfThisYear=$(last$username-t$thisYear"0101000000"|grep$username|wc-l) if[$loginBeforeToday-eq0];then echo"从未登录过" break elif[$loginBeforeToday-gt$loginBeforeNewYearsDayOfThisYear];then lastDateTime=$(last-i$username|head-n1|awk'{for(i=4;i<(NF-2);i++)printf"%s",$i}')"$thisYear"#格式如:SatNov220:332015 lastDateTime=$(date"+%Y-%m-%d%H:%M:%S"-d"$lastDateTime") echo"$lastDateTime" break else thisYear=$((thisYear-1)) fi done } functiongetUserStatus(){ echo"" echo"" echo"############################用户检查############################" #/etc/passwd最后修改时间 pwdfile="$(cat/etc/passwd)" Modify=$(stat/etc/passwd|grepModify|tr'.'''|awk'{print$2,$3}') echo"/etc/passwd最后修改时间:$Modify($(getHowLongAgo$Modify))" echo"" echo"特权用户" echo"--------" RootUser="" foruserin$(echo"$pwdfile"|awk-F:'{print$1}');do if[$(id-u$user)-eq0];then echo"$user" RootUser="$RootUser,$user" fi done echo"" echo"用户列表" echo"--------" USERs=0 echo"$( echo"用户名UIDGIDHOMESHELL最后一次登录" forshellin$(grep-v"/sbin/nologin"/etc/shells);do forusernamein$(grep"$shell"/etc/passwd|awk-F:'{print$1}');do userLastLogin="$(getUserLastLogin$username)" echo"$pwdfile"|grep-w"$username"|grep-w"$shell"|awk-F:-vlastlogin="$(echo"$userLastLogin"|tr'''_')"'{print$1,$3,$4,$6,$7,lastlogin}' done letUSERs=USERs+$(echo"$pwdfile"|grep"$shell"|wc-l) done )"|column-t echo"" echo"空密码用户" echo"----------" USEREmptyPassword="" forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(echo"$pwdfile"|grep"$shell"|cut-d:-f1);do r=$(awk-F:'$2=="!!"{print$1}'/etc/shadow|grep-w$user) if[!-z$r];then echo$r USEREmptyPassword="$USEREmptyPassword,"$r fi done done echo"" echo"相同ID的用户" echo"------------" USERTheSameUID="" UIDs=$(cut-d:-f3/etc/passwd|sort|uniq-c|awk'$1>1{print$2}') foruidin$UIDs;do echo-n"$uid"; USERTheSameUID="$uid" r=$(awk-F:'ORS="";$3=='"$uid"'{print":",$1}'/etc/passwd) echo"$r" echo"" USERTheSameUID="$USERTheSameUID$r," done #报表信息 report_USERs="$USERs"#用户 report_USEREmptyPassword=$(echo$USEREmptyPassword|sed's/^,//') report_USERTheSameUID=$(echo$USERTheSameUID|sed's/,$//') report_RootUser=$(echo$RootUser|sed's/^,//')#特权用户 } functiongetPasswordStatus{ echo"" echo"" echo"############################密码检查############################" pwdfile="$(cat/etc/passwd)" echo"" echo"密码过期检查" echo"------------" result="" forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(echo"$pwdfile"|grep"$shell"|cut-d:-f1);do get_expiry_date=$(/usr/bin/chage-l$user|grep'Passwordexpires'|cut-d:-f2) if[[$get_expiry_date='never'||$get_expiry_date='never']];then printf"%-15s永不过期\n"$user result="$result,$user:never" else password_expiry_date=$(date-d"$get_expiry_date""+%s") current_date=$(date"+%s") diff=$(($password_expiry_date-$current_date)) letDAYS=$(($diff/(60*60*24))) printf"%-15s%s天后过期\n"$user$DAYS result="$result,$user:$DAYSdays" fi done done report_PasswordExpiry=$(echo$result|sed's/^,//') echo"" echo"密码策略检查" echo"------------" grep-v"#"/etc/login.defs|grep-E"PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE" } functiongetSudoersStatus(){ echo"" echo"" echo"############################Sudoers检查#########################" conf=$(grep-v"^#"/etc/sudoers|grep-v"^Defaults"|sed'/^$/d') echo"$conf" echo"" #报表信息 report_Sudoers="$(echo$conf|wc-l)" } functiongetInstalledStatus(){ echo"" echo"" echo"############################软件检查############################" rpm-qa--last|head|column-t } functiongetProcessStatus(){ echo"" echo"" echo"############################进程检查############################" if[$(ps-ef|grepdefunct|grep-vgrep|wc-l)-ge1];then echo"" echo"僵尸进程"; echo"--------" ps-ef|head-n1 ps-ef|grepdefunct|grep-vgrep fi echo"" echo"内存占用TOP10" echo"-------------" echo-e"PID%MEMRSSCOMMAND $(psaux|awk'{print$2,$4,$6,$11}'|sort-k3rn|head-n10)"|column-t echo"" echo"CPU占用TOP10" echo"------------" topb-n1|head-17|tail-11 #报表信息 report_DefunctProsess="$(ps-ef|grepdefunct|grep-vgrep|wc-l)" } functiongetJDKStatus(){ echo"" echo"" echo"############################JDK检查#############################" java-version2>/dev/null if[$?-eq0];then java-version2>&1 fi echo"JAVA_HOME=\"$JAVA_HOME\"" #报表信息 report_JDK="$(java-version2>&1|grepversion|awk'{print$1,$3}'|tr-d'"')" } functiongetSyslogStatus(){ echo"" echo"" echo"############################syslog检查##########################" echo"服务状态:$(getStatersyslog)" echo"" echo"/etc/rsyslog.conf" echo"-----------------" cat/etc/rsyslog.conf2>/dev/null|grep-v"^#"|grep-v"^\\$"|sed'/^$/d'|column-t #报表信息 report_Syslog="$(getStatersyslog)" } functiongetFirewallStatus(){ echo"" echo"" echo"############################防火墙检查##########################" #防火墙状态,策略等 if[[$centosVersion<7]];then /etc/init.d/iptablesstatus>/dev/null2>&1 status=$? if[$status-eq0];then s="active" elif[$status-eq3];then s="inactive" elif[$status-eq4];then s="permissiondenied" else s="unknown" fi else s="$(getStateiptables)" fi echo"iptables:$s" echo"" echo"/etc/sysconfig/iptables" echo"-----------------------" cat/etc/sysconfig/iptables2>/dev/null #报表信息 report_Firewall="$s" } functiongetSNMPStatus(){ #SNMP服务状态,配置等 echo"" echo"" echo"############################SNMP检查############################" status="$(getStatesnmpd)" echo"服务状态:$status" echo"" if[-e/etc/snmp/snmpd.conf];then echo"/etc/snmp/snmpd.conf" echo"--------------------" cat/etc/snmp/snmpd.conf2>/dev/null|grep-v"^#"|sed'/^$/d' fi #报表信息 report_SNMP="$(getStatesnmpd)" } functiongetState(){ if[[$centosVersion<7]];then if[-e"/etc/init.d/$1"];then if[`/etc/init.d/$1status2>/dev/null|grep-E"isrunning|正在运行"|wc-l`-ge1];then r="active" else r="inactive" fi else r="unknown" fi else #CentOS7+ r="$(systemctlis-active$12>&1)" fi echo"$r" } functiongetSSHStatus(){ #SSHD服务状态,配置,受信任主机等 echo"" echo"" echo"############################SSH检查#############################" #检查受信任主机 pwdfile="$(cat/etc/passwd)" echo"服务状态:$(getStatesshd)" Protocol_Version=$(cat/etc/ssh/sshd_config|grepProtocol|awk'{print$2}') echo"SSH协议版本:$Protocol_Version" echo"" echo"信任主机" echo"--------" authorized=0 foruserin$(echo"$pwdfile"|grep/bin/bash|awk-F:'{print$1}');do authorize_file=$(echo"$pwdfile"|grep-w$user|awk-F:'{printf$6"/.ssh/authorized_keys"}') authorized_host=$(cat$authorize_file2>/dev/null|awk'{print$3}'|tr'\n'','|sed's/,$//') if[!-z$authorized_host];then echo"$user授权\"$authorized_host\"无密码访问" fi letauthorized=authorized+$(cat$authorize_file2>/dev/null|awk'{print$3}'|wc-l) done echo"" echo"是否允许ROOT远程登录" echo"--------------------" config=$(cat/etc/ssh/sshd_config|grepPermitRootLogin) firstChar=${config:0:1} if[$firstChar=="#"];then PermitRootLogin="yes"#默认是允许ROOT远程登录的 else PermitRootLogin=$(echo$config|awk'{print$2}') fi echo"PermitRootLogin$PermitRootLogin" echo"" echo"/etc/ssh/sshd_config" echo"--------------------" cat/etc/ssh/sshd_config|grep-v"^#"|sed'/^$/d' #报表信息 report_SSHAuthorized="$authorized"#SSH信任主机 report_SSHDProtocolVersion="$Protocol_Version"#SSH协议版本 report_SSHDPermitRootLogin="$PermitRootLogin"#允许root远程登录 } functiongetNTPStatus(){ #NTP服务状态,当前时间,配置等 echo"" echo"" echo"############################NTP检查#############################" if[-e/etc/ntp.conf];then echo"服务状态:$(getStatentpd)" echo"" echo"/etc/ntp.conf" echo"-------------" cat/etc/ntp.conf2>/dev/null|grep-v"^#"|sed'/^$/d' fi #报表信息 report_NTP="$(getStatentpd)" } functionuploadHostDailyCheckReport(){ json="{ \"DateTime\":\"$report_DateTime\", \"Hostname\":\"$report_Hostname\", \"OSRelease\":\"$report_OSRelease\", \"Kernel\":\"$report_Kernel\", \"Language\":\"$report_Language\", \"LastReboot\":\"$report_LastReboot\", \"Uptime\":\"$report_Uptime\", \"CPUs\":\"$report_CPUs\", \"CPUType\":\"$report_CPUType\", \"Arch\":\"$report_Arch\", \"MemTotal\":\"$report_MemTotal\", \"MemFree\":\"$report_MemFree\", \"MemUsedPercent\":\"$report_MemUsedPercent\", \"DiskTotal\":\"$report_DiskTotal\", \"DiskFree\":\"$report_DiskFree\", \"DiskUsedPercent\":\"$report_DiskUsedPercent\", \"InodeTotal\":\"$report_InodeTotal\", \"InodeFree\":\"$report_InodeFree\", \"InodeUsedPercent\":\"$report_InodeUsedPercent\", \"IP\":\"$report_IP\", \"MAC\":\"$report_MAC\", \"Gateway\":\"$report_Gateway\", \"DNS\":\"$report_DNS\", \"Listen\":\"$report_Listen\", \"Selinux\":\"$report_Selinux\", \"Firewall\":\"$report_Firewall\", \"USERs\":\"$report_USERs\", \"USEREmptyPassword\":\"$report_USEREmptyPassword\", \"USERTheSameUID\":\"$report_USERTheSameUID\", \"PasswordExpiry\":\"$report_PasswordExpiry\", \"RootUser\":\"$report_RootUser\", \"Sudoers\":\"$report_Sudoers\", \"SSHAuthorized\":\"$report_SSHAuthorized\", \"SSHDProtocolVersion\":\"$report_SSHDProtocolVersion\", \"SSHDPermitRootLogin\":\"$report_SSHDPermitRootLogin\", \"DefunctProsess\":\"$report_DefunctProsess\", \"SelfInitiatedService\":\"$report_SelfInitiatedService\", \"SelfInitiatedProgram\":\"$report_SelfInitiatedProgram\", \"RuningService\":\"$report_RuningService\", \"Crontab\":\"$report_Crontab\", \"Syslog\":\"$report_Syslog\", \"SNMP\":\"$report_SNMP\", \"NTP\":\"$report_NTP\", \"JDK\":\"$report_JDK\" }" #echo"$json" curl-l-H"Content-type:application/json"-XPOST-d"$json""$uploadHostDailyCheckReportApi"2>/dev/null } functioncheck(){ version getSystemStatus getCpuStatus getMemStatus getDiskStatus getNetworkStatus getListenStatus getProcessStatus getServiceStatus getAutoStartStatus getLoginStatus getCronStatus getUserStatus getPasswordStatus getSudoersStatus getJDKStatus getFirewallStatus getSSHStatus getSyslogStatus getSNMPStatus getNTPStatus getInstalledStatus } #执行检查并保存检查结果 check>$RESULTFILE echo"检查结果:$RESULTFILE" 添加host.info信息 192.168.2.30 root root 192.168.2.28 root root 192.168.2.27 root root 192.168.2.29 root root 执行python脚本生成文件 #使用exe执行python脚本 安装pyinstaller E:\python新版学习\pyinstaller-develop>PyInstaller E:\python新版学习\3.6.2\inspe ction.py

优秀的个人博客,低调大师

Docker自动化双主-02自动化脚本制作镜像启动

基于 DOCKER MySQL 主从搭建: 一、根据 Linux 系统版本号安装 dockerEG:Centos 7:1.shell>sudo yum update2.添加 dockeryum$[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF 3.安装 docker 的包shell>sudo yum install docker-engine4.将 docker 加到服务里面shell>sudo systemctl enable docker.service 5.启动 dockershell> sudo systemctl start docker二、将 docker 镜像导入 linux: 镜像文件上传到/opt/dtstack 目录下: 1.载入镜像:Shell>cd /opt/dtstackShell>docker load < mysql-5.6-x86_64.tar[root@centos7 docker]# docker load < mysql-5.6-x86_64.tarc411e76031a4: Loading layer [==================================================>] 201.9 MB/201.9 MBabd40b5d012f: Loading layer [==================================================>] 60.97 MB/60.97 MB7d082aa6bb0c: Loading layer [==================================================>] 263.3 MB/263.3 MB173e11cd6be1: Loading layer [==================================================>] 6.656 kB/6.656 kBbdb04743768e: Loading layer [==================================================>]sudotee /etc/yum.repos.d/docker.repo <<-'EOF'3.072 kB/3.072 kB9da6836b8f64: Loading layer [==================================================>] 4.872 MB/4.872 MBd47abb872b5c: Loading layer [==================================================>] 20.3 MB/20.3 MB008419e2fbfc: Loading layer [==================================================>] 108.9 MB/108.9 MB95d9d0bff849: Loading layer [==================================================>] 23.04 kB/23.04 kB71405897d961: Loading layer [==================================================>] 1.68 MB/1.68 MB58b14b6eb7df: Loading layer [==================================================>] 49.48 MB/49.48 MBfffc1c2170a5: Loading layer [==================================================>] 94.12 MB/94.12 MB9d60f33d82f1: Loading layer [==================================================>] 23.7 MB/23.7 MB2b9b1be70303: Loading layer [==================================================>] 6.656 kB/6.656 kBa2018f6089d9: Loading layer [==================================================>] 1.122 GB/1.122 GB9e274ef73e1d: Loading layer [==================================================>] 13.82 kB/13.82 kBd0ca45b2e986: Loading layer [==================================================>] 6.144 kB/6.144 kBLoaded image: dtstack_db_01:5.62.列出本地已有镜像:Shell> docker images REPOSITORY TAG SIZEdtstack_db_01 5.6 1.92 GB3.传参脚本说明: #!/bin/bash APP_NAME=db_01DOCKER_IMAGE=dtstack_db_01:5.6docker_run(){docker run -dt \--restart=always --name $APP_NAME \IMAGE ID 26e6aa6ed6c2CREATED 22 hours ago -p 3306:3306 #映射的端口号-v /etc/localtime:/etc/localtime:ro \-v /data/mysql/my3306:/data/mysql \/data/mysql 目录必须存在-e "dbport=3306" #dbport-e "db_root_password=root123" -e "db_master_ip=172.16.1.65" -e "db_slave_ip=172.16.1.86" \ 宿主机目录挂载到/data/mysql/myxxx 下, -e "db_tag=master" -e "db_instance=4" \实例...-i $DOCKER_IMAGE} docker_run4.运行 mysql_docker.sh 脚本 Shell>./mysql_docker.sh db 角色 选择性部署多实例。EG:单实例 db_instance=1, 3 则是 3 个 5.检查容器运行状态: Shell>docker ps –a CONTAINER IDSTATUSIMAGE PORTSCOMMAND"/bin/sh -c '/home..." 34 seconds agoNAMESCREATED dd47a290ae94Up 34 secondsdtstack_db_01:5.60.0.0.0:3306->3306/tcp, 3307-3311/tcp db_01 6.进行观察日志信息是否搭建成功:Shell>docker logs dd47a290ae94170317 19:31:09 mysqld_safe Logging to '/data/mysql/log/alert.log'.170317 19:31:09 mysqld_safe Starting mysqld daemon with databases from /data/mysql/data create replicaiton logmaster change master toupdate root password logSLAVE: 同上述操作: 1.需要更改的: #!/bin/bash APP_NAME=db_01DOCKER_IMAGE=dtstack_db_01:5.6docker_run(){ docker run -dt \ --restart=always \--name $APP_NAME \-p 3306:3306 \-v /etc/localtime:/etc/localtime:ro \-v /data/mysql/my3306:/data/mysql \-e "dbport=3306" \-e "db_root_password=root123" \-e "db_master_ip=172.16.1.69" \-e "db_slave_ip=172.16.1.86" \-e "db_tag=slave" #将 tag 标签转换为 slave,其他不需要修改 -e "db_instance=4" \-i $DOCKER_IMAGE}2.启动 mysql_slave.sh 脚本: Shell>./mysql_docker.sh [root@localhost docker]# docker ps -aCONTAINER ID CREATED NAMES fb45654c2eda Up 6 minutes docker_runIMAGE STATUSdtstack_db_01:5.6 0.0.0.0:3306->3306/tcp, 3307-3311/tcpCOMMAND PORTS6 minutes agodb_01"/bin/sh -c '/home..."三、通过外部连接 mysql:检查主从是否正常:1.SLAVE:Shell>mysql -h172.16.1.86 -uroot -proot123 -P3306 -e "start slave;show slave statusG" | grep _Running | awk 'NR!=3'Warning: Using a password on the command line interface can be insecure.2.master:[root@centos7 docker]# mysql -h172.16.1.65 -uroot -proot123 -P3306 -e "start slave;show slave statusG" | grep _Running | awk 'NR!=3' Slave_IO_Running: Yes Slave_SQL_Running: Yes Slave_IO_Running: Yes

优秀的个人博客,低调大师

实践:Kubernetes 集群中 DNS 故障的可观测性与根因诊断

作者:罗松(西流) 前言 PHP 的应用范围相当广泛,尤其是在网页程序的开发上, 根据最新维基百科 [1] 显示,2013 年 4 月的统计资料,PHP 已经被安装在超过 2 亿 4400 万个网站和 210 万台服务器上, 而根据 W3Techs [2] 的报告,截至 2021 年 9 月, 有 78.9%的网站使用 PHP。所以 PHP 是世界第一语言至少在 web 开发领域并不是戏称。 而在技术选型上,PHP 主要采用的是 LAMP(全称是Linux + apache + mysql + php) 或者 LNMP(全称是Linux + nginx + mysql + php),这种成熟稳定的技术框架推动 PHP web 开发生态的繁荣和商业上的成功。 在传统的开发模式中,开发者自己需要安装维护各种软件的安装、维护升级: 如果您是一个企业用户,如果业务体量变大或者为了生产环境的稳定和可用性,使用负载均衡是一个必然的选项: 即此时,PHP 开发者或者线上运维的同学关心的事情多了起来: 每个增加的生产机器都需要重新安装一遍相关软件,做相同的 nginx 配置以及 php-fpm 的配置,以及维护每个生产机器的安全更新; 假如开发的应用需要一个新的扩展,可能需要人肉每台机器去增加扩展; 负载均衡器随着业务的变更升配,后面一台 Worker 机器挂掉了,如何做运维处理? 业务的波峰波谷怎么应对才能让资源的利用率提高? 如果您是项目组开发成员比较多的企业用户,能不能不需要给每个开发配置一个安装的 NLP 的 Linux 机器作为开发测试机器(或者多人共享一个机器)? 如果您是一个提供网站开发和托管的 ISV、外包公司或者创业公司,我的客户都是一些中小企业的门户网站,我怎么提高我后端机器资源利用率以及更好提供定制化服务? 如果您是一个学生或者准备学习 PHP 开发,本地只有 Windows 电脑,能不能直接近乎免费的方式获取 LNP(Linux+Nginx+PHP) 的环境用来学习呢? 带着这些问题, 我们去探索一下 Serverless 是如何解决这些痛点的。 PHP 遇见 Serverless 什么是 Serverless? Serverless = Faas (Function as a service) + Baas (Backend as a service),我们简单通过两个图快速了解相关概念: 传统模式 Serverless 模式 图中的 CDN 和 OSS 就是 BaaS 服务,FC 就是自定义函数逻辑的 FaaS 平台, 通过这个对比,我们能快速得到 FaaS 的特性和好处: 只需要专注业务代码开发, 编写对应的逻辑即可 极致弹性伸缩, 无需管理服务器 按量付费,每次调用按毫秒计费 ... 本文后续讨论的 Serverless 主要指的是 FaaS,如下示意图,几行代码编写完毕,保存到云厂商的 FaaS 平台,就完成了一个弹性高可用的 Web API。 PHP 遇见 Serverless PHP 作为一个开发群体的很大的语言,各大云厂商的 FaaS,比如阿里云的函数计算、AWS 的 Lambda (通过 Custom Runtime [3] 间接支持)、腾讯的 SCF 等都推出了对 PHP 语言的支持,phper 面对前端领域的 Serverless 技术革新实践(感兴趣的见本文最后的附录),应该不遑多让。以阿里云函数计算为例,有很多 PHP 的开发者有了很多有趣的实践: 直接使用 gd 或者 ImageMagick 扩展,实现弹性高可用的图片、水印等各种 CPU 密集型 API 直接使用 ffmpeg + 性能型实例 + 异步有状态调用完成视频剪辑合成等音视频处理业务 使用 HTTP 触发器实现的函数, 埋点到广告平台, 快速实现高可用的买量业务 直接将之前基于框架(如 ThinkPHP)实现的 WEB API 直接迁移到 FaaS 平台,不用再担心宕机和运维问题了 虽然 FaaS 很好地解决了 phper 如下问题: 新业务或者开发新的 web API 存量业务中, 有些 CPU 密集型或者弹性要求很高的 API 单独抽离出来 FaaS 化 但是传统的开发模式或者存量业务,对开发者有一定的上手和改造成本,比如某 Faas 厂商 PHP Runtime 编程接口示例: function handler($event, $context) { $eventObj = json_decode($event, $assoc = true); // do your thhings // .... return $eventObj['key']; } 但是能不能更进一步,开发者不需要按照 FaaS 厂商的约定的函数入口能实现一个个的API, 而是能直接将传统运行在 LAMP 或者 LNMP 的项目直接 FaaS 化?答案是肯定的。 阿里云函数计算的 Custom Runtime 以及直接基于 HTTP 协议的极简编程模型走在了所有云厂商的前列。 函数计算启动 Custom Runtime 执行环境时,会默认调用 bootstrap 文件(或者您创建函数的时设置的 Args 参数)启动您自定义的 HTTP Server,然后这个 HTTP Server 接管了函数计算系统的所有请求,即您所有的函数调用请求。 函数计算 Custom runtime 执行环境底层系统是 Linux, 并且已经内置的 nginx/1.10.3 和 php-fpm7.4, 对于 PHP 应用,您直接使用即可 以部署一个 wordpress [3] 项目为例, 只需要将如下目录直接打包成一个 zip 包在函数计算平台创建一个函数即可: - bootstrap - nginx.conf - php-fpm.conf - php.ini-production - wordpress 其中 wordpress 目录是对应的 web 工程, bootstrap 是启动 nginx 和 php-fpm 的脚本即可: ... echo "start php-fpm" php-fpm7.4 -c /code/php.ini-production -y /code/php-fpm.conf echo "start nginx" nginx -c /code/nginx.conf ... bootstrap 详情可参考 WordPress in FC [5] (文末附链接) 所以,使用函数计算这个 Serverless 产品和传统的 PHP 开发相结合后,您再也不用考虑负载均衡的事情,不用考虑扩缩容的事情,不用管理机器、不用担心宕机的事情等等,只需要安安心心把业务代码开发好即可。 从上图可以看出:开发者只需要开发好自己的业务代码即可,唯一需要考虑的事情,就是函数计算这边扩容不要太多太猛(比如直接在函数计算平台设置下该函数能弹出的最大实例数目即可),给下游自己的 Mysql 数据库过大的压力即可。 当然, 从原始的传统的 php web 应用完全迁移到 Serverless 形态的函数计算平台,某些场景可能需要考虑数据持久化问题,因为函数计算是无状态的,数据持久化保存可以借助 NAS、Redis 等服务完成,以 NAS 为例,流程图如下: 以 WordPress 为例,后台系统上传的图片或者 Session 功能都是需要持久化到磁盘的。 设置 web 工程的文件上传目录或者 session 目录为 NAS 盘的某个目录, NAS 盘实现持久化 甚至可以将 web 工程直接放到 NAS 盘上,此时函数计算纯粹就是 LNP 执行环境 比如将 wordpress 工程不作为函数的代码包的一部分,而已提前上传到 NAS 盘,只需要设置好 nginx.conf 中的 root 能知道 web 工程即可,如上面的 nginx.conf,/mnt/auto 表示挂载的 NAS 目录,mnt/auto/wordpress 则表示在 NAS 上的 web 工程。 此时对您来说,函数再也不用变了,您可能只是需要开发新的业务代码,然后上传到 NAS 上即可(或者直接使用 git 直接在 NAS 操作,实现 web 工程的版本和 git 上的 commit 绑定,使用 git 实现代码的快速升级和混滚) 但是从安全生产的角度来说,还是建议您 web 工程变更最好和函数的变更相关联。 总结 从上面的讨论和陈述中,我们不难发现,PHP 遇见 Serverless 是一件令人兴奋的事情,让 phper 有了更大的想象空间。Serverless 的理念和 PHP 这个语言出现的理念也是一致的: 即让开发者最大精力集中在自己的业务价值。 PHP 语言一直是 web 领域最好的生产力代表,而 Serverless 将会让 PHP 如虎添翼。 相关链接​ [1]维基百科: https://zh.wikipedia.org/wiki/PHP? [2]W3Techs: https://w3techs.com/? [3]Custom Runtime 简介: https://help.aliyun.com/document_detail/132044.html? [4]wordpress 项目: https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src? [5]WordPress in FC: ​https://github.com/devsapp/start-web-framework/blob/master/web-framework/php/wordpress/src/code/bootstrap?​​ 我们最后来一一解答下前言中提出的问题: Q1:如果您是一个企业用户,业务体量变大或者为了生产环境的稳定和可用性,如何做? A1:如上面陈述,使用函数计算和传统的 PHP 开发相结合后,您再也不用考虑负载均衡的事情,不用考虑扩缩容的事情,不用管理机器、担心宕机的事情等等,只需要安安心心把业务代码开发好即可。 Q1:如果您是项目组开发成员比较多的企业用户,能不能不需要给每个开发配置一个安装的 NLP 的 Linux 机器作为开发测试机器(或者多人共享一个机器)? A1:是的,每个开发者在函数计算上创建一个自己的 Service/函数即可,Service/函数配置开发测试环境的 VPC,实现内网安全访问数据库等其他下游服务。函数调用的时候,函数计算会拉一个 NLP 的执行环境来运行您分支上正在开发的 PHP 代码。 每个执行环境是相互隔离的 按调用次数计费, 不需要预留机器, 免除了机器成本上的浪费 也可以很方便进行压测等各种事宜 Q1:如果您是一个提供网站开发和托管的 ISV、外包公司或者创业公司,我的客户都是一些中小企业的门户网站,我怎么提高我后端机器资源利用率以及更好提供定制化服务? A1:通常来说,很多企业门户网站访问量不大,但是网站挂掉了会引起客户投诉。每个客户的网站通过 service 或者函数区分,通过函数名或者 service 去区分您自己的客户:i. 管理方便 ii. 做定制化方便 iii. 做不同 VIP 等级服务方便。举个例子,您可以快速通过某个函数的调用指标情况,可以看出哪个客户的网站访问量大,可以做出客户画像以及制定不同的收费和 VIP 服务级别。 Q1:如果您是一个学生或者准备学习 PHP 开发,本地只有 Windows 电脑,能不能直接近乎免费的方式获取 LNP(Linux+Nginx+PHP) 的环境用来学习呢? A1:是的, 只要将如下的文件和文件夹打包成 zip 包去函数计算控制台创建函数即可: - bootstrap - nginx.conf - php-fpm.conf - php.ini-production - myweb | - hello.php 如果您对 PHP 落地 Serverless 感兴趣,您有观点、想法或者想吐槽的,可以和钉钉搜索:31897696,欢迎进群大家一起交流。 PHP 框架 Serverless 最佳实践: [1]ThinkPHP: https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/thinkphp/src? [2]Laravel: https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/laravel/src? [3]Wordpress: https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src? [4]Z-BlogPHP: https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/zblog/src? [5]Swoole: https://github.com/devsapp/start-fc/tree/master/custom-function/php74? [6]其他更多: https://github.com/devsapp/start-web-framework 参考引用 Serverless Architectures: https://martinfowler.com/articles/serverless.html? Backend For Frontend(BFF)in Serverless: https://www.infoq.cn/article/0btajez51ysb_qehr526? 关于 Serverless 未来对前端开发影响的具体看法: https://developer.aliyun.com/article/793492? 当 SSR 遇上 Serverless,轻松实现页面瞬开: https://cnodejs.org/topic/5e394e311225c9423dcd9754? 附录 Serverless 在前端领域如火如荼的发展 附录1 Backend For Frontend(BFF)in Serverless 来提高生产力 • 前端开发者全栈化 • 提高开发效率,减少前端和后端接口同学的沟通联调时间,后端同学只需要做好原子的接口的稳定性和可靠性即可,数据的聚合直接由前端同学通过 BFF 实现 附录2 当 SSR 遇上 Serverless,轻松实现页面瞬开 • 借助于函数即服务(FaaS)的能力,不需要再去搭建传统的 Node 应用,一个函数就可以变成一个服务,开发者可以更纯粹的关注于业务逻辑。 • FaaS 以函数为单位的形式以及弹性机制,为 SSR 应用带来了天然的隔离性和动态修复能力,可以更好的避免页面间的交叉污染,或一些边界的异常场景对应用带来致命性的伤害。 • 无需运维、按需执行、弹性伸缩这些特性,大大降低了 SSR 应用对开发者的门槛。 附录 1: https://www.infoq.cn/article/0btajez51ysb_qehr526? 附录 2: ​https://cnodejs.org/topic/5e394e311225c9423dcd9754?​​ 发布云原生技术最新资讯、汇集云原生技术最全内容,定期举办云原生活动、直播,阿里产品及用户最佳实践发布。与你并肩探索云原生技术点滴,分享你需要的云原生内容。 关注【阿里巴巴云原生】公众号,获取更多云原生实时资讯!

优秀的个人博客,低调大师

Java 进程启停及诊断 Jarboot v2.2.1 稳定版发布

本次更新修复了部分问题,进行了较大的功能性改进及性能优化,占用更少的内存和CPU,推荐升级。 可通过Gitee和GitHub下载最新的安装包,升级时直接覆盖原目录即可,使用Docker的请更新下Jarboot的Docker镜像。 GitHub:https://github.com/majianzheng/jarboot Gitee:https://gitee.com/majz0908/jarboot Docker Hub:https://registry.hub.docker.com/r/mazheng0908/jarboot sudo docker run -itd --name jarboot -p 9899:9899 mazheng0908/jarboot 使用Docker时建议将/jarboot/services和/jarboot/logs挂载宿主机 关于与k8s的集成使用请参考:Jarboot以客户端形式集成到k8s、Docker的方法和Jarboot容器镜像使用及Dockerfile分享 更新内容 修复工作空间变更后工作空间文件监控功能还是旧目录的问题 大幅度优化std的IO性能,重构缓存刷新机制,实现空闲期 0 CPU占用 dashboard、jad、heapdump命令的渲染界面优化,交互设计改进 内存优化,占用更少的内存空间 修复Attach本地进程时未初始化而不显示控制台输出的问题 优化工作空间文件监控逻辑,原file-record.temp文件废弃,可删除 修复derby日志文件在根目录的问题,移到logs目录,原derby.log文件可删除 优化后端线程的调度管理 修复删除服务时,文件太多无响应的问题,增加全局loading提示 修复导入服务时,压缩文件内容过多时无响应的问题,增加全局loading提示 代码优化,可读性优化,完善代码注释 远程进程连接网络断开时,增加心跳及尝试重连机制,每隔一段时间探测一次 优化命令执行的通讯协议 修复notice接口指定sessionId时仍通知所以客户端的问题,优化notice的前后端交互机制 优化前端布局,权限控制、设置、帮助使用左侧固定右侧自适应布局方式 有对代码感兴趣的同学,欢迎联系我,新功能或修复bug,欢迎提交PR。技术栈前端是React、Less,后端是Java。 注意:提交PR需要在GitHub上fork分支,Gitee每次会从GitHub强制同步。

优秀的个人博客,低调大师

应用诊断利器Arthas 3.0.5版本发布:提升全平台用户体验

Arthas从9月份开源以来,受到广大Java开发者的支持,Github Star数三个月超过6000,非常感谢用户支持。同时用户给Arthas提出了很多建议,其中反映最多的是: Windows平台用户体验不好 Attach的进程和最终连接的进程不一致 某些环境下没有安装Telnet,不能连接到Arthas Server 本地启动,不需要下载远程(很多公司安全考虑) 下载速度慢(默认从maven central repository下载) 在Arthas 3.0.5版本里,我们在用户体验方面做了很多改进,下面逐一介绍。 Github: https://github.com/alibaba/arthas 文档:https://alibaba.github.io/arthas/ 全平台通用的arthas-boot arthas-boot是新增加的支持全平

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册