BlueXIII's Blog

热爱技术,持续学习

替换

1
2
3
4
5
6
7
替换brew.git:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

替换homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

重置

1
2
3
4
5
6
7
重置brew.git:
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git

重置homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core.git

ss+curl方式

export ALL_PROXY=socks5://127.0.0.1:1086

Oracle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
# ##################################################################
# Oracle定时Expdp脚本
# SQL> CREATE DIRECTORY backup as '/home/oracle/dump';
# SQL> grant read,write on directory backup to SYSTEM;
# crontab -e
# 30 00 * * * . $HOME/.bash_profile; cd /home/oracle/sh; ./bak_exp.sh
# ##################################################################

# 环境变量
USERNAME=system
PASSWORD=yourpass
SID=orcl
SCHEMA=yoursid
DUMP_DIR=/home/oracle/dump
DIRECTORY=BAKDIR
PARALLEL=1
DMP_FILE=BAK_`date +%Y%m%d%H%M%S`.dmp
LOG_FILE=BAK_`date +%Y%m%d%H%M%S`.log

# expdp导出
expdp $USERNAME@$SID/$PASSWORD schemas=$SCHEMA DIRECTORY=$DIRECTORY DUMPFILE=$DMP_FILE logfile=$LOG_FILE parallel=$PARALLEL;

# 压缩dmp
cd $DUMP_DIR
gzip $DMP_FILE

# 删除旧的dmp
find $backup_dir -name "*.dmp" -mtime +1 -exec rm {} \;

MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# ##################################################################
# MySQL定时备份
# crontab -e
# 30 01 * * * . $HOME/.bash_profile; cd /home/youruser/mysqlbak/sh; ./bak_mysql.sh
# ##################################################################

# 环境变量
USERNAME=root
PASSWORD=yourpass
DATABASE=yourdb
BASE_DIR=/home/youruser/mysqlbak
DUMP_FILE=$BASE_DIR/BAK_`date +%Y%m%d%H%M%S`.sql

# 备份
cd $BASE_DIR
mysqldump -u$USERNAME -p$PASSWORD $DATABASE > $DUMP_FILE

# 压缩dmp
gzip $DUMP_FILE

# 删除旧的dmp
find $BASE_DIR -name "*.sql.gz" -mtime +7 -exec rm {} \;

InfluxDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# ##################################################################
# InfluxDB定时备份
# crontab -e
# 30 00 * * * . $HOME/.bash_profile; cd /home/youruser/influxbak/sh; ./bak_influx.sh
# ##################################################################

# 环境变量
DATABASE=yourdb
BASE_DIR=/home/youruser/influxbak
DUMP_DIR=$BASE_DIR/BAK_`date +%Y%m%d%H%M%S`

# 备份
mkdir $DUMP_DIR
influxd backup -portable -database $DATABASE $DUMP_DIR

# 删除旧的dmp
cd $BASE_DIR
find $BASE_DIR -type d -name "BAK_*" -mtime +7 -exec rm -rf {} \;

添加组和用户

1
2
3
4
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
passwd oracle

下载安装介质

下载并解压到/home/oracle/database

修改hosts

1
2
/etc/hosts
172.172.172.97 wfzj97

关闭selinux

1
2
3
4
5
vi /etc/selinux/config
SELINUX=disabled

setenforce 0
getenforce

关闭firewalld

1
2
systemctl stop firewalld
systemctl disable firewalld

修改内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 1073741824
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

sysctl -p

修改/etc/security/limits.conf

1
2
3
4
5
oracle           soft    nproc           2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240

修改/etc/pam.d/login文件

1
2
session  required   /lib64/security/pam_limits.so
session required pam_limits.so

修改/etc/profile

1
2
3
4
5
6
7
8
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

创建安装目录

1
2
3
4
5
6
mkdir -p /app/oracle/product/11.2.0
mkdir /app/oracle/oradata
mkdir /app/oracle/inventory
mkdir /app/oracle/fast_recovery_area
chown -R oracle:oinstall /app/oracle
chmod -R 775 /app/oracle

安装依赖

1
yum -y install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static elfutils-libelf-devel ksh libaio libaio-devel numactl-devel sysstat unixODBC unixODBC-devel pcre-devel

设置Oracle用户环境变量

1
2
3
4
5
6
7
8
9
su - oracle
vim .bash_profile

添加:
ORACLE_BASE=/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0
ORACLE_SID=orcl
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

编辑静默安装响应文件

1
2
3
4
5
6
7
8
9
10
11
12
13
vi /home/oracle/database/response/db_install.rsp

oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=gongxm
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/app/oracle/inventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/app/oracle/product/11.2.0
ORACLE_BASE=/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
DECLINE_SECURITY_UPDATES=true

静默安装oracle

1
./runInstaller -silent -ignorePrereq -ignoreSysPrereqs -responseFile /home/oracle/database/response/db_install.rsp

执行root用户脚本

切回root

1
2
sh /app/oracle/inventory/orainstRoot.sh
sh /app/oracle/product/11.2.0/root.sh

配置监听

su - oracle
netca -silent -responseFile /home/oracle/database/response/netca.rsp

修改dbca静默安装配置

1
2
3
4
5
6
7
8
9
10
11
12
vi /home/oracle/database/response/dbca.rsp

GDBNAME = "orcl"
SID = "orcl"
SYSPASSWORD = "oracle"
SYSTEMPASSWORD = "oracle"
SYSMANPASSWORD = "oracle"
DBSNMPPASSWORD = "oracle"
DATAFILEDESTINATION =/app/oracle/oradata
RECOVERYAREADESTINATION=/app/oracle/fast_recovery_area
CHARACTERSET = "ZHS16GBK"
TOTALMEMORY = "1638"

静默配置dbca

1
dbca -silent -responseFile /home/oracle/database/response/dbca.rsp

安装完成检查

lsnrctl status
sqlplus / as sysdba

编辑init.d脚本

vi /etc/init.d/dbora

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#! /bin/sh -x
#
# chkconfig: 2345 80 05
# description: start and stop Oracle Database Enterprise Edition on Oracle Linux 5 and 6
#

# In /etc/oratab, change the autostart field from N to Y for any
# databases that you want autostarted.
#
# Create this file as /etc/init.d/dbora and execute:
# chmod 750 /etc/init.d/dbora
# chkconfig --add dbora
# chkconfig dbora on

# Note: Change the value of ORACLE_HOME to specify the correct Oracle home
# directory for your installation.
# ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
ORACLE_HOME=/app/oracle/product/11.2.0

#
# Note: Change the value of ORACLE to the login name of the oracle owner
ORACLE=oracle

PATH=${PATH}:$ORACLE_HOME/bin
HOST=`hostname`
PLATFORM=`uname`
export ORACLE_HOME PATH

case $1 in
'start')
echo -n $"Starting Oracle: "
su $ORACLE -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME" &
;;
'stop')
echo -n $"Shutting down Oracle: "
su $ORACLE -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME" &
;;
'restart')
echo -n $"Shutting down Oracle: "
su $ORACLE -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME" &
sleep 5
echo -n $"Starting Oracle: "
su $ORACLE -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME" &
;;
*)
echo "usage: $0 {start|stop|restart}"
exit
;;
esac

exit

赋权及加入自启

1
2
3
chmod 750 /etc/init.d/dbora
sudo chkconfig --add oracledb
chkconfig dbora on

编辑oratab

vi /etc/oratab

1
orcl:/app/oracle/product/11.2.0:Y

N改为Y

服务启停

1
2
service dbora start
service dbora stop

netcat的正确打开方式

简介

nc(netcat)是一个能通过TCP和UDP读写数据的工具,很多Linux发行版已经预装。最近发现了关于nc的很多有趣的应用场景,果然名副其实,很是牛叉。。。于是简单梳理了一下。

参数说明

  • -g <网关> 设置路由器跃程通信网关,最丢哦可设置8个。
  • -G <指向器数目> 设置来源路由指向器,其数值为4的倍数。
  • -h 在线帮助。
  • -i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
  • -l 使用监听模式,管控传入的资料。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
  • -p <通信端口> 设置本地主机使用的通信端口。
  • -r 乱数指定本地与远端主机的通信端口。
  • -s <来源位址> 设置本地主机送出数据包的IP地址。
  • -u 使用UDP传输协议。
  • -v 显示指令执行过程。
  • -w <超时秒数> 设置等待连线的时间。
  • -z 使用0输入/输出模式,只在扫描通信端口时使用。

使用场景

测试端口连通性

使用nc -z可以测试远程主机端口的连通性。
以前我们测试某台远程主机的某个端口是否能连通,通常都是用telnet ip port,现在可以用nc来替代了。

示例:

1
2
nc -z 192.168.1.60 19011
Connection to 192.168.1.60 port 19011 [tcp/*] succeeded!

端口扫描

使用-z参数时,还可以指定一个端口范围进行扫描。
以后简单场景下,就不需要动用nmap这种专业工具了。

示例:

1
2
3
4
5
TCP:
nc -z -v 192.168.1.60 19000-19100 2>&1 | grep succeeded

UDP:
nc -z -v -u 192.168.1.60 19000-19100 2>&1 | grep succeeded

启监听端口

很多时候,如果拜托网管为我们做一个NAT映射,或新配置了一个防火墙策略后,通常要启一个临时的tomcat/apache/nginx行测试,非常麻烦。
如果只是临时测试的话,直接使用nc -l 端口号就可以启一个监听了,如果早点知道的话就可以省去很多时间了。

示例:

1
nc -l 33333

HTTP服务健康监控

nc配合echo来使用,可以模拟发送一段HTTP请求报文,对一个HTTP服务进行健康度检测。
如果服务支持HEAD方法的话,可以尽量使用HEAD以减轻测试时对服务端的压力。
于是简单场景下,我们又可以抛弃wgetcurl了。。。

示例:

1
2
echo -e "GET /mobsale-service/health HTTP/1.0\r\n\r\n" |nc -t 192.168.1.60 19011
echo -e "HEAD /mobsale-service/client HTTP/1.0\r\n\r\n" |nc -t 192.168.1.60 19011

文件传输

通常,我们在两台服务器之前传递文件,首选都是sftp/scp,或者ftp,或者更古老的sz/rz
但如果这些方式都被禁用的话怎么办呢?可以用nc来自己铺路,只要能连网,就能传文件!

示例:

1
2
3
4
5
传递方:
cat readme.txt | nc -l 33333

收接方:
nc 192.168.1.61 33333 > readme.txt

如果要传递目录的话,需要配合tar/zip等工具进行打包。

聊天工具

还可以使用nc来进行单方向聊天,这貌似是一个然并卵的东西。。。
和文件传输的原理其实是一样的。

示例:

1
2
3
4
5
接收方:
nc -l 33333

发送方:
nc 192.168.1.61 33333

发送发输入内容回车之后,接收方就会显示了

简易WEB服务器

不借助tomcat/nginx/httpd等WEB容器,仅用nc就可以用快速搭建一个单页面的WEB服务器。

首先新建一个index.html文件:

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test Page</title>
</head>
<body>
<h1>It Works!</h1>
</body>
</html>

执行以下脚本,将一个简单的HEAD与index.html中的BODY拼接并输出:

1
while true;do { printf '%b\r\n' 'HTTP/1.1 200 OK' '%b\r\n';cat index.html; }|nc -l 33333;done

在浏览器上输入http://192.0.2.1:8080/whatever 就可以看到刚才的页面了

远程桌面

设想如下场景:
如果某台远程主机禁用了某用户(例如root)的SSH远程登录权限,只能通过低权限的管理用户登录,再用su -的方式切换过去进行操作。如果觉得不爽,有没有可能绕过这个限制呢?
使用nc就可以在远程新开一个任意监听端口,然后在本地就可以模拟SSH登录了,可以说是命令行版的”远程桌面”吧。

原理如下:

  1. 从网络收到命令写入fifo文件中
  2. cat命令读取fifo文件,并且发送到bash命令
  3. bash执行完的结果发送给nc
  4. nc通过网络把内容发送给客户端
1
2
3
4
5
远程:  
mkfifo /tmp/tmp_fifo; cat /tmp/tmp_fifo | /bin/bash -i 2>&1 | nc -l 33333 > /tmp/tmp_fifo

本地:
nc -n 192.168.1.60 33333

四层反向代理

与上面的”模拟SSH登录”原理类似,nc的另一个场景是可以充当一个4层的反向代理,这个比较实用了,LVS/HA/Nginx统统都可以下岗了。。。

示例:

1
mkfifo backpipe; nc -l 33333  0<backpipe | nc 192.168.1.60 19011 1>backpipe

后记

大体先写这么多了,以后的使用过程中如果还有新的发现,随时补充。

spring-boot中使用slf4j+log4j

背景

spring-boot默认是使用slf4j+logback做日志输出的, 本文主要演示如何切换为slf4j+log4j。
正常情况下,建议直接使用logback。

在某SpringBoot项目中,因为要使用ELK做日志采集,局方要求使用log4j并给出了一组日志格式规范:

  1. 日志分为xxx-info和xxx-error两个文件,分开打印
  2. 日志格式要求为
1
%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n

所以只能有两种方案可供选择:

  1. 配置logback,并保证与之前的log4j的行为一致
  2. 将logback切换为log4j

由于面对日志格式中的一大堆%比较头大,于是选择了不怎么优雅的方案2,切换为log4j。

配置Maven依赖

首先要显式的引入spring-boot-starter,并将其中的spring-boot-starter-logging排除掉
然后新增一个spring-boot-starter-log4j的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>

配置log4j

新建src/resource/log4j.properties,按正常方式配置即可
下面是一个双日志输出的样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
log4j.rootCategory=info,file_info,file_error,stdout
log4j.logger.org.springframework.web.filter.CommonsRequestLoggingFilter=debug,file_info,stdout
log4j.additivity.org.springframework.web.filter.CommonsRequestLoggingFilter=false

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.appender.file_info=org.apache.log4j.RollingFileAppender
log4j.appender.file_info.layout=org.apache.log4j.PatternLayout
log4j.appender.file_info.MaxFileSize=100MB
log4j.appender.file_info.MaxBackupIndex=10
log4j.appender.file_info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
log4j.appender.file_info.Threshold=DEBUG
log4j.appender.file_info.append=true
log4j.appender.file_info.File=/opt/logs/busi/crm_sdtools-info.log

log4j.appender.file_error=org.apache.log4j.RollingFileAppender
log4j.appender.file_error.layout=org.apache.log4j.PatternLayout
log4j.appender.file_error.MaxFileSize=100MB
log4j.appender.file_error.MaxBackupIndex=10
log4j.appender.file_error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
log4j.appender.file_error.Threshold=ERROR
log4j.appender.file_error.append=true
log4j.appender.file_error.File=/opt/logs/busi/crm_sdtools-error.log

系统设置工具

raspi-config

设置root密码

sudo passwd root

修复ping权限

ls -lsa /bin/ping
sudo chmod 4711 /bin/ping

网络设置

vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.248.0
gateway xxx.xxx.xxx.xxx
dns-nameservers xxx.xxx.xxx.xxx

启动网卡

sudo ifup eth0
sudo /etc/init.d/networking restart

代理设置

sudo vi /etc/environment
export http_proxy=”http://134.32.87.142:1080
export http_proxy=”http://134.32.32.13:31315

export http_proxy=”http://134.32.32.13:31081

sudo vi /etc/apt/apt.conf.d/10proxy
Acquire::http::Proxy “http://134.32.87.142:8080/“;
Acquire::http::Proxy “http://134.32.32.13:31315/“;

apt-get使用阿里云镜像

sudo vi /etc/apt/sources.list
deb http://mirrors.aliyun.com/raspbian/raspbian/ wheezy main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ wheezy main non-free contrib

redsocks透明代理网关

开启IPV4转发:
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.conf

源码编译Redsocks:
sudo apt install libevent-dev
make

redsocks配置文件:
sudo vi /etc/redsocks.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
base {
log_debug = off;
log_info = on;
log = "file:/home/pi/redsocks/logs/redsocks.log";
daemon = off;
redirector = iptables;
}
redsocks {
local_ip = xxx.xxx.xxx.xxx;
local_port = 3128;
ip = xxx.xxx.xxx.xxx;
port = 31080;
type = socks5;
}

iptables配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -N REDSOCKS

iptables -t nat -A REDSOCKS -d 127.0.0.1 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 172.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 132.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 134.0.0.0/8 -j RETURN

iptables -t nat -A SS -p tcp -j REDIRECT --to-port 3128

iptables -t nat -A PREROUTING -p tcp -j SS
iptables -t nat -A OUTPUT -p tcp -j SS

dnsmasq架设DNS服务器

sudo apt install dnsmasq

shadowsocks

apt-get install python-pip
pip install shadowsocks

nginx配置端口

sudo vi /etc/nginx/sites-available/default
listen 30080;

设置时间

sudo raspi-config
ntpd -q -g
sudo date -s “2016-11-8 14:20:00”

0%