macOS自动添加ssh密钥

本来是没有这种问题的,但是自从macOS升级到Sierra 10.12以后ssh-agent不会自动加载密码短语了,每次重启后ssh登机器时总是提示输入密钥的密码短语,所以每次开机都要用ssh-add -K ~/.ssh/id_rsa将它手动添加到钥匙串中才行。

后来在GitHub找到了解决方案,其实就是简单配置了一下~/.ssh/config

1
2
3
4
5
Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/github_rsa

IdentityFile指定要自动添加的密钥即可。

Read More +

「艦これ」Android版運用

舰队Collection之前出了Android版,最开始需要预约抽签才能登录,2016年8月份开始全体提督都可以玩了。Android版有一个好处就是(除首次登录外)无需代理即可随时随地肝船了。

下载安装DMM Game Store

先到DMM App Store下载安装包,安装完毕打开任意代理(只要不是中国大陆的地址就行)后打开游戏中心,点右上角游戏按钮登录:

DMM Game Store

登录后选择艦隊これくしょん -艦これ-并下载:

ダウンロード

安装运行「艦これ」

下载完了直接安装就行了,此时就不需要代理了,然后直接启动:

スタート

此时按ミュージックスタート就进入游戏了,游戏本身和网页版大同小异:

Kan Colle

Read More +

终端开发终极配置

终端是每天要用到的工具,所以一定要配置成自己顺手的,才能发挥更高的效率。iTerm2+zsh+vim是我目前用过的感觉最强大的配置方案了。

iTerm2

iTerm2是默认终端的终极替代方案,个性化、热键等方面表现非常出色,兼容性也非常好。

iTerm2

直接到其官网下载安装即可。

对于终端里的特殊字符可能有的无法显示,要安装powerline字体:

git clone https://github.com/powerline/fonts.git --depth=1
cd fonts && ./install.sh

然后在Preferences - Profiles - Text - Font里选择powerline字体就可以了。

zsh

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)"

oh-my-zsh

安装完成后编辑~/.zshrc,可以编辑ZSH_THEME修改主题,或者编辑plugins增加插件,对应的文件分别在~/.oh-my-zsh/themes~/.oh-my-zsh/plugins下。

vim

spf13-vim是vim的终极配置之一,用以下脚本安装:

curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh

spf13-vim

配色文件在~/.vim/bundle/vim-colorschemes/colors下,指定名称修改配色:

echo colorscheme $colorscheme_name  >> ~/.vimrc.local
Read More +

macOS配置PHP开发环境

上(shí)班(xí)的时候写PHP都是在开发机上,所以公司配的电脑上一直就没有搭PHP环境。最近我预料到要写一个Web的项目,所以提前搭一下环境备用。

安装MySQL

可以直接通过homebrew安装:

brew install mysql

安装完成后第一次启动MySQL:

brew services start mysql

然后就可以用mysql_secure_installation初始化设置一下MySQL,包括root密码等等。

开机启动homebrew.mxcl.mysql.plist已经默认添加到~/Library/LaunchAgents里了,所以不用再设置了。

安装Nginx

同样Nginx也可以通过homebrew安装:

brew install nginx

安装完成后直接用nginx命令就可以启动。

但是Nginx的开机启动项并没有默认添加,我们可以手动将它添加进去:

cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/

配置PHP

macOS默认是安装好PHP的,所以就不想再安装其他版本了。

先编辑/private/etc/php.ini,如果没有就复制一份php.ini.default,然后配置一下时区和数据库socket:

1
2
date.timezone = "Asia/Shanghai"
pdo_mysql.default_socket = /tmp/mysql.sock

因为我要用yii框架,所以改了这一项,如果用到了MySQL的其他函数需要修改相应的mysql.default_socketmysqli.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
2
3
4
5
6
7
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

然后执行nginx -s reload重新加载配置。

然后也可以配置一下php-fpm的开机启动,直接新建~/Library/LaunchAgents/net.php.php-fpm.plist文件:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.php.php-fpm</string>
<key>RunAtLoad</key>
<true/>
<key>Program</key>
<string>/usr/sbin/php-fpm</string>
</dict>
</plist>

保存后将其权限设为600即可,然后执行启动:

launchctl load ~/Library/LaunchAgents/net.php.php-fpm.plist

如果提示Service is disabled,上面的命令加上-w参数再执行就行了。

Read More +

shell脚本内的并发执行

之前有一个每周数据统计的工作,需要每周的某一天定时从多台服务器上拉取日志进行汇总生成报表。

顺序执行

最初的思路是先做一个循环,遍历每台机器并在上面执行相应的数据处理脚本,然后将处理好的数据拉取到汇总的机器上,这样逐台进行,最后进行汇总处理,写出来的脚本是类似这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
array=( \
"10.144.1.1" \
"10.144.1.2" \
"10.144.1.3" \
"10.144.1.4" \
)

for i in ${array[@]}
do
ssh $i "sh $log_dir/run.sh"
scp $i:$log_dir/log $work_dir/$i/
done

cat $work_dir/*/log | sort | uniq > $work_dir/log

这样写的执行时间大约是每台机器时间*台数+汇总时间,虽然不算快,但是凌晨一般也能执行完成。

并发执行

后来到了国庆假期期间,服务流量骤增,再加上业务改版等一系列原因,导致数据量突然增大,执行时间翻了几倍,任务大概要到下午才能完成,这样一来就会耽误白天的工作。

因为机器数量不少,分机器统计也是主要的时间消耗,因此想到既然几台机器各自的统计互不影响,可以让它们同时进行汇总工作。于是上网找了一下改进方法,改完了大致是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array=( \
"10.144.1.1" \
"10.144.1.2" \
"10.144.1.3" \
"10.144.1.4" \
)

for i in ${array[@]}
do {
ssh $i "sh $log_dir/run.sh"
scp $i:$log_dir/log $work_dir/$i/
}&
done
wait

cat $work_dir/*/log | sort | uniq > $work_dir/log

可以发现主要的改动就在for循环的内容用{}括起来并在末尾加个&,这样就可以实现多次循环一起执行了;另外在done后面加个wait是为了等待所有的循环都执行完成后再做后面的汇总工作,否则一旦有一个循环执行完成就会往下执行了。

这样的执行时间大约是每台机器时间+汇总时间,可以看出比最初快了很多。

Read More +

ssh保持继续连接

公司开发登录堡垒机时需要使用PIN+token的方式进行认证,而且动态密码只能一次使用,因此一次要打开多个终端都要多次等待动态密码的变化才能登录。

所以听从公司同(xué)事(zhǎng)的建议,配置了一下~/.ssh/config

1
2
3
4
Host *
ControlMaster auto
ControlPath ~/.ssh/%h-%p-%r
ControlPersist yes

如果没有这个文件可以新建。其中Host项是指目标地址;ControlMaster一项会使一旦有一个连接以后,再次从其他终端连接同一个host也不必再输密码;ControlPersist一项可以一段时间不再输密码也可以登录。这样配置以后就能实现输一次密码后对于同一host不再输密码即可连接了。

Read More +

搭建Ngrok内网穿透服务

之前上开源课的时候听说可以通过外网访问局域网电脑获取文件,但由于自己家中的宽带一直不给分配公网地址,所以无法直接访问。

后来又听说可以用花生壳之类的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.crtngrokroot.keyngrokroot.srlsnakeoil.crtsnakeoil.csrsnakeoil.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上加参数编译其他环境的客户端:

macOS

GOOS=darwin GOARCH=amd64 make release-client

Windows

GOOS=windows GOARCH=amd64 make release-client

OpenWrt

由于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

启动

PC

先创建配置文件~/.ngrok并编辑,写入自己的域名和监听端口:

1
2
server_addr: "shintaku.cc:4443"
trust_host_root_certs: false

可以先用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页面查看连接状态:

Inbound Requests

如果要同时穿透多个端口也可以将它们都写在配置文件里:

1
2
3
4
5
6
7
8
9
10
server_addr: "shintaku.cc:4443"
trust_host_root_certs: false

tunnels:
test:
proto:
http: 4000
ssh:
proto:
tcp: 22

然后启动时加上要启动的tunnel名就可以了:

ngrok start test ssh

OpenWrt

路由器上装好了以后可以在服务-Ngrok Settings下设置:

OpenWrt

除了HTTP协议以外,也可映射TCP其他端口,例如ssh的22端口映射到远程的8022端口:

OpenWrt

这时ssh [email protected] -p 8022ssh [email protected]的效果是一样的,意味着即使在外面也可以访问没有公网地址的路由器了。更进一步,如果给路由器下连接的设备都分配了固定的局域网IP地址,将它们的端口映射到Ngrok服务器的端口,外网同样可以访问,这样就可以做很多事情了。

Read More +

DenyHosts防止ssh暴力登录

每次登录服务器都会提示:

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中。

添加信任IP

编辑/etc/hosts.allow,将自己常用的IP加进去:

1
sshd: 202.113.*.*: allow

比如学校用的天津南开教育网,就把上面的IP段加进去,防止哪天自己手残输错几次密码IP被禁登不进去了。

安装配置DenyHosts

yum install denyhosts

安装完成后编辑/etc/denyhosts.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
SECURE_LOG = /var/log/secure
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY = 10w #禁止列表清理周期,不填就是永不清理
BLOCK_SERVICE = sshd
DENY_THRESHOLD_INVALID = 5 #非法用户失败登录次数
DENY_THRESHOLD_VALID = 5 #合法用户失败登录次数(不含root)
DENY_THRESHOLD_ROOT = 3 #root用户失败登录次数
DENY_THRESHOLD_RESTRICTED = 3 #限制用户失败登录次数
WORK_DIR = /var/lib/denyhosts
ETC_DIR = /etc
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS = NO #是否报告来自允许列表的可疑登录
HOSTNAME_LOOKUP = NO #是否屏蔽被禁止IP对应的域名
LOCK_FILE = /var/lock/subsys/denyhosts

其中几个数字可以根据自己的需求修改,文件路径一般都不需要修改。另外还可以设置管理员邮箱ADMIN_EMAIL,默认是root@localhost,会把通知邮件发到/var/spool/mail下;也可以加上自己的其他邮箱。

启动服务

保存好配置文件后可以启动DenyHosts并加入到开机启动了:

systemctl start denyhosts
systemctl enable denyhosts

然后tail -f /etc/hosts.deny看一下禁用列表的动态,如果有:

1
2
3
4
5
6
7
8
9
10
# DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 87.106.142.246
sshd: 87.106.142.246
# DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 123.49.62.231
sshd: 123.49.62.231
# DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 45.32.20.165
sshd: 45.32.20.165
# DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 58.221.60.2
sshd: 58.221.60.2
# DenyHosts: Fri Aug 26 05:41:17 2016 | sshd: 118.71.224.139
sshd: 118.71.224.139

这样的内容出现就说明DenyHosts已经把之前记录里的可疑IP写进来了。我也把自己服务器上的hosts.deny放出来供大家(lā)考(hēi)。

Read More +

GFWlist+ShadowSocks实现路由器透明代理

前两个月OpenWrt一直使用ChinaDNS+ShadowSocks的方式按IP切换代理,但是由于长城宽带非常蛋疼代理时常上不去,导致平时可以正常访问的一些网站也无法访问,得不偿失。于是趁这周换了移动光纤,为了避免发生之前的情况,也把代理方式换成了按GFWlist得域名切换。

必要软件

首先是在OpenWrt下装上一堆必要软件:

  • ipset
  • iptables-mod-nat-extra
  • libopenssl
  • dnsmasq-full
  • shadowsocks-libev

其中前三个正常安装即可,dnsmasq-full需要先卸载预装的dnsmasq再安装。

shadowsocks-libev可以在sourceforge里找到。如果无法访问也可以下载我备份在服务器上的较老版本(注意软件所适配的架构):

wget https://www.shintaku.cc/files/shadowsocks-libev_2.4.8-3_ar71xx.ipk

下载完成后使用opkg install命令直接安装即可。

配置ShadowSocks

编辑/etc/shadowsocks.json文件:

1
2
3
4
5
6
7
8
{
"server": "",
"server_port": 8388,
"local_port": 1080,
"password": "",
"timeout": 300,
"method": "rc4-md5"
}

修改/etc/init.d/shadowsocks成如下(就是把关于ss-local的注释掉再把ss-redir的解注释):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh /etc/rc.common

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1

CONFIG=/etc/shadowsocks.json

start() {
#service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0
service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0
#service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -l 5353 -L 8.8.8.8:53 -u
}

stop() {
#service_stop /usr/bin/ss-local
service_stop /usr/bin/ss-redir
#service_stop /usr/bin/ss-tunnel
}

之后启动ShadowSocks并设置开机自启:

/etc/init.d/shadowsocks start
/etc/init.d/shadowsocks enable

配置dnsmasq

新建目录/etc/dnsmasq.d,并在其中放入dnsmasq_list.conf文件,这个文件就是根据GFWlist生成的走代理的域名列表,生成方法已经有大神放在了GitHub上,可根据自己的情况进行修改。若是懒得生成,我在服务器上也会每日更新dnsmasq_list.conf,里面用的DNS是在这台服务器上搭的dnsmasq,ipset表叫做gfwlist

建议使用自己VPS上的DNS,具体就是在服务器装上dnsmasq,编辑/etc/dnsmasq.conf加入:

1
2
3
port=5353
server=8.8.8.8
server=8.8.4.4

保存后运行dnsmasq并设置开机启动就可以间接使用Google Public DNS了。

然后编辑路由器上的/etc/dnsmasq.conf,在全篇注释后面加一句:

1
conf-dir=/etc/dnsmasq.d

最后自定义防火墙规则(可在LuCI里直接添加):

1
2
ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

重启dnsmasq就算完成了:

/etc/init.d/dnsmasq restart
Read More +

使用adb工具刷机

今天刷机小王子一加3终于给送来了,趁此机会总结一下之前用过的adb命令备查。

之前曾经用过Odin线刷、卡刷等方式,直到接触了Android Debug Bridge才发现命令行的强大。

首先通过Homebrew安装adb工具:

brew install android-platform-tools

OEM解锁

拿到一部新机一般OEM是上锁的。为了刷机我们需要对Bootloader进行解锁。这个过程会清除设备中的数据,所以需要提前进行备份。

首先进入关于手机连击版本号打开开发者模式,然后进入开发者模式打开OEM解锁,顺便将USB调试也打开。

这时用数据线将手机与电脑相连进行USB调试,在命令行里输入:

adb devices

如果设备列表中出现Android设备则说明连接成功,接着输入:

adb reboot bootloader

设备会重启到bootloader,此时使用命令:

fastboot oem unlock

在手机上进行确认后就解锁了bootloader。

刷入Recovery

设备自带的Recovery一般可能不如第三方的功能强大,这里推荐一个叫TWRP的Recovery,因为如果要刷Gapps的话可能需要用到它。首先到TeamWin下载对应设备的recovery包。

接着通过adb reboot bootloader进入bootloader,再输入:

fastboot flash recovery Recovery.img

就刷入新的recovery了,再通过fastboot reboot重启就可以了。

刷入ROM

先通过命令使设备重启为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

等待刷完就可以了。刷完后建议双清一下再重启。

刷入GAPPS(可选)

如果想要装上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(可选)

root权限可以通过安装SuperSU的方式获取(CM13之类的系统可以在开发者选项里直接获取)。

先到chainfire下载最新版本的SuperSU,然后进入TWRP的ADB Sideload模式下直接通过adb sideload SuperSU.zip命令刷入即可。

安装apk(可选)

如果apk下载到了电脑上,无需拷贝到手机通过以下命令便可直接安装:

adb install APP.apk
Read More +