shell script idiom

Bash 命令中一些常见的习惯。

> file redirects stdout to file
1> file redirects **stdout** to file
2> file redirects **stderr** to file
&> file redirects stdout and stderr to file

/dev/null is the null device it takes any input you want and throws it away. It can be used to suppress any output.

Using 2>&1 will redirect stderr to whatever value is set to stdout (and 1>&2 will do the opposite).


2019-07-03 bash , shell , stdout , stderr , pipeline

MySQL 日期和时间函数

记住一些常用的时间操作函数能够提高 SQL 查询的效率。比如查询过去 30 天的记录,如果不清楚 DATE_SUB() 函数可能需要手动计算一下时间点再查询,但是如果知道 DATE_SUB() 函数就可以

SELECT something FROM tb_name WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= daet_col;

这个 SQL 同样会查找出来当前时间点未来的记录。

获取时间

获取当前时间

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2019-07-01 09:12:46 |
+---------------------+
1 row in set (0.00 sec)

获取时间戳,同义于 NOW()

mysql> SELECT CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP;
+---------------------+---------------------+
| CURRENT_TIMESTAMP() | CURRENT_TIMESTAMP   |
+---------------------+---------------------+
| 2019-07-01 09:13:13 | 2019-07-01 09:13:13 |
+---------------------+---------------------+
1 row in set (0.00 sec)

获取 UNIX 时间戳

mysql> select UNIX_TIMESTAMP(NOW());
+-----------------------+
| UNIX_TIMESTAMP(NOW()) |
+-----------------------+
|            1562571055 |
+-----------------------+
1 row in set (0.00 sec)

获取当前的时间 CURTIME(),结果为 hh:mm:ss 格式

mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 09:13:53  |
+-----------+
1 row in set (0.01 sec)

或者

mysql> SELECT CURTIME() + 0;
+---------------+
| CURTIME() + 0 |
+---------------+
|         91525 |
+---------------+
1 row in set (0.02 sec)

计算时间

如果能查得当前时间,那么通过计算函数就能够非常快速的得到,比如过去一周,过去三十天的时间戳。

时间转换

从一个时间转换成另外一种表现方式

  • 天数 <==> 日期
  • UNIX 时间戳 <==> 日期
  • 秒数 <==> 时间

TO_DAYS

传入日期,返回一个从第 0 年 ( ‘0000-00-00’) 开始到传入日期的天数

mysql> SELECT TO_DAYS('0000-01-01');
+-----------------------+
| to_days('0000-01-01') |
+-----------------------+
|                     1 |
+-----------------------+

同理还有 TO_SECONDS(expr) 方法

FROM_DAYS

给定一个天数,返回日期。

相类似的方法还有 FROM_UNIXTIME(unix_timstamp),接受一个时间戳返回日期

时间到秒

TIME_TO_SEC(time) 传入时间返回秒数

mysql> SELECT TIME_TO_SEC('22:23:00');
        -> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
        -> 2378

同理从秒数到时间 SEC_TO_TIME(seconds)

时间日期计算

给日期增加或者减少,加减运算

时间间隔

增加时间

ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

举例

mysql> select DATE_ADD(NOW(), INTERVAL 1 DAY);
mysql> select DATE_ADD(NOW(), INTERVAL 1 HOUR);
mysql> select DATE_ADD(NOW(), INTERVAL 1 MINUTE);
mysql> select DATE_ADD(NOW(), INTERVAL 1 SECOND);
mysql> select DATE_ADD(NOW(), INTERVAL 1 MICROSECOND);
mysql> select DATE_ADD(NOW(), INTERVAL 1 WEEK);
mysql> select DATE_ADD(NOW(), INTERVAL 1 MONTH);
mysql> select DATE_ADD(NOW(), INTERVAL 1 QUARTER);
mysql> select DATE_ADD(NOW(), INTERVAL 1 YEAR);
mysql> select DATE_ADD(NOW(), INTERVAL -1 YEAR);

同理减时间

SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)
DATE_SUB(date,INTERVAL expr unit)

reference


2019-06-30 mysql , database , sql , date , time

Linux 下执行文件中的每一行

今天想要通过 adb 将盒子中的所有 apk 备份出来,很早之前写过的文章 就提到过如何手动的备份 apk 文件,不过这样很麻烦,需要每一条都手敲,所以想到了使用刚了解到的 xargs 命令,所以想通过几个命令将文件路径全部都拷贝出来,包名也拷贝出来。然后使用 xargs 来批量执行每一行命令。

通过这个拿到所有包名

adb shell pm list packages | cut -d: -f2 | tee pkg.txt

拿到所有文件路径

adb shell pm list packages | cut -d: -f2 | xargs -I {} adb shell pm path {} | tee path.txt

合并文件

paste -d" " path.txt pkg.txt | tee cmd.txt

然后添加

sed -e 's/^/adb pull /' -i cmd.txt

这样就得到了每一行都是一个 adb pull 命令的文件 cmd.txt

bash cmd.txt | bash

就能够快速的备份所有的 apk 文件了。

当然如果你熟悉 bash 可以非常快速的写出

for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done

reference


2019-06-28 linux , bash , xargs , commands

Intellij IDEA 中删除所有未使用的类

修改设置

  • Press Ctrl+Shift+A
  • Enter “unused declar”
  • Double-click on “Unused declaration”
  • Settings will pop up

设置

  • Click on Java/Declaration redundancy/Unused declaration
  • on the right bottom select “On the fly editor settings”
  • untick check fields, …, check parameters. Only Check Classes should be ticked.
  • Press OK

Settings closes

  • On the menu bar, click on Analyze / Run Inspection by Name (or Ctrl+Alt+Shift+I)
  • Insert text “Unused decla”
  • Select “Unused declaration Java Declaration redundancy”
  • Search starts

Check the job state on bottom of Idea, when finished: enjoy the results and the great feeling of cleaning up the messed code. :)

reference


2019-06-28 intellij

Gitlab 中使用命令行提交 merge request

gitlab-cli 是一个用 Javascript 所写的工具,可以用来在命令行中提交 gitlab 的 merge request 等等,作者说收到 hub 工具的启发。

Installation

npm install git-lab-cli -g

Usage

查看帮助

lab -h

通过环境变量全局配置

GITLAB_URL=https://gitlab.yourcompany.com
GITLAB_TOKEN=abcdefghijskl-1230

TOKEN 可以在 https://gitlab.yourcompany.com/profile/account 这个地方找到。

一些常用的选项:

-a, --assignee    "username"
-m "merge request message"
-r        标记合并之后删除远端分支

提交 Merge Request

首先将自己的分支 push 到 origin

git push -u origin feature_branch

lab -a "username" -m "Feature" -r

运行结束后会返回 Merge Request 的地址。

相关


2019-06-20 gitlab , gitlab-cli , git , commands , merge-request

每天学习一个命令:xargs 连接输出和输入

xargs 用来把一个命令的结果传递给另外一个命令执行。这是一个日常中经常会遇到的场景。

xargs 会从标准输入读取内容,然后将内容送给其他命令构建其他可执行命令。这意味着可以从一个命令行的输出结果读取内容并作为另一个命令的输入。

xargs 默认读取时按照空白字符分割的输入,输入可以带双引号,单引号,或者反斜杠转义,xargs 也可以读取新行,然后将输入作为参数执行对应的命令一次或者多次,默认是 /bin/echo。空白行输入会被忽略。

Unix 文件系统的文件可以包含空白和新行,这个默认的行为可能造成一些问题,包含空白的文件名可能被 xargs 错误读取。在这个情况下,最好是使用 -0 选项,在使用这个选项之前,同样要保证输出的结果同样是 null 字符分割的字符串,比如 GNU 下 find 命令的 -print0 选项。

如果任何调用产生 255 状态,xargs 会立即结束输入并给出错误。

使用

常用的选项

-o, --null  输入是 null 分割
-a file     从文件读取输入
-d delim    自定义分隔符
-E eof-str  自定义结束字符串
-I replace-str  使用自定义占位符

-t          在命令执行之前打印
-p          交互模式,每一次执行命令会进行确认

查找并删除

删除目录下特定 PATTERN 的文件:

find /tmp -name core -type f -print | xargs /bin/rm -f
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f    # name 可以包含空白
# or not use xargs
find /tmp -depth -name core type f -delete

删除目录下除了固定格式的其他文件

find . -type f -not -name '*.gz' -print0 | xargs -0 -I {} rm -v {}

说明:

  • -I {} xargs 的 -I {} 属性会将后面命令中的内容替换为 -I {} 指定的内容

xargs 执行多个命令

通常情况下 xargs 只会在后面使用一个命令比如说 rm -v {} ,但如果想要在 xargs 后接多个命令则可以使用

< a.txt xargs -I {} sh -c 'echo {}; echo {};'

这样就可以执行多个命令。1

从文件读取

比如文件 links.txt 中每一行都是一个链接,那么可以使用该命令将所有链接下载下来

xargs -a links.txt -I {} wget {}

找出目录下的 png 图片并打包到一个压缩包

首先找出目录下的 png 图片路径,然后打包到一个文件

find /path/to -name "*.png" -type f -print0 | xargs -0 tar czvf photos.tar.gz

解释:

  • -print0 的选项输出文件完整路径,然后紧跟一个空字符 (null), 而不是默认 -print 选项使用 newline ,该选项使得其他命令可以解析 find 命令的输出,比如 xargs-0 选项
  • 同上一条 -0 选项,表示的是输入的内容用 null 字符来分割,而不是使用空白字符,xargs 在使用该选项时会按照字面接受参数

将 ls 结果输出到一行

将 ls 结果输出到一行

ls -1 | xargs

说明:

  • ls -1 注意这里是 -1 是数字的 1,不是英文的 L,会一行输出一个文件

自定义定界符

通常情况下 xargs 会使用空格或者空行来分割字符,这也就意味着如果文件名中包含空格,那么在处理时会遇到问题,所以可以使用 -d delim 来指定自己的定界符 (delimiter)。或者使用 xargs -0

输出当前系统中的账号

cut -d: -f1 < /etc/passwd | sort | xargs

说明:

  • -d: 表示按照 : 分割
  • -f1 表示取第一个字段(第一列)

批量重命名

以前一直以为批量重命名得是一个非常高级的功能,在 GNU 下通过 xargs 和 rename 就可以快速实现

find -depth /path/to | xargs -n 1 rename -v 's/origin/after/' {} \;

该命令会把目录下所有文件统一成小写。

说明:

  • rename 使用 perl 的正则

接受多个参数

通常情况下 xargs 只会接受一个参数作为命令的输入,如果有多个参数时,可以使用如下方法:

echo "one" "two" "three" | xargs -l sh -c 'echo $0, $1, $2' | xargs

批量替换标签

我一直使用纯文本(markdown)文件来记笔记,所以历史中存在很多没有好好管理的标签,比如有一些笔记使用了 # 加一些中文来标记,这部分内容我想进行管理,批量替换,结合 ripgrepxargssed

rg "#要替换的标签" -l |xargs -I {} sed -i 's/#要替换的标签/#之后的标签/g' {}

并行执行命令

通过 xargs 的 man 可以知道

This manual page documents the GNU version of xargs. xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial- arguments followed by items read from standard input. Blank lines on the standard input are ignored.

这意味这 xargs 会等待,并收集所有的输出之后再执行后面的命令。这并不是我们想要的,所以仔细研读 man 文档之后我们会发现 -n 选项和 -P 选项。

printf %s\\n {0..99} | xargs -n 1 -P 8 -I {} sh -c 'echo {}; sleep 2;'

说明:

  • -n 选项会执行每一次命令最多拿多少个参数
  • -P 选项会同时开启多少个 processes 来执行命令

这样就能解读这行命令,打印从 0 到 99 这样 100 个数,每次开启 8 个进程,每个命令接受一个参数,执行后停顿 2 秒。看输出就能知道 8 个数同时打印, sleep 2 秒之后继续。这样就做到了并发执行。2

reference


2019-06-19 linux , xargs , cli , command-line , bash

一些 Tmux 使用小技巧

[[Tmux]] 是一个很强大的终端复用工具,下面是日常积累中记录的一些使用经验。

多 Pane 同步输入 Multiple Pane Synchronization

Tmux 一个非常著名的功能就是可以多个 Pane 同步输入,使用方式:

  • prefix
  • 输入 :setw synchronise-panes on
  • 然后在多个 Pane 中就开启了同步

同理配置 :set synchronise-panes off 就可以关闭

我在 ~/.tmux.conf 中配置了:

bind C-x setw synchronize-panes

配合 prefix + Ctrl-x 就可以快速切换多 Pane 同步。

Zooming tmux

tmux 1.8 引入了 Zoom 功能,支持一键最大化当前 Working Pane,使用 prefix + z 来放大,再次按下恢复。

在 Tmux 和 Vim 之间无缝切换。

更多内容可以参考我的 配置

结合 fzf

结合 fzf 的模糊查询,可以实现对 Tmux 会话的快速创建和搜寻,可以到 fzf 的 Wiki 页面具体查看。

Tmuxinator vs tmuxp

通常情况下创建一个 Tmux session 需要按很多个按键,假如有一个稍微复杂一点的项目,要开多个 Windows,第一个 Window 下开 3 个 Pane,那么每一次重启机器都要恢复这么多状态的话会非常累。有两种解决办法,一种就是在之前 Tmux Plugin 文中提到的 tmux-resurrect 插件。另一种就是使用配置文件,然后利用 Tmuxinator 或者 tmuxp 这两个工具来快速创建 Session。这两个工具可以通过读取配置文件,然后创建一个预设的 Tmux session。

Tmuxinator 是 Ruby 编写的,tmuxp 是 Python 所写,根据自己的环境选择即可。

reference


2019-06-19 tmux , linux , commands , terminal

D-Bus 简单学习

D-Bus 是 Desktop Bus 缩写,是一个 inter-process communication(IPC) 和 remote procedure call (RPC) 机制,用来允许在同一台机器上进行进程间通信,它是 Linux 桌面环境中最重要的产物之一。它被越来越多地被用于应用程序间通信,也被用于应用程序和操作系统内核之间的通信。很多现代的服务进程都使用 D-Bus 取代套接字作为进程间通信机制,对外提供服务。

  • 进程间通信
  • 大部分 Linux 系统用它将系统事件(比如插入 USB 设备)通知给进程

D-Bus 作为 freedesktop.org 项目的一部分进行开发,由 Red Hat Havoc Pennington 起头,该标准被 Linux 上桌面平台 GNOME 和 KDE 采用。

D-Bus 将所有消息通过总线方式管理、分发,一般采用三层结构:

  • libdbus 库,允许应用间通信
  • 建立在 libdbus 上的消息守护进程,路由消息
  • 封装库,libdbus-glib 或者 libdbus-qt 封装使用细节

D-Bus 的重点是一个叫做 dbus-daemon 的中央槽,需要对某些事件做出反应的进程,可以到 dbus-daemon 上注册,然后就能收到想要的事件通知。进程也可以创建事件,例如,udisks-daemon 进程从 ubus 监听硬盘事件,并发送到 dbus-deamon, 而 dbus-deamon 会把这些事件再转发给那些对硬盘事件感兴趣的应用。

D-Bus 在 Linux 系统中正变的越来越重要,并且从桌面系统中突破出来,systemd 和 Upstart 也同它来通信。但是,在核心系统中加入对桌面工具的依赖,有违 Linux 的设计宗旨。所以 dbus-daemon 进程被分成两类。

  • 系统实例,开机时由 init 启动,并带有 --system 选项,这个实例通常作为 D-Bus 用户运行,配置文件是 /etc/dbus-1/system.conf 一般不用修改,进程可以通过 /var/run/dbus/system_bus_socket 的 Unix 域套接字连接该实例
  • 会话实例,和系统实例不同,会话实例只在打开桌面会话时才会运行,运行的桌面应用会连接这种实例

示例

D-Bus python 官方示例

Wiki

监视 D-Bus 消息

监视总线上的消息,监视系统实例:

dbus-monitor --system

可以看到系统实例上的消息,如果输出不多,可以尝试插入一个 USB 设备,再观察日志。

监视会话实例:

dbus-monitor --session

然后在不同的窗口点击,会看到不同的消息输出。

问题

运行在 Ubuntu 上经常遇到这样的问题

Failed to determine seats of user "1000": Too many open files)

目前找到的唯一方法就是重启。

reference


2019-06-18 linux , dbus , gpg , desktop

Termux app 使用记录

Termux 是一个 Android 上的应用,但是这个应用是一个终端模拟器,可以完美的在 Android 上模拟一个 Linux 终端环境。甚至不需要 root 权限,正常安装即可使用。Termux 还提供了一套自己的包管理。

Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the APT package manager.

官网地址:

和 Linux 类似,Termux 有着自己的软件源 http://termux.net/

Termux 和其他终端模拟的区别

Android 上有很多终端模拟,SSH 连接的工具,以前经常用 Juice SSH,Terminal Emulator for Android,这些工具和 Termux 有什么区别呢。

那么 Termux 首先是一个 Android Terminal Emulator,可以和其他 Terminal 一样提供本地 Shell 支持,安装 openssh 就支持 SSH Client,除开这两个功能以外,Termux 模拟了一套 Linux 运行环境,可以在无需 root 情况下对 Android 设备进行如同 Linux 设备一样的操作,甚至可以在其中使用 pkg 的包管理(实际也是使用的 apt)。所以在 Linux 设备上能做的一切操作,Termux 都能支持。比如:

  • 包管理
  • zsh, vim, tmux, ssh, wget, curl, etc
  • python, php, etc
  • 搭建数据库,运行 nginx,跑网站
  • 编写源代码,版本控制,编译,运行程序
  • 网络分析工具,nmap, iperf

使用

基本 UI 操作

  • 左侧滑出,侧边栏,管理 session
  • 长按终端,弹出上下文菜单

快捷键,音量减 (-) 代表 Ctrl

pkg 命令

pkg search <query>              搜索包
pkg install <package>           安装包
pkg uninstall <package>         卸载包
pkg reinstall <package>         重新安装包
pkg update                      更新源
pkg upgrade                     升级软件包
pkg list-all                    列出可供安装的所有包
pkg list-installed              列出已经安装的包
pkg shoe <package>              显示某个包的详细信息
pkg files <package>             显示某个包的相关文件夹路径

两个重要的文件路径

  • $HOME 进入终端的默认位置,一般在 /data/data/com.termux/files/home
  • $PREFIX 是 usr 目录,包含配置文件 etc/ 目录和可执行文件 bin/ 目录,一般为 /data/data/com.termux/files/urs

可以使用 echo $HOMEecho $PREFIX 来查看。

开启存储访问

在 Termux 下执行:

termux-setup-storage

点击允许,使得 Termux 可以访问本地文件。开启之后可以通过 cd /sdcard 来访问内部存储 sdcard。

默认会创建如下的软链接:1

~/storage/dcim -> /storage/emulated/0/DCIM
~/storage/downloads -> /storage/emulated/0/Download
~/storage/movies -> /storage/emulated/0/Movies
~/storage/music -> /storage/emulated/0/Music
~/storage/pictures -> /storage/emulated/0/Pictures
~/storage/shared -> /storage/emulated/0

或者也可以手工使用软链接 link 到 home 目录方便访问

ln -s /sdcard/ ~/storage

这样就可以直接在 home 目录下访问 storage 目录来快速访问 sdcard。

更换清华源

更换软件源:

export EDITOR=vi
apt edit-sources

将其中内容替换为:

deb https://mirrors.tuna.tsinghua.edu.cn/termux stable main

在新版的 Termux 中官方提供了图形界面(TUI)来半自动替换镜像2

termux-change-repo

执行前确保 termux-tools 包安装了。

如果遇到报错说:

CANNOT LINK EXECUTABLE “library “libssl.so.1.1” not found”

那么可以重新安装 F-droid 市场中的版本,Play Store 中的版本可能优点问题。

安装基础的工具

pkg install git vim curl wget tree fzf

zsh

安装 zsh

pkg install wget curl git vim zsh unrar unzip

使用我的 dotfiles

然后在目录下执行 make termux 完成初始化。

SSH

默认 Termux 并没有安装 ssh 客户端,所以输入下面命令安装:

pkg install openssh

安装了 ssh 客户端就能够 ssh 连接远程服务器了。如果要从其他设备连接 Termux ,那么需要做一些设置。

生成密钥:

ssh-keygen -b 4096 -t rsa
# 或生成 ed25519
ssh-keygen -t ed25519 -C "i@einverne.info"

此时会在 Termux 手机上生成一对公钥私钥,在 ~/.ssh 目录下。

从电脑 SSH 连接 Termux

Termux 不支持密码登录,所以需要将客户端设备的 id_rsa.pub 文件内容拷贝到 Termux 的 ~/.ssh/authorized_keys 文件中。因为 Termux 不支持 ssh-copy-id 所以只能手动操作。

要实现如此可以在 Termux home 目录中 SSH 到客户端的机器上,然后拷贝:

scp username@desktop.ip:~/.ssh/id_rsa.pub .
cat id_rsa.pub >> ~/.ssh/authorized_keys

或在 Termux 中一行命令,将需要登录 Termux 机器上的公钥拷贝到 Termux 机器上的 authorized_keys 中:

ssh user@desktop_clinet "cat ~/.ssh/id_rsa.pub" >> ~/.ssh/authorized_keys

然后在 Termux 上启用 sshd:

sshd -d   # -d 开始 debug 模式,可以不加

默认 sshd 监听的是 8022 端口,需要注意。

在电脑上使用 ssh 登陆手机 Termux

ssh -p 8022 -i ~/.ssh/id_rsa ipOfAndroidDevice

Termux 是单用户系统,所以不需要输入用户名,即使输入了 Termux 也会忽略。

传输文件

这样就免去了使用数据线连接手机传文件的问题,只要在局域网中能够互相访问,相互传输文件就方便许多。

# PC to Phone
scp -P 8022 -r ~/Downloads/ username@deviceIP:~/storage/pc/
# Phone to PC
scp -P 8022 -r username@deviceIP:~/storage/Downloads/ ~/

如果要在 Termux 上查看 sshd 日志,可以输入 logcat -s 'syslog:*'

确保这些目录的权限正确

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/known_hosts
chmod 600 ~/.ssh/authorized_keys

最后可以在桌面端配置 vi ~/.ssh/config

Host op7
    HostName ipOfYourDevice
    User termux
    Port 8022
    ForwardX11 yes
    ForwardX11Trusted yes
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa

这样就可以 ssh op7 来登陆手机 Termux 了。

比如我手机的 sdcard 路径就是 /storage/emulated/0/ .

字体

若出现 zsh 的 agnoster 主题(或其他依赖 powerline 字体的主题)无法正常显示,可将您的 powerline 字体拷贝到 ~/.termux/font.ttf 后执行 termux-reload-settings

备份 Termux

https://wiki.termux.com/wiki/Backing_up_Termux

adb

如果开启了 Android 远程调试,那么使用 adb connect ip 就方便许多,安装 adb 以备不时之需。

Penetration Test

日常 nmap

  • pkg install hydra Network logon cracker and bruteforcer supporting different services like ssh, telnet, ftp etc
  • pkg install nmap Utility for network discovery and security auditing
  • Metasploit Framework
  • RouterSploit
  • slowloris

更多可以参考 Termux Hacking

外延

reference


2019-06-15 termux , android , android-app , terminal , linux , 终端 , 工具

全平台开源的密码管理软件 Bitwarden

今天逛博客偶然间见到了一款全平台开源的密码管理软件 – Bitwarden,回想 2013 年的时候曾经写过一篇密码管理的方案,一回首已经六年,而这六年间换了无数设备,换过无数密码,从最早手写,固定规则,到 KeePass,到 LastPass,还曾经买过一年的 LastPass 会员,如今稳定地用着 LastPass。也见证了 LastPass 从简陋的单纯的密码管理到 Chrome 上的自动填充,再到 Android 上的一键填充,最后 iOS 也开放了支持,所有的平台几乎 LastPass 通吃了, Auto Fill 的功能实在太贴心。

然后为了增加安全性很多网站开始开启二步验证,最早只有孤零零的 Google 一家,而如今但凡安全措施做的比较好的网站都支持了二步验证,而二步验证非常不愉快的一个使用体验就是无法跨设备同步,Google Authenticator 但只是非联网的一个本地应用,当然站在 Google Authenticator 的角度无疑是对的,完全隔离网络,那么再厉害的黑客也无法获知二步验证的数字,然而这一点却牺牲了用户使用的便携程度。我曾经遇到过一次手机无法开机而丢失所有二步验证的 token,这几乎让我崩溃,我需要到每一个网站去重置我的二步验证设置。而 LastPass Authenticator 虽然牺牲了一定的安全性,但带来的易用性确实方便了。只要开启同步换一个设备登录 LastPass 那么所有的内容都回来了。所以 LastPass 和 LastPass Authenticator 也成为了我每个设备的必用软件。

然而时间到了 2019 年,网络安全问题和个人隐私的问题日渐严重,在这样一个时间节点,我发现了 Bitwarden 这样一款软件,更让我惊讶的是从服务端到客户端全开源,并且全平台支持,甚至还支持命令行登录,这一点连 LastPass 都不曾做过。但这个应用服务如今还依然不流行,大多数的潜在用户都被 1Password 或者 LastPass 这样的服务提供方吸收了。基于这样的理由,虽然目前可能自动填充的功能还不及 LastPass, 但 Bitwarden 还是非常值得一试。

简单的看了一下客户端基本用 C# 和 [[TypeScript]] 写成,因为不太熟悉 C# 暂时不看代码了。感兴趣可以自行到 GitHub 审查代码。

Bitwarden 解决了 LastPass 潜在的一些问题,但依然也引入了一些问题。LastPass 带来的问题一个就是安全问题,如何保证用户的密码在服务器同步时的安全性,虽然 LastPass 曾正面出来声明过所有的密码都是由客户端加密再进行传输,服务端是不进行解密的,但是这个不确定性就在于 LastPass 是否可信。另外一个问题就是 LastPass 集中了用户大量的密码,肯定是黑客等等专注需要攻破的系统,一旦发生 LastPass 主密码泄露事件,那么造成的影响就不是一家网站,而是附带的很多网站,那就是互联网的大事情了。而这一点也正是幸运的地方,那么 LastPass 肯定会雇佣一批安全专家对他们的系统进行维护,这远比维护一套自己的 Bitwarden 服务端的安全系数要高。

另外如果自行搭建 Bitwarden 服务端,那么一定要做好充分的安全工作,首先得保证服务器的安全,其次开启系统防火墙,保证只有自己才能访问。先写这么多之后再补充。

安装 Bitwarden 服务端

Bitwarden 的官方网站 提供了各个系统的安装方式。

Bitwarden 自己的服务端 依赖比较重,还需要 MySQL,所以我选择了 Rust 实现的版本

官方的 Wiki 中写的非常详细,使用 Docker Compose 搭建

使用 Bitwarden 客户端

Bitwarden 提供了非常丰富的客户端支持,从桌面端,到浏览器扩展,非常好用,并且 macOS 上还支持指纹。

Bitwarden 结合 Alfred

[[Alfred]] 是 macOS 上一个启动器,Bitwarden 自身支持 cli,两者结合起来就非常方便使用了。

推荐使用:

主要的几个命令:

  • .bwauth 授权
  • .bwconfig 配置
  • .bwf 搜索文件夹
  • .bw search_keyword 搜索关键字

vaultwarden 开启 admin 页面

强烈建议开启 HTTPS 之后再启用 admin 管理页面。

该页面允许管理员检查注册用户并进行管理,即使注册关闭了也允许邀请用户。

在配置中启用 ADMIN_TOKEN:

docker run -d --name bitwarden \
  -e ADMIN_TOKEN=some_random_token_as_per_above_explanation \
  -v /vw-data/:/data/ \
  -p 80:80 \
  vaultwarden/server:latest

强烈推荐使用 openssl rand -base64 48 来生成随机字符串作为 TOKEN。

启用之后页面会在 /admin 页面上使用,进入管理员的页面。

reference


2019-06-15 bitwarden , password , password-manager , lastpass , 1password , chrome , cross-platform

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。