Hello World
A sample go program is show here.
package main
import "fmt"
func main() {
message := greetMe("world")
fmt.Println(message)
}
func greetMe(name string) string {
return "Hello, " + name + "!"
}
Run the program as below:
$ go run hello.go
Variables
Normal Declaration:
var msg string
msg = "Hello"
Shortcut:
msg := "Hello"
Constants
const Phi = 1.618
Strings
str := "Hello"
Multiline string
str := `Multiline
string`
Numbers
Typical types
num := 3 // int
num := 3. // float64
num := 3 + 4i // complex128
num := byte('a') // byte (alias for uint8)
Other Types
var u uint = 7 // uint (unsigned)
var p float32 = 22.7 // 32-bit float
Arrays
// var numbers [5]int
numbers := [...]int{0, 0, 0, 0, 0}
Pointers
func main () {
b := *getPointer()
fmt.Println("Value is", b)
func getPointer () (myPointer *int) {
a := 234
return &a
a := new(int)
*a = 234
Pointers point to a memory location of a variable. Go is fully garbage-collected.
Type Conversion
i := 2
f := float64(i)
u := uint(i)
Slice
slice := []int{2, 3, 4}
slice := []byte("Hello")
PostgreSQL
prepare data and config folder
mkdir -p $PWD{/data,/config}
touch $PWD/config/postgresql.conf
run container
docker run --name pgsql17 \
-p 5432:5432 \
-e POSTGRES_PASSWORD=postgresql \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v $PWD/data:/var/lib/postgresql/data \
-v $PWD/config/postgresql.conf:/usr/share/postgresql/postgresql.conf:rw \
-d bitnami/postgresql:17.4.0
MySQL
prepare data and config folder
mkdir -p mysql8/{config,log,datadir,mysql-files}
touch $PWD/config/my.cnf
run container
docker run --name mysql8 \
--restart always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root@0103@, \
-v /etc/localtime:/etc/localtime \
-v $PWD/config:/etc/mysql/conf.d \
-v $PWD/log:/var/log/mysql \
-v $PWD/datadir:/var/lib/mysql \
-v $PWD/mysql-files:/var/lib/mysql-files \
-v $PWD/config/my.cnf:/etc/mysql/my.cnf:rw \
-d mysql:8.0.35
mongo
prepare data and config folder
mkdir -p mongo/{data,log,etc,initdb.d}
touch $PWD/conf/mongod.conf
run container
docker run --name mongo \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
-v $PWD/data:/data/db \
-v $PWD/log:/data/log \
-v $PWD/etc:/etc/mongo \
-v $PWD/initdb.d:docker-entrypoint-initdb.d \
-d mongo:6.0.6 \
--config /etc/mongo/mongod.conf
Redis
prepare data and config folder
mkdir -p redis/{data,config}
touch $PWD/config/redis.conf
run container
podman run -itd \
--name redis7 \
-p 6379:6379 \
-v $PWD/config:/etc/redis \
-v $PWD/data:/data \
redis:7.0.5 \
redis-server /etc/redis/redis.conf
nacos
prepare data and config folder
mkdir -p nacos/{data,conf,logs}
run container
docker run -d \
--name nacos \
-e MODE=standalone \
-p 8848:8848 \
-v $PWD/conf:/home/nacos/conf \
-v $PWD/logs:/home/nacos/logs \
-v $PWD/data:/home/nacos/data \
-v $PWD/init.d:/home/nacos/init.d \
-e MODE=standalone
nacos/nacos-server:v2.2.3
nginx
prepare data and config folder
mkdir -p nginx/{html,logs,conf}
touch $PWD/conf/nginx.conf
run container
docker run --name nginx \
--privileged=true \
-p 80:80 \
-p 8026:8026 \
-v $PWD/html/:/usr/share/nginx/html/ \
-v $PWD/logs/:/var/log/nginx/ \
-v $PWD/conf/:/etc/nginx/ \
-itd nginx
openresty
prepare data and config folder
mkdir -p openresty/{html,logs,conf}
touch $PWD/conf/nginx.conf
run container
docker run -itd \
--name openresty \
--privileged=true \
--restart always \
-p 80:80 \
-p 443:443 \
-v /etc/localtime:/etc/localtime \
-v $PWD/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:rw \
-v $PWD/html/:/usr/local/openresty/nginx/html/ \
-v $PWD/logs/:/usr/local/openresty/nginx/logs/ \
openresty/openresty:1.25.3.1-alpine-fat-amd64
Condition
if day == "sunday" || day == "saturday" {
rest()
} else if day == "monday" && isTired() {
groan()
} else {
work()
}
if _, err := doThing(); err != nil {
fmt.Println("Uh oh")
Switch
switch day {
case "sunday":
// cases don't "fall through" by default!
fallthrough
case "saturday":
rest()
default:
work()
}
Loop
for count := 0; count <= 10; count++ {
fmt.Println("My counter is at", count)
}
entry := []string{"Jack","John","Jones"}
for i, val := range entry {
fmt.Printf("At position %d, the character %s is present\n", i, val)
n := 0
x := 42
for n != x {
n := guess()
}
Condition
if day == "sunday" || day == "saturday" {
rest()
} else if day == "monday" && isTired() {
groan()
} else {
work()
}
if _, err := doThing(); err != nil {
fmt.Println("Uh oh")
Variable
NAME="John"
echo $NAME
echo "$NAME"
echo "${NAME}
Condition
if [[ -z "$string" ]]; then
echo "String is empty"
elif [[ -n "$string" ]]; then
echo "String is not empty"
fi
根据PID过滤进程所有信息
#!/bin/bash
# 检查是否提供了 PID 作为参数
if [ $# -eq 0 ]; then
echo "请提供一个 PID 作为参数。"
exit 1
fi
pid=$1
# 检查 PID 是否为有效的数字
if ! [[ $pid =~ ^[0-9]+$ ]]; then
echo "输入的 PID 不是有效的数字。"
exit 1
fi
# 检查进程是否存在
if ! ps -p $pid > /dev/null 2>&1; then
echo "PID 为 $pid 的进程不存在。"
exit 1
fi
# 输出进程的所有信息
echo "PID 为 $pid 的进程信息如下:"
echo "进程PID: $P"
echo "进程命令:`ps -aux| awk '$2~/^'$P'$/{print $11}'`"
echo "进程所属用户: `ps -aux| awk '$2~/^'$P'$/{print $1}'`"
echo "CPU占用率:`ps -aux| awk '$2~/^'$P'$/{print $3}'`%"
echo "内存占用率:`ps -aux| awk '$2~/^'$P'$/{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux| awk '$2~/^'$P'$/{print $9}'`"
echo "进程运行的时间:`ps -aux| awk '$2~/^'$P'$/{print $10}'`"
echo "进程状态:`ps -aux| awk '$2~/^'$P'$/{print $8}'`"
echo "进程虚拟内存:`ps -aux| awk '$2~/^'$P'$/{print $5}'`"
echo "进程共享内存:`ps -aux| awk '$2~/^'$P'$/{print $6}'`"
根据进程名过滤进程信息
#! /bin/bash
# Function: 根据输入的程序的名字过滤出所对应的PID,并显示出详细信息,如果有几个PID,则全部显示
read -p "请输入要查询的进程名:" NAME
N=`ps -aux | grep $NAME | grep -v grep | wc -l` ##统计进程总数
if [ $N -le 0 ];then
echo "该进程名没有运行!"
fi
i=1
while [ $N -gt 0 ]
do
echo "进程PID: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $2}'`"
echo "进程命令:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
echo "进程所属用户: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $1}'`"
echo "CPU占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $3}'`%"
echo "内存占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $9}'`"
echo "进程运行的时间:` ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
echo "进程状态:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $8}'`"
echo "进程虚拟内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $5}'`"
echo "进程共享内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $6}'`"
echo "***************************************************************"
let N-- i++
done
根据用户名查询该用户的相关信息
#! /bin/bash
# Function:根据用户名查询该用户的所有信息
read -p "请输入要查询的用户名:" A
echo "***************************************************************"
n=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l`
if [ $n -eq 0 ];then
echo "该用户不存在"
echo "***************************************************************"
else
echo "该用户的用户名:$A"
echo "该用户的UID:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'`"
echo "该用户的组为:`id $A | awk {'print $3'}`"
echo "该用户的GID为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'`"
echo "该用户的家目录为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'`"
Login=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'`
if [ $Login == "/bin/bash" ];then
echo "该用户有登录系统的权限!!"
echo "***************************************************************"
elif [ $Login == "/sbin/nologin" ];then
echo "该用户没有登录系统的权限!!"
echo "***************************************************************"
fi
fi
加固系统的一些配置
#! /bin/bash
# Function:对账户的密码的一些加固
read -p "设置密码最多可多少天不修改:" A
read -p "设置密码修改之间最小的天数:" B
read -p "设置密码最短的长度:" C
read -p "设置密码失效前多少天通知用户:" D
sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS '$A'' /etc/login.defs
sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS '$B'' /etc/login.defs
sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN '$C'' /etc/login.defs
sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE '$D'' /etc/login.defs
echo "已对密码进行加固,新用户不得和旧密码相同,且新密码必须同时包含数字、小写字母,大写字母!!"
sed -i '/pam_pwquality.so/c\password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1' /etc/pam.d/system-auth
echo "已对密码进行加固,如果输入错误密码超过3次,则锁定账户!!"
n=`cat /etc/pam.d/sshd | grep "auth required pam_tally2.so "|wc -l`
if [ $n -eq 0 ];then
sed -i '/%PAM-1.0/a\auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300' /etc/pam.d/sshd
fi
echo "已设置禁止root用户远程登录!!"
sed -i '/PermitRootLogin/c\PermitRootLogin no' /etc/ssh/sshd_config
read -p "设置历史命令保存条数:" E
read -p "设置账户自动注销时间:" F
sed -i '/^HISTSIZE/c\HISTSIZE='$E'' /etc/profile
sed -i '/^HISTSIZE/a\TMOUT='$F'' /etc/profile
echo "已设置只允许wheel组的用户可以使用su命令切换到root用户!"
sed -i '/pam_wheel.so use_uid/c\auth required pam_wheel.so use_uid ' /etc/pam.d/su
n=`cat /etc/login.defs | grep SU_WHEEL_ONLY | wc -l`
if [ $n -eq 0 ];then
echo SU_WHEEL_ONLY yes >> /etc/login.defs
fi
echo "即将对系统中的账户进行检查...."
echo "系统中有登录权限的用户有:"
awk -F: '($7=="/bin/bash"){print $1}' /etc/passwd
echo "********************************************"
echo "系统中UID=0的用户有:"
awk -F: '($3=="0"){print $1}' /etc/passwd
echo "********************************************"
N=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
echo "系统中空密码用户有:$N"
if [ $N -eq 0 ];then
echo "恭喜你,系统中无空密码用户!!"
echo "********************************************"
else
i=1
while [ $N -gt 0 ]
do
None=`awk -F: '($2==""){print $1}' /etc/shadow|awk 'NR=='$i'{print}'`
echo "***************************************************************"
echo $None
echo "必须为空用户设置密码!!"
passwd $None
let N--
done
M=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
if [ $M -eq 0 ];then
echo "恭喜,系统中已经没有空密码用户了!"
else
echo "系统中还存在空密码用户:$M"
fi
fi
echo "即将对系统中重要文件进行锁定,锁定后将无法添加删除用户和组"
read -p "警告:此脚本运行后将无法添加删除用户和组!!确定输入Y,取消输入N;Y/N:" i
case $i in
[Y,y])
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
echo "锁定成功!"
;;
[N,n])
chattr -i /etc/passwd
chattr -i /etc/shadow
chattr -i /etc/group
chattr -i /etc/gshadow
echo "取消锁定成功!!"
;;
*)
echo "请输入Y/y or N/n"
esac
使用INOTIFY+RSYNC自动实时同步数据
#!/bin/bash
# chkconfig: - 85 15
# description: It is used to serve
# 监测/data路径下的文件变化,排除Temp目录
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /data/ --exclude=Temp"
# 同步数据
RSYNC_CMD1="rsync -avz /data/ --exclude-from=/etc/rc.d/init.d/exclude.txt [email protected]:/data/ --delete"
RSYNC_CMD2="rsync -avz /data/ --exclude-from=/etc/rc.d/init.d/exclude.txt [email protected]:/data/ --delete"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD1&&$RSYNC_CMD2 >> rsync.log
fi
done
MYSQL自动备份以及删除备份脚本
#!/bin/bash
# Author: Harry
# Description: Database backup script
dbback(){
# 定义变量
db_user="ma_prd"
db_passwd="<password>"
db_path="/data/bakmysql"
db_file="backuprecord"
db_date=`date +%Y%m%d_%H:%M:%S`
# 判断路径是否存在
[ -d $db_path ] || exit 2
# 使用mysqldump备份数据,并用gzip进行压缩
mysqldump -u$db_user -p$db_passwd --single-transaction ma | gzip > $db_path/${db_date}_ma.sql.gz
REVAL=$?
if [ $REVAL -eq 0 ]
then
echo "$db_date ma db is backups successful" >>$db_path/$db_file
else
echo "$db_date ma db is backups failed" >>$db_path/$db_file
fi
}
#删除超过7天的备份数据
delbak(){
local db_path="/data/bakmysql"
find $db_path -type f -name "*ma*.gz" -mtime +7 -exec rm -rf {} \;
}
dbback
delbak
使用curl检测网站可用性脚本
#!/usr/bin/env bash
# Author: Harry
# Version:1.1
# Description: Web check with curl
#定义颜色
red='\e[0;31m'
RED='\e[1;31m'
green='\e[0;32m'
GREEN='\e[1;32m'
blue='\e[0;34m'
BLUE='\e[1;34m'
cyan='\e[0;36m'
CYAN='\e[1;36m'
NC='\e[0m'
date=`date +%Y-%m-%d' '%H:%M:%S`
# 定义User Agent
ua="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36"
pass_count=0
fail_count=0
# 需要检测的url
urls=(
"http://www.xxx.com"
)
function request(){
status=$(curl -sk -o /dev/null --retry 1 --connect-timeout 1 -w '%{http_code}' --user-agent "$ua" $1)
if [ $status -eq '200' -o $status -eq '301' \
-o $status -eq '302' ]; then
echo -e "[${GREEN} Passed ${NC}] => $1"
((pass_count ++))
else
echo -e "[${RED} Failed ${NC}] => $1"
((fail_count ++))
fi
}
function main(){
echo "Start checking ..."
for((i=0;i<${#urls[*]};i++))
do
request ${urls[i]};
done
# 输出检测通过和失败的记录
echo -e "======================== Summary ======================== "
echo -e "Total: ${cyan} $((pass_count + fail_count))${NC} Passed: ${green}${pass_count}${NC} Failed: ${red}${fail_count}${NC} Time: $date"
}
main $*
检测并封禁异常IP地址的脚本
#!/bin/bash
# 获取当前日期和时间的格式化字符串
DATE=$(date +%d/%b/%Y:%H:%M)
# 日志文件路径和封禁记录文件路径
LOG_FILE="/usr/local/nginx/logs/access.log"
BANNED_IP_LOG="/usr/local/nginx/logs/banned_ip.log"
# 获取异常IP地址,使用tail命令读取日志文件的最后10000行,并使用grep命令筛选出包含当前日期和时间的日志记录
ABNORMAL_IP=$(tail -n 10000 "$LOG_FILE" | grep "$DATE" | awk '{a[$1]++}END{for(i in a) if(a[i]>10) print i}')
# 封禁异常IP地址
declare -a IP_LIST
for IP in $ABNORMAL_IP; do
if ! iptables -vnL | grep -q "$IP"; then
iptables -I INPUT -s "$IP" -j DROP
echo "$(date +'%F_%T') $IP" >> "$BANNED_IP_LOG"
IP_LIST+=("$IP")
fi
done
# 打印被封禁的IP地址
if [ ${#IP_LIST[@]} -gt 0 ]; then
echo "以下IP地址已被封禁:"
printf "%s\n" "${IP_LIST[@]}"
else
echo "没有需要封禁的IP地址。"
fi
查看网卡实时流量脚本
#!/bin/bash
# 如果没有传递参数,默认使用 lo 作为网络接口
NIC=${1:-lo}
echo -e " In Out"
while true; do
# 使用awk命令从/proc/net/dev文件中提取指定网络接口的接收字节数和发送字节数,并保存到变量OLD_IN和OLD_OUT中
OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
# 等待1秒钟
sleep 1
# 再次使用awk命令提取最新的接收字节数和发送字节数,并保存到变量NEW_IN和NEW_OUT中。
NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
# 计算接收速率和发送速率,单位为KB/s,并保存到变量IN和OUT中
IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
# 使用echo命令输出接收速率和发送速率
echo "$IN $OUT"
sleep 1
done
访问日志分析脚本
#!/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" && $4<="[27/Nov/2018:16:20:49"{a[$1]++}END{for(v in a)print v,a[v]}' $LOG_FILE | sort -k2 -nr | head -10
echo "***************************************************************"
echo "统计访问最多的10个页面"
awk '{a[$7]++}END{print "PV:",length(a);for(v in a){if(a[v]>10)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]}}' $LOG_FILE