├── README.md └── change-oracle-ip.sh /README.md: -------------------------------------------------------------------------------- 1 | # 说明 2 | 脚本需在墙内机器运行,并且运行机器上必须配置好oci环境,自动检测指定区域所有公共ip的连通性,如果不通,则删除当前公共ip,并新建公共ip绑定至实例。 3 | 4 | 5 | --- 6 | 依赖jq 7 | 8 | https://github.com/stedolan/jq 9 | 10 | 11 | 安装jq 12 | ```bash 13 | wget http://stedolan.github.io/jq/download/linux64/jq -O /usr/local/bin/jq 14 | chmod +x /usr/local/bin/jq 15 | ``` 16 | 17 | --- 18 | 19 | # 使用方法 20 | 21 | 下载脚本 22 | 23 | ``` 24 | wget https://raw.githubusercontent.com/angelsky11/change-oracle-ip/master/change-oracle-ip.sh 25 | ``` 26 | 27 | 运行 28 | 29 | ```bash 30 | chmod +x change-oracle-ip.sh 31 | ./change-oracle-ip.sh default 32 | ``` 33 | 34 | 可添加定时任务每10分钟检测一次 35 | 36 | 37 | 运行`crontab -e`后添加下面一行: 38 | ``` 39 | */10 * * * * /YOUR_PATH/change-oracle-ip.sh default 40 | ``` 41 | 如果不想10分钟一次请自行搜索crontab用法 42 | 43 | 44 | 如果oci环境配置了多个config,可根据指定config运行脚本 45 | ```bash 46 | ./change-oracle-ip.sh /PATH/OF/YOUR/CONFIG_FIEL 47 | ``` 48 | 49 | 50 | # server酱微信消息推送 51 | 52 | https://sc.ftqq.com 53 | 54 | 55 | 修改以下两个参数 56 | ```bash 57 | #server酱开关,0为关闭,1为开启 58 | NOTIFICATION=0 59 | #server酱api 60 | SERVERCHAN_KEY='YOUR_SERVERCHAN_API' 61 | ``` 62 | 63 | --- 64 | 65 | 66 | 如有使用问题请先搜索后发信息 https://t.me/angelsky11 67 | -------------------------------------------------------------------------------- /change-oracle-ip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #server酱开关,0为关闭,1为开启 4 | NOTIFICATION=0 5 | #server酱api 6 | SERVERCHAN_KEY='YOUR_SERVERCHAN_KEY' 7 | 8 | if [ $1 == "default" ] 9 | then 10 | CONFIG_FILE='/root/.oci/config' 11 | else 12 | CONFIG_FILE=$1 13 | fi 14 | 15 | compartmentId=$(oci iam user list --config-file $CONFIG_FILE | jq -r '.[][0]."compartment-id"') 16 | 17 | #ping检测的次数 18 | PINGTIMES=30 19 | 20 | readonly NOTIFICATION 21 | readonly SERVERCHAN_KEY 22 | readonly PINGTIMES 23 | readonly compartmentId 24 | readonly CONFIG_FILE 25 | 26 | case $(uname) in 27 | "Darwin") 28 | # Mac OS X 操作系统 29 | CHECK_PING="100.0% packet loss" 30 | ;; 31 | "Linux") 32 | # GNU/Linux操作系统 33 | CHECK_PING="100% packet loss" 34 | ;; 35 | *) 36 | echo -e "Unsupport System" 37 | exit 1 38 | ;; 39 | esac 40 | 41 | echo -e '*****************************************************************' 42 | echo -e '***************************** START *****************************' 43 | echo -e '*****************************************************************' 44 | 45 | #定义主进程 46 | function main { 47 | 48 | #获取实例列表 49 | local instance_json=$(oci compute instance list -c $compartmentId --config-file $CONFIG_FILE) 50 | 51 | #获取实例数量 52 | local NUM_INSTANCE=$(echo $instance_json | jq -r '.data|length') 53 | 54 | for (( i = 0 ; i < $NUM_INSTANCE ; i++ )) 55 | do 56 | echo -e '=========================seq '$i' start=========================' 57 | 58 | #实例ID 59 | local instance_id=$(echo $instance_json | jq -r '.[]['${i}'].id') 60 | #实例电源状态 61 | local power=$(echo $instance_json | jq -r '.[]['${i}']."lifecycle-state"') 62 | 63 | if [ $power == "RUNNING" ] 64 | then 65 | #获取公共ip地址 66 | local public_ip=$(oci compute instance list-vnics --instance-id $instance_id --config-file $CONFIG_FILE | jq -r '.[][]."public-ip"') 67 | 68 | echo -e "1. checking ip "$public_ip 69 | 70 | #检测ip地址连通性 71 | ping -c $PINGTIMES $public_ip > temp.$public_ip.txt 2>&1 72 | grep "$CHECK_PING" temp.$public_ip.txt 73 | if [ $? != 0 ] 74 | then 75 | #ip地址通畅 76 | echo -e "2. this IP is alive, nothing happened" 77 | else 78 | #ip地址阻塞 79 | echo -e "2. this IP is dead, process start" 80 | 81 | #获取公共ip ID 82 | local json=$(oci network public-ip get --public-ip-address $public_ip --config-file $CONFIG_FILE) 83 | local publicipId=$(echo $json | jq -r '.data.id') 84 | #获取私有ip ID 85 | local privateipId=$(echo $json | jq -r '.data."private-ip-id"') 86 | 87 | #删除原公共ip 88 | oci network public-ip delete --public-ip-id $publicipId --force --config-file $CONFIG_FILE 89 | #新建公共ip 90 | oci network public-ip create -c $compartmentId --private-ip-id $privateipId --lifetime EPHEMERAL --config-file $CONFIG_FILE 91 | 92 | #发送通知 93 | if [ $NOTIFICATION = 1 ] 94 | then 95 | text="IP地址已更换" 96 | desp="您的orcale服务器IP:${ipaddress}无法访问已更换。" 97 | notification "${text}" "${desp}" 98 | fi 99 | fi 100 | rm -rf temp.$public_ip.txt 101 | fi 102 | done 103 | } 104 | 105 | #定义函数发送serverChan通知 106 | function notification { 107 | local json=$(curl -s https://sc.ftqq.com/$SERVERCHAN_KEY.send --data-urlencode "text=$1" --data-urlencode "desp=$2") 108 | errno=$(echo $json | jq .errno) 109 | errmsg=$(echo $json | jq .errmsg) 110 | if [ $errno = 0 ] 111 | then 112 | echo -e 'notice send success' 113 | else 114 | echo -e 'notice send faild' 115 | echo -e "the error message is ${errmsg}" 116 | fi 117 | } 118 | 119 | main 120 | 121 | echo -e '*****************************************************************' 122 | echo -e '****************************** END ******************************' 123 | echo -e '*****************************************************************' 124 | 125 | exit 0 126 | --------------------------------------------------------------------------------