本来是没有这种问题的,但是自从macOS升级到Sierra 10.12以后ssh-agent
不会自动加载密码短语了,每次重启后ssh登机器时总是提示输入密钥的密码短语,所以每次开机都要用ssh-add -K ~/.ssh/id_rsa
将它手动添加到钥匙串中才行。
后来在GitHub找到了解决方案,其实就是简单配置了一下~/.ssh/config
:
1 | Host * |
用IdentityFile
指定要自动添加的密钥即可。
本来是没有这种问题的,但是自从macOS升级到Sierra 10.12以后ssh-agent
不会自动加载密码短语了,每次重启后ssh登机器时总是提示输入密钥的密码短语,所以每次开机都要用ssh-add -K ~/.ssh/id_rsa
将它手动添加到钥匙串中才行。
后来在GitHub找到了解决方案,其实就是简单配置了一下~/.ssh/config
:
1 | Host * |
用IdentityFile
指定要自动添加的密钥即可。
舰队Collection之前出了Android版,最开始需要预约抽签才能登录,2016年8月份开始全体提督都可以玩了。Android版有一个好处就是(除首次登录外)无需代理即可随时随地肝船了。
先到DMM App Store下载安装包,安装完毕打开任意代理(只要不是中国大陆的地址就行)后打开游戏中心,点右上角游戏按钮登录:
登录后选择艦隊これくしょん -艦これ-并下载:
下载完了直接安装就行了,此时就不需要代理了,然后直接启动:
此时按ミュージックスタート就进入游戏了,游戏本身和网页版大同小异:
终端是每天要用到的工具,所以一定要配置成自己顺手的,才能发挥更高的效率。iTerm2+zsh+vim是我目前用过的感觉最强大的配置方案了。
iTerm2是默认终端的终极替代方案,个性化、热键等方面表现非常出色,兼容性也非常好。
直接到其官网下载安装即可。
对于终端里的特殊字符可能有的无法显示,要安装powerline
字体:
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts && ./install.sh
然后在Preferences - Profiles - Text - Font里选择powerline字体就可以了。
zsh在命令补全等很多方面上比bash智能很多,首先切换到zsh:
chsh -s /bin/zsh
oh-my-zsh是一个管理zsh配置的框架,包含各种插件和主题,可用以下脚本安装:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
安装完成后编辑~/.zshrc
,可以编辑ZSH_THEME
修改主题,或者编辑plugins
增加插件,对应的文件分别在~/.oh-my-zsh/themes
和~/.oh-my-zsh/plugins
下。
spf13-vim是vim的终极配置之一,用以下脚本安装:
curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh
配色文件在~/.vim/bundle/vim-colorschemes/colors
下,指定名称修改配色:
echo colorscheme $colorscheme_name >> ~/.vimrc.local
上(shí)班(xí)的时候写PHP都是在开发机上,所以公司配的电脑上一直就没有搭PHP环境。最近我预料到要写一个Web的项目,所以提前搭一下环境备用。
可以直接通过homebrew安装:
brew install mysql
安装完成后第一次启动MySQL:
brew services start mysql
然后就可以用mysql_secure_installation
初始化设置一下MySQL,包括root密码等等。
开机启动homebrew.mxcl.mysql.plist
已经默认添加到~/Library/LaunchAgents
里了,所以不用再设置了。
同样Nginx也可以通过homebrew安装:
brew install nginx
安装完成后直接用nginx
命令就可以启动。
但是Nginx的开机启动项并没有默认添加,我们可以手动将它添加进去:
cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
macOS默认是安装好PHP的,所以就不想再安装其他版本了。
先编辑/private/etc/php.ini
,如果没有就复制一份php.ini.default
,然后配置一下时区和数据库socket:
1 | date.timezone = "Asia/Shanghai" |
因为我要用噫yii框架,所以改了这一项,如果用到了MySQL的其他函数需要修改相应的mysql.default_socket
或mysqli.default_socket
。
然后编辑/private/etc/php-fpm.conf
,在里面指定一下error_log
的路径:
1 | error_log = /usr/local/var/log/php-fpm/error.log |
然后直接用php-fpm
命令启动即可。
接着去配置一下/usr/local/etc/nginx/nginx.conf
,将php的一段去掉注释,并修改fastcgi_param
:
1 | location ~ \.php$ { |
然后执行nginx -s reload
重新加载配置。
然后也可以配置一下php-fpm的开机启动,直接新建~/Library/LaunchAgents/net.php.php-fpm.plist
文件:
1 |
|
保存后将其权限设为600即可,然后执行启动:
launchctl load ~/Library/LaunchAgents/net.php.php-fpm.plist
如果提示Service is disabled
,上面的命令加上-w
参数再执行就行了。
之前有一个每周数据统计的工作,需要每周的某一天定时从多台服务器上拉取日志进行汇总生成报表。
最初的思路是先做一个循环,遍历每台机器并在上面执行相应的数据处理脚本,然后将处理好的数据拉取到汇总的机器上,这样逐台进行,最后进行汇总处理,写出来的脚本是类似这样的:
1 | array=( \ |
这样写的执行时间大约是每台机器时间*台数+汇总时间,虽然不算快,但是凌晨一般也能执行完成。
后来到了国庆假期期间,服务流量骤增,再加上业务改版等一系列原因,导致数据量突然增大,执行时间翻了几倍,任务大概要到下午才能完成,这样一来就会耽误白天的工作。
因为机器数量不少,分机器统计也是主要的时间消耗,因此想到既然几台机器各自的统计互不影响,可以让它们同时进行汇总工作。于是上网找了一下改进方法,改完了大致是这样的:
1 | array=( \ |
可以发现主要的改动就在for循环的内容用{}
括起来并在末尾加个&
,这样就可以实现多次循环一起执行了;另外在done
后面加个wait
是为了等待所有的循环都执行完成后再做后面的汇总工作,否则一旦有一个循环执行完成就会往下执行了。
这样的执行时间大约是每台机器时间+汇总时间,可以看出比最初快了很多。
公司开发登录堡垒机时需要使用PIN+token的方式进行认证,而且动态密码只能一次使用,因此一次要打开多个终端都要多次等待动态密码的变化才能登录。
所以听从公司同(xué)事(zhǎng)的建议,配置了一下~/.ssh/config
:
1 | Host * |
如果没有这个文件可以新建。其中Host
项是指目标地址;ControlMaster
一项会使一旦有一个连接以后,再次从其他终端连接同一个host也不必再输密码;ControlPersist
一项可以一段时间不再输密码也可以登录。这样配置以后就能实现输一次密码后对于同一host不再输密码即可连接了。
之前上开源课的时候听说可以通过外网访问局域网电脑获取文件,但由于自己家中的宽带一直不给分配公网地址,所以无法直接访问。
后来又听说可以用花生壳之类的DDNS动态解析,即使家中IP总变化也可以通过域名访问。但苦于这样的服务一般是收费的,而且又是使用第三方的服务器容易受制于人,用起来有些不爽,才一直寻找更好的方法。
近日又发现Ngrok这样的神器,可以自己搭建内网穿透服务,只用一台VPS和一个域名就完美地解决了问题。其主要是在客户端与服务端之间建立端到端的隧道进行通信,用固定的域名进行访问以规避了IP变更的不便。
目前Ngrok官网上放出的2.0以上版本是付费的服务,若要自己搭建需要自行编译1.7的源码。首先将源码从GitHub上clone下来:
git clone https://github.com/inconshreveable/ngrok.git
由于该服务是Go语言编写的,所以先要安装golang开发环境:
yum install golang
然后将NGROK_DOMAIN
这个变量赋成要使用的域名后面要用到,例如使用如下域名,相应的也要在域名解析里将shintaku.cc
和*.shintaku.cc
解析到这台VPS的IP上:
NGROK_DOMAIN="shintaku.cc"
使用Ngrok官方服务时,下载的客户端使用的是官方证书。我们自己编译服务端和客户端,使用自己的域名也要生成自签名证书:
cd ngrok
openssl genrsa -out ngrokroot.key 2048
openssl req -x509 -new -nodes -key ngrokroot.key -subj "/CN=$NGROK_DOMAIN" -days 36500 -out ngrokroot.crt
openssl genrsa -out snakeoil.key 2048
openssl req -new -key snakeoil.key -subj "/CN=$NGROK_DOMAIN" -out snakeoil.csr
openssl x509 -req -in snakeoil.csr -days 36500 -CA ngrokroot.crt -CAkey ngrokroot.key -CAcreateserial -out snakeoil.crt
这样就在当前目录下生成了ngrokroot.crt
、ngrokroot.key
、ngrokroot.srl
、snakeoil.crt
、snakeoil.csr
、snakeoil.key
六个文件,将它们复制到相应的目录中:
cp ngrokroot.crt assets/client/tls/
cp snakeoil.crt assets/server/tls/
cp snakeoil.key assets/server/tls/
然后就可以开始编译服务端了:
make release-server
编译好的二进制文件ngrokd
生成在bin目录下。
ngrokd可以在其目录下直接启动,若要想全局使用这个命令可以将其移动到设了环境变量的目录下:
cp ./bin/ngrokd /usr/sbin/
可以先ngrokd -h
看一下使用说明,然后就可以通过如下命令启动服务端了:
ngrokd -domain="shintaku.cc" -httpAddr=":80" -httpsAddr=":443"
启动要像上面一样加参数指定域名和端口。由于这台VPS我没有搭建Web服务,所以80和443端口没有占用,当然默认也是使用这两个端口的,这样在浏览器访问地址时也省得指定非80端口的麻烦了。出现如下信息就说明启动成功了:
[16:58:26 CST 2016/09/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[16:58:26 CST 2016/09/01] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[16:58:26 CST 2016/09/01] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[16:58:26 CST 2016/09/01] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[16:58:26 CST 2016/09/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
另外4443端口用于监听客户端,如有必要也可修改。
客户端的编译和服务端类似,但要使用与服务端相同的文件。可以先在本机安装golang环境,再将VPS上的源码拷贝到本机直接用make release-client
编译;也可以在VPS上加参数编译其他环境的客户端:
GOOS=darwin GOARCH=amd64 make release-client
GOOS=windows GOARCH=amd64 make release-client
由于OpenWrt上没有对应的Go环境,所以没法用ngrok源码直接编译OpenWrt的客户端。但是dosgo大神写了一个C语言版本的ngrok-c,文档中也附带了编译方法。但是编译过程比较复杂,而且自己编译出来的二进制文件体积也不小,比较占空间,所以就在恩山上搜了一个民间高手编译好的装上了,顺带着LuCI界面放到服务器上:
wget https://www.shintaku.cc/files/ngrokc_ba56781152-1_ar71xx.ipk
wget https://www.shintaku.cc/files/luci-app-ngrokc_git-15.290.16504-8c2fd44-1_all.ipk
如果安装时遇到问题请确定路由器上是否已经安装了必要的库:
opkg install libstdcpp
opkg install libopenssl
先创建配置文件~/.ngrok
并编辑,写入自己的域名和监听端口:
1 | server_addr: "shintaku.cc:4443" |
可以先用ngrok -h
查看使用说明,然后指定二级域名和要映射的端口启动客户端:
ngrok -subdomain test 4000
就会出现Ngrok的连接状态:
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.shintaku.cc -> 127.0.0.1:4000
Forwarding https://test.shintaku.cc -> 127.0.0.1:4000
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
然后再访问test.shintaku.cc
就会发现和localhost:4000
的内容是一样的,就说明Ngrok连接成功了:
也可以通过localhost:4040
的Web页面查看连接状态:
如果要同时穿透多个端口也可以将它们都写在配置文件里:
1 | server_addr: "shintaku.cc:4443" |
然后启动时加上要启动的tunnel名就可以了:
ngrok start test ssh
路由器上装好了以后可以在服务
-Ngrok Settings
下设置:
除了HTTP协议以外,也可映射TCP其他端口,例如ssh的22端口映射到远程的8022端口:
这时ssh [email protected] -p 8022
和ssh [email protected]
的效果是一样的,意味着即使在外面也可以访问没有公网地址的路由器了。更进一步,如果给路由器下连接的设备都分配了固定的局域网IP地址,将它们的端口映射到Ngrok服务器的端口,外网同样可以访问,这样就可以做很多事情了。
每次登录服务器都会提示:
There were xxxx failed login attempts since the last successful login.
就知道总有闲人在扫IP试密码。再看一下/var/log/secure
就能知道这些失败登录的详情:
1 | Aug 26 05:45:58 sgp1 sshd[4999]: Failed password for invalid user test from 128.199.92.158 port 38416 ssh2 |
所以我决定用DenyHosts屏蔽这些地址。DenyHosts是一个可以帮助阻止ssh攻击的脚本,它会分析/var/log/secure
并记录多次失败登录的IP到/etc/hosts.deny
中。
编辑/etc/hosts.allow
,将自己常用的IP加进去:
1 | sshd: 202.113.*.*: allow |
比如学校用的天津南开教育网,就把上面的IP段加进去,防止哪天自己手残输错几次密码IP被禁登不进去了。
yum install denyhosts
安装完成后编辑/etc/denyhosts.conf
文件:
1 | SECURE_LOG = /var/log/secure |
其中几个数字可以根据自己的需求修改,文件路径一般都不需要修改。另外还可以设置管理员邮箱ADMIN_EMAIL
,默认是root@localhost
,会把通知邮件发到/var/spool/mail
下;也可以加上自己的其他邮箱。
保存好配置文件后可以启动DenyHosts并加入到开机启动了:
systemctl start denyhosts
systemctl enable denyhosts
然后tail -f /etc/hosts.deny
看一下禁用列表的动态,如果有:
1 | # DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 87.106.142.246 |
这样的内容出现就说明DenyHosts已经把之前记录里的可疑IP写进来了。我也把自己服务器上的hosts.deny放出来供大家(lā)考(hēi)。
前两个月OpenWrt一直使用ChinaDNS+ShadowSocks的方式按IP切换代理,但是由于长城宽带非常蛋疼代理时常上不去,导致平时可以正常访问的一些网站也无法访问,得不偿失。于是趁这周换了移动光纤,为了避免发生之前的情况,也把代理方式换成了按GFWlist得域名切换。
首先是在OpenWrt下装上一堆必要软件:
其中前三个正常安装即可,dnsmasq-full
需要先卸载预装的dnsmasq
再安装。
shadowsocks-libev
可以在sourceforge里找到。如果无法访问也可以下载我备份在服务器上的较老版本(注意软件所适配的架构):
wget https://www.shintaku.cc/files/shadowsocks-libev_2.4.8-3_ar71xx.ipk
下载完成后使用opkg install
命令直接安装即可。
编辑/etc/shadowsocks.json
文件:
1 | { |
修改/etc/init.d/shadowsocks
成如下(就是把关于ss-local
的注释掉再把ss-redir
的解注释):
1 |
|
之后启动ShadowSocks并设置开机自启:
/etc/init.d/shadowsocks start
/etc/init.d/shadowsocks enable
新建目录/etc/dnsmasq.d
,并在其中放入dnsmasq_list.conf
文件,这个文件就是根据GFWlist生成的走代理的域名列表,生成方法已经有大神放在了GitHub上,可根据自己的情况进行修改。若是懒得生成,我在服务器上也会每日更新dnsmasq_list.conf,里面用的DNS是在这台服务器上搭的dnsmasq,ipset表叫做gfwlist
。
建议使用自己VPS上的DNS,具体就是在服务器装上dnsmasq,编辑/etc/dnsmasq.conf
加入:
1 | port=5353 |
保存后运行dnsmasq并设置开机启动就可以间接使用Google Public DNS了。
然后编辑路由器上的/etc/dnsmasq.conf
,在全篇注释后面加一句:
1 | conf-dir=/etc/dnsmasq.d |
最后自定义防火墙规则(可在LuCI里直接添加):
1 | ipset -N gfwlist iphash |
重启dnsmasq就算完成了:
/etc/init.d/dnsmasq restart
今天刷机小王子一加3终于给送来了,趁此机会总结一下之前用过的adb
命令备查。
之前曾经用过Odin线刷、卡刷等方式,直到接触了Android Debug Bridge才发现命令行的强大。
首先通过Homebrew安装adb工具:
brew install android-platform-tools
拿到一部新机一般OEM是上锁的。为了刷机我们需要对Bootloader进行解锁。这个过程会清除设备中的数据,所以需要提前进行备份。
首先进入关于手机连击版本号打开开发者模式,然后进入开发者模式打开OEM解锁,顺便将USB调试也打开。
这时用数据线将手机与电脑相连进行USB调试,在命令行里输入:
adb devices
如果设备列表中出现Android设备则说明连接成功,接着输入:
adb reboot bootloader
设备会重启到bootloader,此时使用命令:
fastboot oem unlock
在手机上进行确认后就解锁了bootloader。
设备自带的Recovery一般可能不如第三方的功能强大,这里推荐一个叫TWRP的Recovery,因为如果要刷Gapps的话可能需要用到它。首先到TeamWin下载对应设备的recovery包。
接着通过adb reboot bootloader
进入bootloader,再输入:
fastboot flash recovery Recovery.img
就刷入新的recovery了,再通过fastboot reboot
重启就可以了。
先通过命令使设备重启为recovery模式:
adb reboot recovery
如果是刷入新系统建议先四清(System、Data、Cache、Dalvik Cache),如果是升级系统建议先三清(Data、Cache、Dalvik Cache),如果希望保留数据,双清(Cache、Dalvik Cache)就可以了。无论怎样最好都先备份数据。
首先将对应的ROM下载到电脑上。然后到手机上进入TWRP的Advanced
,选择ADB Sideload
。在电脑终端输入:
adb sideload ROM.zip
等待刷完就可以了。刷完后建议双清一下再重启。
如果想要装上Google全家桶,在刷完ROM后先不要急于重启。先到OpenGAPPS下载对应版本的GAPPS到电脑上(注意Platform和Android版本),不同Variant区别在于:
Variant | Description |
---|---|
aroma | 图形化界面的super版,可以选择安装GAPPS |
super | 包含Google设备的所有Google Apps |
stock | 包含最新Nexus机型上预装的应用,并以GAPPS替换AOSP的同类应用 |
full | 与stock版的内容相似,但不会替换AOSP应用 |
mini | 包含完整的Google Play服务框架和主流应用 |
micro | 包含完整的Google Play服务框架和少数应用(Gmail、Calender、Google Now) |
nano | 仅包含完整的Google Play服务框架 |
pico | 仅包含最基础的Google Play服务框架 |
可以根据自己的需要进行下载。
最好在刷完ROM后立刻刷入GAPPS。依然进入ADB Sideload
,并输入命令:
adb sideload open_gapps.zip
等待刷完后最好先双清一下再重启,否则可能会出现无限重启或停止工作的问题。
root权限可以通过安装SuperSU的方式获取(CM13之类的系统可以在开发者选项里直接获取)。
先到chainfire下载最新版本的SuperSU,然后进入TWRP的ADB Sideload
模式下直接通过adb sideload SuperSU.zip
命令刷入即可。
如果apk下载到了电脑上,无需拷贝到手机通过以下命令便可直接安装:
adb install APP.apk