之前的linux 学习笔记内容比较,然后新开了一篇。

  1. linux 使用sz rz命令下载上传文件

rz 是received,上传文件到服务器;sz 是send,从服务器端发送文件到客户端。

sz 服务器下载文件到本地

1
sz filename

rz 从本地上传文件到服务器

1
rz

本地上传文件到服务器,并强制覆盖文件

1
rz  -y
  1. 反向搜索

ctr+r快捷键(推荐): ctrl+r是反向搜索 (reverse-i-search )

  1. find 关键字

这个命令还是非常常见的

1
2
!find ../clothing/images/val/ -maxdepth 1 -type f | head -50 | xargs cp -t "./inference/images/"
# 重点是 -maxdepth 1 -type f 这两个参数

Iperf3网络性能测试工具详解教程

Iperf是美国伊利诺斯大学(University of Illinois)开发的一种开源的网络性能测试工具。可以用来测试网络节点间(也包括回环)TCP或UDP连接的性能,包括带宽、抖动以及丢包率,其中抖动和丢包率适应于UDP测试,而带宽测试适应于TCP和UDP。

zsh 学习笔记

在操作系统内核外有一层壳,而这层壳就是 shell,它是用户和操作系统交互的桥梁。

这很好理解,shell 包住了系统,用户想要跟系统交互,就必须经过shell。

后来,shell 还慢慢变成了内核与用户交互的脚本语言的总称。

我们常见的 shell 有:bash、zsh、csh、ksh、ash 等等。

bash 和 zsh 都是 mac 终端中自带的 shell 命令解释器。 zsh 原称 Z Shell,兼容最常用的 bash 操作和命令,并且有很多增强,超强的定制性,但配置很难, oh-my-zsh 开源工具简化了 zsh 的配置过程。

bash 和 zsh 的区别:配置文件

1
2
bash读取的配置文件:~/.bash_profile文件
zsh读取的配置文件:~/.zshrc文件

安装 zsh

去官网上: oh-my-zsh 的官网地址:https://ohmyz.sh/

1
oh-my-zsh Github 地址:https://github.com/ohmyzsh/ohmyzsh/projects

zsh 的插件

代码高亮插件

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

历史命令智能提示插件

1
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions

在 shell 脚本下的 zsh 自动补全工具

1
2
3
	1  git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-syntax-highlighting
    2  git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-autosuggestions
    3  sudo gedit ~/.zshrc    

基于 ssh 的端口转发

(1) 修改端口号

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

1
ssh -p 2222 user@host # 等同于 ssh -oPort=2222 user@host

(2) 远程操作

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

1
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

这条命令由多个语句组成,依次分解开来看:(1)" ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat » .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)‘cat » .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

1
2
3
4
 # 将$HOME/src/目录下面的所有文件,复制到远程主机的$HOME/src/目录。
 cd && tar czv src | ssh user@host 'tar xz'
 # 将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录。
 $ ssh user@host 'tar cz src' | tar xzv

(3)本地端口转发

”本地端口转发“ 使得 host1 和host3 形成 SSH隧道。

host1 是本地主机,host2 是远程主机,但是host1 和host2 无法直接连通,通过 host3 进行跳转。

1
2
3
ssh -L 2121:host2:21 host3
# 这样 我们只需要连接上 host1 的2121 端口,就等于连接上了 host2 的21 端口
ftp localhost:2121

命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。

1
2
# 将本机的 5900 端口绑定 host3 的5900 端口
ssh -L 5900:localhost:5900 host3

这里例子想说的是:这里的localhost指的是host3,因为目标主机是相对host3而言的

(注意这两个端口的前后顺序,第一个端口是第一个 ip;第二个端口是第二个 ip)

端口转发

1
2
3
4
# 将本地的 9001 端口转发到 host2 的22端口
ssh -L 9001:host2:22 host3
# p 指得是localhost 的端口,进一步就相当于登录了 host2
ssh -p 9001 localhost

将本地端口5000 映射到远程 host2 上的80 端口。前提是远程主机 host1 能够正常连接 host2 的80 端口

1
 ssh -L 0.0.0.0:50000:host2:80 user@host1

img

应用示例

访问服务器端的 visdom(facebook 出品)

1
2
3
4
5
6
7
(1)在服务器端启动 visdom
python -m visdom.server
(2)在客户端输输入以下命令,将服务器端口的 8097 端口映射到客户端
ssh -L 8097:localhost:8097 username@server_ip
(3)在客户端浏览器上查看输入结果
http://localhost:8097

同理 tensorboard 也可以使用相同的方式进行访问。

(4) 远程端口转发 remote forwarding

host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。

我们在 host3 上执行

1
2
3
4
5
# 远程服务器 host1 上的端口 2121 转发到host2 上的21 端口
ssh -R 2121:host2:21 host1
# 绑定之后 在host1 上就可以直接连接 host2
ftp localhost:2121

需要注意的是 ”远程端口转发“的前提条件, host1 和host3 上都有 sshD 和 ssh客户端。

1
ssh -R 0.0.0.0:8080:host2:80 user@host1

将远程 host2 的 80端口映射到 host1 的8080 端口。前提是本机主机可以正常连接到 host2 的80 端口。

(这点是可以作为翻墙的应用的,好好研究一下,有一台机器是能够上外网,其他的能连接上这个机器的也是能够上网的)

(5)动态端口转发(socks 代理)

假设你在局域网A,HostB在局域网B,JumpHost有双网卡可以同时连接到局域网A和B。此时的你想要访问HostB上的web服务,便可以通过如下命令建立代理:

1
ssh -D '[::]:1080' JumpHost

(6)安全性

建议为端口转发建立专门的账户,使用随机密码(当然使用私钥登录更好),并且禁掉其执行命令的权限。最简单的方式为

1
2
3
4
5
6
7
8
# add user tunnel-user for ssh port forwarding
sudo useradd -m tunnel-user
# generate 10 random passwords with 16 length
pwgen -sy1 16 10
# pick one password and set it to tunnel-user
sudo passwd tunnel-user
# disable shell for tunnel-user
sudo chsh -s /bin/false tunnel-user

参考文献

SSH原理与运用(二):远程操作与端口转发

SSH端口转发

1
fuser -v /dev/nvidia*

这个命令可以显示出当前用户使用nvidia 的所有进程号

fuser 命令用于报告进程使用的文件和网络套接字。fuser 命令列出的是本地进程的进程号。

1
 sshfs -o allow_other -p 60002 test@43.254.11.51:/data1/jobs/io /io

allow_other选项很重要,必须添加,否则任何文件都是Permission Deny

如果搭建大家都是用的文件夹,那么一定得注意这个细节

挂载远程服务器文件到本地/ 挂载本地文件到远程服务器的方法

(1)mount remote file in local machine

1
2
3
sshfs -p 60002 kun@43.254.11.51:/ssd ssd/
sshfs -p 60002 kun@43.254.11.51:/data5 data5/
sshfs -p 60002 kun@43.254.11.51:/data2 data_2

(2)mount local file to remote machine

1
2
3
4
5
# run in local machine. ssh forwarding by using port 10000 
ssh jizheng@10.236.249.11 -R 10000:127.0.0.1:22
# run in remote machine. use sshfs to mount in on the other side
mkdir smoke
sshfs -p 10000 -o idmap=user,nonempty root@127.0.0.1:/root/smoke smoke