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配置文件的 一个好处是许多其他软件如scprsync等也能够读取该配置文件,并将设置转换为相应的标志。

Tmux

一个tmux的tutorial

tmux的好处主要有两点,其一是能够在终端中方便的分屏,其二是允许断开Terminal连接后,继续在远程机器中运行进程。

tmux的视图如下:

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后松开手指,然后按],会将剪贴板中的内容粘贴到光标处