Useful Linux Tool
# cat
cat 很简单,这里给出一个表即可:

# ssh
基础功能:
使用 ssh 连接到服务器
高级功能:
本地端口转发 (Local Port Forwarding) 和远程端口转发 (Remote Port Forwarding):
本地端口转发意味着客户端开始监听一个新的端口号 (如下图所示):
在下图中意味着客服端 (Client) 除了监听端口 (8080) 外,还监听服务器 (图中的 Server) 的 80 端口。
图中箭头的朝向指的是客户端请求 8080 端口时,请求的流向,请求最终会到达 Server 的 80 端口。

远程端口转发意味着服务器端开始监听一个新的端口号 (如下图所示):
在下图中意味着服务器 (图中的 gateway) 除了监听端口 (8080) 外,还监听的 client 的 80 端口。
图中箭头的朝向指的是服务器端请求 8080 端口时,请求的流向,请求最终会到达 Client 的 80 端口。
注意在服务器端的
/etc/sshd/sshd_config文件中,需要设置GatewayPorts yes使得服务器能够监听客服端的端口。

何时使用本地端口转发? 何时使用远程端口转发?
看 web server 在哪一端:
- 如果在本地端,那么就应该使用远程端口转发,使得远程能够获取到本地的服务。
- 如果在远程端,那么就应该使用本地端口转发,使得本地能够获取到远程的服务。(也可以通过 vscode ssh 连接到 remote, 然后在远程启动 web server 时,vscode 会自动询问是否需要进行端口转发)
使用场景举例:
场景一 (远程端口转发): 比如我的博客 vdoing (opens new window) 在书写时,使用 yarn dev 命令进行预览,VuePress dev server 会预览动态部署到 localhost 的 8080 端口,此时,如果我需要在另一个服务器 (tartarus) 上通过浏览器上查看进行预览,就可以使用远程端口转发,因为此时相当于远程需要监听本地的 8080 端口:
# address为远程端的ip地址, -p9900是因为只有一个公网IP,使用了软路由的端口转发功能,转发到tartarus的22端口(ssh的端口)
ssh -R 8350:localhost:8080 tartarus@address -p 9900
2
然后在远程端的浏览器上使用 http://0.0.0.0:8350 即可访问到博客预览。
场景二 (本地端口转发): 将在远程端运行的 reveal-md 的浏览器预览,在客户端的浏览器上使用。
使用本地端口转发,相当于本地端除了需要监听 8080 端口外,还监听了远程端的 1948 端口。
# 第一个localhost可省略
ssh -L localhost:9756:localhost:1948 tartarus@address -p 9900
2
然后在本地浏览器上使用 http://localhost:9756
# rsync vs scp
参考资料:stackoverflow: rsync vs scp (opens new window)
性能对比
scp: 读取源文件并将其写入目标文件,它执行一个简单的复制,常用于网络复制。(也可以进行本地复制,但是本地复制cp更常用)rsync: 读取源文件并将其写入目标文件,使用增量传输算法,复制速度快。

复制途中的中断处理
scp: 如果文件复制过程中因为网络原因发生中断,无法进行恢复。rsync: 如果文件复制过程中因为网络原因发生中断,可以进行恢复 (需要使用命令选项-P)
使用举例:
scp: (如果使用 ssh 连接到服务器的 22 端口,则不需要 - P 选项。)
# 将sever的~/file文件复制到本地当前目录下的file文件 scp -P port_number remote_user_name@ip_address:~file ./file # 将本地的file文件复制到server的~/file文件 scp -P port_number ./file remote_user_name@ip_address:~/file1
2
3
4
5rsync: 使用 ssh 作为管道进行传输,举例如下:
# 将sever的~/file文件复制到本地当前目录下的file文件 rsync -aP --rsh='ssh -P port_number' remote_user_name@ip_address:~/file ./file # 将本地的file文件复制到server的~/file文件 rsync -aP --rsh='ssh -P port_number' ./file remote_user_name@ip_address:~/file1
2
3
4
5复制一个 55MB 的文件消耗时间的对比:
scp需要大约 2s,rsync需要大约 1s.$ time rsync -aP --rsh='ssh -p 9900' tartarus@114.214.175.230:/home/tartarus/record.zip . record.zip 57896417 100% 409.00MB/s 0:00:00 (xfer#1, to-check=0/1) sent 53308 bytes received 30535 bytes 55895.33 bytes/sec total size is 57896417 speedup is 690.53 rsync -aP --rsh='ssh -p 9900' . 0.25s user 0.03s system 26% cpu 1.052 total $ time scp -P 9900 tartarus@114.214.175.230:/home/tartarus/record.zip . record.zip 100% 55MB 38.5MB/s 00:01 scp -P 9900 tartarus@114.214.175.230:/home/tartarus/record.zip . 0.23s user 0.30s system 25% cpu 2.035 total1
2
3
4
5
6
7
8
9
10
11
提示
- 使用 rsync 进行复制时建议带上
-a参数 (-a 等价于 -rlptgoD),这样除了可以复制文件夹外,还保留了权限,修改时间,文件 / 文件夹所属 group/user 等信息。 - 使用
rsync -a代替cp