匹配文件中的邮箱地址

grep -Eiorh '([[:alnum:]_.-]+@[[:alnum:]_.-]+?.[[:alpha:].]{2,6})' [filename]  | sort | uniq

正则表达式语法参考链接

使用sed获取proxy中的ip和port

proxy样本的链接地址

这里的proxy很好,但问题是list中proxy的字段顺序并不是每一行都是一致的,这样的话正则表达式不是很好写

# 样本

{"type": "https", "host": "180.210.201.57", "export_address": ["180.210.201.57"], "response_time": 11.28, "country": "SG", "anonymity": "high_anonymous", "from": "proxylist", "port": 3130}

{"country": "US", "anonymity": "high_anonymous", "export_address": ["12.162.8.175"], "host": "12.162.8.175", "response_time": 6.42, "type": "https", "port": 80, "from": "txt"}

# sed命令
# 正则匹配的$1/$2/$3/$4,自由$2和$3是我们需要的
sed -r 's/(\{.*"host":\s")([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})".*"port":\s([0-9]{2,5})(.*\})/\2:\3/g'



# grep命令
# @TODO 需要进一步完善
grep -o  -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

网站添加文章基本都是由Markdown写成的,但是由于网站针对内容的排版有专门的定制,而markdown转换以后的html中有很多我不需要的东西,因此就需要将这部分不需要的东西清理掉。

不需要的html元素

  • 去除头尾的 artile 标签
  • a链接元素
  • 元素的Class、ID、Title等属性

正则替换



# 替换所有 a 链接标签 正则 <a\s.*?</a> # 替换所有ID / Class / Title属性 \s{0,1}(class|id|title)=".*?"

关于table 表格 转 html代码清洁化的问题

很多具有标准化产品的公司,产品信息很多时候都是存储在MS Excel表格之中,而当这些公司需要建站时,就需要将这些Excel的产品信息转化为单个网页页面放到网站上。很多人Dirty的做法是将Excel表格打开,然后将数据表格截图,以图片的方式上传到网站上。是的,很省事,但是搜索引擎是无法直接快速而准确的识别图片的内容的,对营销推广的工作不利。再者,如果客户对你的产品感兴趣,就不的不去手动打出来你产品的某个型号参数等信息,这样也给客户增加了麻烦。所以将MS Excel转HTML代码是必须要做的工作,不可图懒省事。那么问题来了,怎么做这件事?

其实转出来的最好结果是干干净净的HTML,只含有我们需要 table元素的基本标签比如table、thead、tbody、tr、td和包括colspan等基本属性的代码。至于class、id、fonts以及设计表格样式的inline css style完全是多余的,因为这些东西在我们设计网站的时候,已经预定义了。

比较简单的table我们可以用markdown来直接写,就是使用Dreamweaver或是其他可视化的HTML表格编辑工具来手动的敲一个个表格,但是如果一个表格几百行,这种效率显然是无法接受的。网上有很多EXCEL转HTML的网页工具,很多我都已经试过了,都存在各种各样的问题,比如转码之后表格布局改变了,或是误删除了空格表单。或是删不干净,最终还是留下我们很多代码中的脏东西。那么是不是还有其他方法,可以快速而高效的转换把MS EXCEL转 清洁的HTML?

答案是有的。大致的步骤:MS EXCEl 转存 htm格式,然后对 生成的代码进行替换。

这样做当然是有问题的,如果这样直接就能干,我就没有必要写下面的东西了。因为MS生成的htm格式文件的代码实在是太TM脏了,原谅我粗口,我是真的生气。MS不光加了一堆无用的格式信息,还添加了很多自定义的标签和属性,这真的是视W3C的标准不存在,对于这种没有节操又任性的公司,直接放弃,转向另外一种方式。既然魏然不支持W3C标准,那么我们就找支持W3C标准的办公软件,尤其是有表格SpreadSheet功能Office软件。你脑袋一亮,对确实有一家这样的公司,他就是Apache基金会,他除了有Apache这样享誉全球的服务器软件,还有大数据处理的系统工具Spark,当然还有我们今天的主角 Apache OpenOffice。Apache基金会维护了350+大型而健壮的软件项目,而且这一数量还在不断上升,而这些大型的软件绝大部分都是开源的,意味着他们都是免费的。So BIG DISS to MS.

以下是OpenOffice下的调整好的表格基本样式。

OpenOffice表格

直接将编辑好的表格另存为html,然后你就会惊喜的发现生成的代码非常规范和美观。

完全没有乱七八糟的东西,我们只需要删除代码中的frame、rule、border、fonts 信息就可以直接Copy到网站上了。

当然如果你对字体这块没要求的话,不删除就可以直接放到网站上。

# 正则替换 table 标签多余元素
\s{0,1}(frame|rules|border)=".*?"

# 正则替换字体信息
<font.*?>|</font>

最终的结果就是这样

完美撒花。

@TODO 后期考虑专门针对这种情况做一个小软件

工作上我需要建立一个新的adwords账户,由于账户设置的复杂性,我需要使用Google Adwords Editor来设置结构化的广告Campaign,之所以不用adwords的web界面是因为效率太低了。

然而最新版适用于Mac OSX EI Capitan 10.11的Google Adwords Editor 版本是 12.2.3, 如果你碰巧手贱跟我一样更新了他,抱歉你就再也回不去了,因为从12.2.3版本以上就不再支持EI Capitan版本,因此你需要Rollback。如果你回到Google的官网寻找历史版本,不好意思,没有相关的链接指向历史版本的下载地址。我第一次觉得Google如此脑残,历史版本不放出来,因此忍不住就在Google Adwords的Community上开帖吐槽, 最后Google内部的Adwords工程师Igor贴出了12.2.3的下载链接。如果你和我遇到了同样的问题,你可以在这里下载。

Rollback之后,遇到了另一个问题。以下Google Adwords Editor简称GADE。这个版本的GADE不支持Socks代理,仅支持http代理,而我这里的情况是https代理极不稳定,而留给我的选择就只剩下VPN。而目前市场上活着的VPN也是各种不稳定,所以我决定自己搭建VPN,最终了Wireguard解决方案。

远端的服务器环境是Debian 9 Stretch,可以按照官方文档apt-get直接安装。Wireguard主要有wireguard-dkms和wireguards-tools两个组件,而这两个组件依赖linux-header来运作,而安装当前系统内核相配套的linux-header则需要安装GCC6.0以上的版本。如果你的debian的GCC版本为4.0,而apt安装最新的gcc报了一堆依赖‘you have held broken packages.’不满足条件的错误,你需要检查一下你的distribution的具体版本。

# gcc版本4.0并且报依赖错误
# 先检查服务器版本,两个方法
# LSB - Linux Standard Base
lsb_release -da

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:    9.5
Codename:   stretch

# 或是读取etc目录下的系统版本os-release配置文件

cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/


# 这里出现依赖错误的原因是,我在更新vps的时候,误将jessie更新到了stretch,而source.list.d依然使用的是jessie版本的配置文件,自然依赖就报错了。
# 在更新了source.list和source.list.d的配置,update之后,依赖的问题解决。

# 这里贴一下stretch的Debian Official Reposity,以便以后使用
deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free

deb http://deb.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://deb.debian.org/debian-security/ stretch/updates main contrib non-free

deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free

# wireguards 是基于Linux内核的,所以依赖于linux-kernel-header 和 kernel模块。
# header 模块的正常编译和加载并不一定要求header版本和kernel版本一致,但是如果kernel header版本太老,
# 一些新的kernel header的特性就无法在编译是被应用
# 这里,我们建议将linux-kernel-header 是跟当前系统内核版本保持一致,这样就会少出问题
# 注意 uname -a 检查的只是内核的版本
# uname -r 返回结果含有内核的版本号和发行版的版本号
# 由于Linode vps的特殊性,在安装完新的kernel和header之后,你需要检查vps的profile是否是grub2引导方式
# 如果不是,需要在console页面修改,修改完之后需要在terminal界面运行 update-grub 命令来进行更新引导加载

# 安装linux header
# Debian 默认的kernel header安装目录为/usr/src

apt install linux-headers-$(uname -r)


# 安装 wireguard
apt-get install wireguard

# 注意安装和配置wireguard需要root权限

...
wireguard:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.9.0-3-amd64/updates/dkms/

depmod...

DKMS: install completed.

# wireguard 安装时,会根据当前的header来编译内核模块
# depmod -> 生成模块
# 编译后的内核模块位置为 /lib/modules/4.9.0-3-amd64/updates/dkms/wireguard.ko

# 检查wireguard模块是否被安装
dkms status

# 检查wireguard内核模块是否加载
# 如果没有返回任何结果,则表示模块没有被自动加载,那么wireguard就无法正常运行
lsmod | grep wireguard

# 加载激活 wireguard 内核模块
modprobe wireguard


# 配置 wireguard

# Wireguard是双向对等的VPN,这里为了方便理解,我就称公网服务器为服务端,自己的电脑为客户端

# 生成服务端公钥和私钥
# 分别会在当前目录生成 publickey 和 privatekey 文件
wg genkey | tee privatekey | wg pubkey > publickey

# 注意: 如果你不小心多次生成了密钥,而不是到当前服务端或是客户端使用的到底是哪个密钥,可以通过先启动 wireguard 服务, 使用 wg showconf 命令来打印 密钥的相关信息

# 配置/etc/wireguard/wg0.conf 文件

touch wg0.conf
vi wg0.conf


----------------------------------------------------------
[Interface]
# 服务端在VPN内网IP地址
Address = 192.168.9.1/24
# 如果动态添加客户端或是peer的信息,这里会自动保存
SaveConfig = true
# 添加流量转发的防火墙规则,如wireguard激活则转发生效,不激活则删除规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 服务端监听节点
ListenPort = (端口号)
# 服务端私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[Peer]
# 客户端的公钥,针对我的情况,就是Mac主机上生成的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端接入时,客户端在VPN内网的IP地址
AllowedIPs = 192.168.9.101/24
----------------------------------------------------------

# 更方便的方法是,不将客户端的信息写在配置文件中,采用命令的方式添加客户端信息
# 在公网服务器运行一下命令
# 由于我们设置了SaveConfig = true,因此一下命令运行后,peer信息会自动添加到wg0.conf中
wg set wg0 peer [客户端公钥] allowed-ips 192.168.9.101/24



# 激活 wireguard 服务

wg-quick up wg0


# 如果出现错误提示 resolvconf: command not found
# 则说明 resolvconf 没有安装,直接apt安装即可
# 之后重新运行命令即可激活wireguard服务,成功运行提如下
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 192.168.9.1/24 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] resolvconf -a tun.wg0 -m 0 -x

# 使用 ifconfig 命令查看wireguard的wg0网卡状态,确认一切正常

ifconfig

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 192.168.9.1  netmask 255.255.255.0  destination 192.168.9.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 为避免由于服务器启动而造成wireguard终端,可以将wireguard添加为系统启动项
systemctl enable wg-quick@wg0

> Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

# 从系统控制台启动wireguard的命令为

systemctl start wg-quick@wg0

> wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
>   Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
>   Active: active (exited) since ......


# 客户端安装 #
# 我的环境是 Mac,其他环境请参照官方文档 #

brew install wireguard-tools

# 配置wireguard客户端 #


# 新建配置文件

sudo mkdir /etc/wireguard && cd /etc/wireguard
sudo touch wg-mac.conf
sudo vi wg-mac.conf

----------------------------------------------------------
[Interface]
# 客户端生成的私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端在VPN内网的地址
Address = 192.168.9.101/24
DNS = 8.8.8.8

[Peer]
# 服务端的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 服务端的域名:端口或是IP:端口
Endpoint = domain.com:10311
AllowedIPs = 0.0.0.0/0
----------------------------------------------------------

# 在Mac上启动wireguard客户端和运行服务端一样,同样使用wg-quick命令
# 其中 up 后面跟的参数就是刚刚的配置文件名去掉conf后缀
sudo wg-quick up wg-mac

> Warning: `/private/etc/wireguard/wg-mac.conf' is world accessible
> [#] wireguard-go utun
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> W                                                     G
> W   This is alpha software. It will very likely not   G
> W   do what it is supposed to do, and things may go   G
> W   horribly wrong. You have been warned. Proceed     G
> W   at your own risk.                                 G
> W                                                     G
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> INFO: (utun0) 2018/09/05 17:02:36 Starting wireguard-go version 0.0.20180613
> [+] Interface for wg-mac is utun0
> [#] wg setconf utun0 /dev/fd/63
> [#] ifconfig utun0 inet 192.168.9.101/24 192.168.9.101 alias
> [#] ifconfig utun0 up
> [#] route -q -n add -inet 0.0.0.0/1 -interface utun0
> [#] route -q -n add -inet 128.0.0.0/1 -interface utun0
> [#] route -q -n add -inet xxx.xxx.xxx.xxx -gateway 192.168.1.1
> [#] networksetup -getdnsservers Bluetooth PAN
> [#] networksetup -getdnsservers Wi-Fi
> [#] networksetup -getdnsservers Thunderbolt Bridge
> [#] networksetup -setdnsservers Thunderbolt Bridge 8.8.8.8
> [#] networksetup -setdnsservers Wi-Fi 8.8.8.8
> [#] networksetup -setdnsservers Bluetooth PAN 8.8.8.8
> [+] Backgrounding route monitor

# 关闭Wireguard
sudo wg-quick down wg-mac

# 测试链接是否正常可以使用ping
ping 192.168.9.1

# 或是通过监控流量方式来测试
 ifstat -i utun0

 > utun0
 > KB/s in  KB/s out
 >   0.00      0.14
 >   0.44      0.13
 >   0.00      0.04
 >   0.00      0.05
 >   0.00      0.04
 >   0.00      0.04
 >   0.04      0.00
 >   0.00      0.00
 >   0.00      6.70
 >   5.73      0.61
 >   5.24      0.74
 >   0.89      1.38


免费的wireguard线路

mosh因为G/F/W被封之后的 ssh 连接服务器的解决办法


ssh -o ProxyCommand='nc -x 127.0.0.1:7081 %h %p' user@domain.com # 本地shell客户端的˙配置 # keepalive or autossh? 需要进一步测试 # 客户端针对不同主机的设置 # 针对断线的问题 # 每30秒向服务器发送在线状态提示 ServerAliveInterval 30 # 一次连续的在线状态提示发送次数,240次X30秒=7200秒=2小时 ServerAliveCountMax 240

关于netcat配合socks proxy连ssh的相关信息可以(参照链接)[https://ieevee.com/tech/2017/10/19/ssh-over-socks5.html]

关于发现rpcbind运行在底层并监听大量端口的情况

了解到当用户使用NFS系统来共享文件时,Debian发行版会默认的运行rpcbind和rpc.statd两个服务。而这不是我们所需要的,而开启的端口会降低服务器的安全性,因此需要将rpcbind服务关闭。

这里需要注意的是,rpcbind由systemctl来管理,而不是我们常用的service命令。

systemctl stop rpcbind.service
systemctl disable rpcbind.service