ssh和tmux是使用远程服务器时常使用的工具,本文将介绍ssh和tmux的基本用法。
使用SSH进行远程登录
本文大部分内容取自MIT的 The Missing Semester of Your CS Education 课程讲义
基本用法
对于程序员来说,在日常工作中使用远程服务器已经变得越来越普遍。如果需要使用远程服务器来部署后端软件,或者需要使用具有更高计算能力的服务器,常用的工具为Secure Shell (SSH),SSH是高度可配置的。
要ssh
到服务器,可以执行如下命令:
ssh foo@bar.hust.edu # bar.hust.edu也可以替换为IP地址
这里我们尝试以用户foo的身份ssh
到服务器bar.hust.edu
。可以使用URL(如bar.hust.edu
)或IP(如192.168.1.42
)指定服务器。
第一次登录时会提示:
The authenticity of host 'xxxxxxxxxx' can't be established.
ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes,然后回车即可。这样会将该服务器的信息记录在~/.ssh/known_hosts
文件中,然后输入用户密码即可登录到远程服务器中。
默认登录端口号为22,如果想登录某一特定端口可使用-p
来制定端口号:ssh user@hostname -p 22
稍后我们将看到,如果修改ssh
的配置文件,就可以直接使用类似ssh bar
之类的命令访问服务器,而无需每次登录时都输入长且难以记忆的服务器域名或IP地址。
执行命令
ssh的一个经常被忽视的特性是在远程直接运行命令的能力。命令格式:
ssh user@hostname command
例如,ssh foobar@server ls
将在位于远程机器的foobar
的家目录中执行ls。
它还能利用管道,例如:ssh foobar@server ls | grep PATTERN
将在本地grep
远程机器ls
命令的结果,即通过网络将远程ls
的结果传输到本地,然后再执行grep
命令;ls | ssh foobar@server grep PATTERN
将在远程grep
本地ls
的结果,即将本地ls
的结果通过网络传输到远程机器,然后在远程机器中执行grep
命令。
SSH 秘钥
为避免每次登录时都需要输入密码,可使用基于公钥与私钥的加密技术。
生成密钥
最简单的方法就是直接执行 ssh-keygen
命令,然后一直按回车即可,如下所示:
执行结束后,~/.ssh/目录下会多两个文件:
-
id_rsa
:私钥 -
id_rsa.pub
:公钥
此外,ssh-keygen
命令还有其他选项以增强安全性,例如:
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519
在上面的命令中:
-o
选项表示使用 OpenSSH 格式来保存生成的密钥对。OpenSSH 格式在安全性和功能方面有一些改进,例如支持加密算法更强大的 KDF(Key Derivation Function)。-a 100
选项设置 KDF 迭代次数为 100。增加迭代次数可以增强密钥的派生过程,从而增加破解密钥所需的计算成本。-t ed25519
选项指定要生成的密钥对的加密算法为 Ed25519。Ed25519 是一种基于椭圆曲线的密码学算法,被广泛认为比传统的 RSA 算法更高效和安全。-f ~/.ssh/id_ed25519
选项指定生成的密钥对的文件路径和文件名。在这种情况下,生成的私钥将保存在~/.ssh/id_ed25519
文件中。
使用秘钥进行身份认证
远程机器的SSH将查看~/.ssh/authorized_keys
,以确定应该允许哪些客户登录。因此,若想免密码登录哪个服务器,就将公钥传给哪个服务器。例如,若想免密登录myserver
服务器,就将公钥中的内容复制到myserver
中的~/.ssh/authorized_keys
文件里。
可执行以下命令将公钥内容复制到服务器中:
cat ~/.ssh/id_rsa.pub | ssh foobar@myserver 'cat >> ~/.ssh/authorized_keys'
也可以执行ssh-copy-id
命令进行公钥复制:
ssh-copy-id -i ~/.ssh/id_rsa.pub foobar@myserver
通过SSH传输文件
ssh + tee
,最简单的方法是通过ssh
执行tee
命令再结合STDIN
输入。例如,执行cat localfile | ssh remote_server tee serverfile
,将本地的localfile
传输到远程机器上的serverfile
中。
scp
,当复制大量文件/目录时使用scp
命令更方便。格式为scp path/to/local_file remote_host:path/to/remote_file
。
scp
一次复制多个文件:
scp source1 source2 destination
复制文件夹:
# 将本地家目录中的tmp文件夹复制到remote_host服务器中的/home/acs/目录下。
scp -r ~/tmp remote_host:/home/acs/
#将myserver服务器中的~/homework/文件夹复制到本地的当前路径下。
scp -r remote_host:homework .
指定服务器的端口号:
scp -P 22 source1 source2 destination
配置SSH
创建文件 ~/.ssh/config
,然后在文件中输入:
Host myserver1
User foobar
HostName 172.16.174.141
IdentityFile ~/.ssh/id_rsa
之后再使用服务器时,可以直接使用别名myserver1
,例如:
ssh myserver1 # ssh foobar@172.16.174.141
使用~/.ssh/config
配置文件的 一个好处是许多其他软件如scp
、rsync
等也能够读取该配置文件,并将设置转换为相应的标志。
Tmux
一个tmux的tutorial。
tmux的好处主要有两点,其一是能够在终端中方便的分屏,其二是允许断开Terminal连接后,继续在远程机器中运行进程。
tmux的视图如下:
一个tmux可以包含多个session,一个session可以包含多个window,一个window可以包含多个pane。
实例:
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2
...
tmux的具体操作方法可以观看MIT的the missing semester课程
一个仅供参考的操作总结如下:
# 注意:tmux执行命令时需要使用前缀键,默认前缀为Ctrl + b。
# 以下命令通过修改tmux的配置文件将Ctrl + b映射为Ctrl + a,因为键盘上a与Ctrl的距离更近
操作:
(1) tmux:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框。
(2) 按下Ctrl + a后手指松开,然后按%:将当前pane左右平分成两个pane。
(3) 按下Ctrl + a后手指松开,然后按"(注意是双引号"):将当前pane上下平分成两个pane。
(4) Ctrl + d:关闭当前pane;如果当前window的所有pane均已关闭,则自动关闭window;如果当前session的所有window均已关闭,则自动关闭session。
(5) 鼠标点击可以选pane。
(6) 按下ctrl + a后手指松开,然后按方向键:选择相邻的pane。
(7) 鼠标拖动pane之间的分割线,可以调整分割线的位置。
(8) 按住ctrl + a的同时按方向键,可以调整pane之间分割线的位置。
(9) 按下ctrl + a后手指松开,然后按z:将当前pane全屏/取消全屏。
(10) 按下ctrl + a后手指松开,然后按d:挂起当前session。
(11) tmux a:打开之前挂起的session。
(12) 按下ctrl + a后手指松开,然后按s:选择其它session。
方向键 —— 上:选择上一项 session/window/pane
方向键 —— 下:选择下一项 session/window/pane
方向键 —— 右:展开当前项 session/window
方向键 —— 左:闭合当前项 session/window
(13) 按下Ctrl + a后手指松开,然后按c:在当前session中创建一个新的window。
(14) 按下Ctrl + a后手指松开,然后按w:选择其他window,操作方法与(12)完全相同。
(15) 按下Ctrl + a后手指松开,然后按PageUp:翻阅当前pane内的内容。
(16) 鼠标滚轮:翻阅当前pane内的内容。
(17) 在tmux中选中文本时,需要按住shift键。(仅支持Windows和Linux,不支持Mac,不过该操作并不是必须的,因此影响不大)
(18) tmux中复制/粘贴文本的通用方式:
(1) 按下Ctrl + a后松开手指,然后按[
(2) 用鼠标选中文本,被选中的文本会被自动复制到tmux的剪贴板
(3) 按下Ctrl + a后松开手指,然后按],会将剪贴板中的内容粘贴到光标处