shell搜索
ag
ggreer/the_silver_searcher: A code-searching tool similar to ack, but faster. (github.com
pip
--user
python - What is the purpose of "pip install --user ..."? - Stack Overflow
pip defaults to installing Python packages to a system directory (such as
/usr/local/lib/python3.4
). This requires root access.
--user
makes pip install packages in your home directory instead, which doesn't require any special privileges.
网络
socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。
ssh 打洞
程序只干两件事, 特判和打洞 –fhq
这里介绍的"打洞"主要是通过 SSH 代理, 实现不同 site 或办公网之间的互相访问.
打洞可能造成安全风险, 建议打洞时监听端口都限制在 127.0.0.1, 以阻止外部访问.
以下 ssh 打洞方式常配合一些保持连接, 不进行登录等参数, 例如:
-o ServerAliveInterval=30
每 30 秒发送一次 keep-alive 包防止断线
-o ServerAliveCountMax=5
若发送 5 次心跳包, 服务器都没有回应, 则断开连接
-o ExitOnForwardFailure=yes
若转发失效, 则断开连接
-N
只打洞, 不执行命令
SSH 三大基础打洞姿势
以下 ssh 参数用于附加在正常 ssh 命令上. 比如, 正常连 ssh 是 ssh workspace1
(配置了 ~/.ssh/config
), 那使用 -D 7071 Host
时, 命令为 ssh -D 7071 workspace1
ssh -D localAddr:localPort Host
效果是开一个可用作一般 socks5 的代理在 localAddr:localPort 上, 当使用此代理时, 相当于在用 Host 的网络访问.
例如, 要访问 brain++ 内网的 lovelive 网页时, 可以 ssh -D 127.0.0.1:7071 workspace1
, 然后设置浏览器代理为 socks5://127.0.0.1:7071
. 这样, 浏览器访问网页时, 就相当于在用 workspace1 的网络访问, 从而可以访问到 brain++ 内网服务.
ssh -L localAddress:localPort:remoteAddr:remotePort Host
访问 localAddr:localPort 相当于在 Host 上访问了 remoteAddr:remotePort
例如, 要访问 workspace1 上的 jupyter, jupyter 监听在 workspace1 上的 localhost:8888 上. 可以 ssh -L 127.0.0.1:7777:localhost:8888 workspace1
. 这样, 通过浏览器访问 127.0.0.1:7777 时, 相当于在 workspace 上, 访问了 localhost:8888, 即可访问到 jupyter 网页
ssh -R remoteAddr:remotePort:localAddr:localPort Host
在 Host 上访问 remoteAddr:remotePort 相当于访问了 localAddr:localPort
例如, 办公网本机通过 python -m http.server 8000 --bind 127.0.0.1
启动了一个 HTTP server 服务, 想在 workspace1 上访问. 可以本机执行 ssh -R 127.0.0.1:7000:127.0.0.1:8000 workspace1
. 这样, 在 workspace1 上执行 curl 127.0.0.1:7000
时, 相当于访问了办公网本机的 127.0.0.1:8000 端口, 即可访问到 HTTP server.
复合 SSH 打洞举例
20181018 SSH 打洞 - liveness space - Meg-Wiki (megvii-inc.com)