ssh简明教程


作者Lou Xiao创建时间2020-05-25 11:11:00更新时间2022-12-05 20:07:40

0. 前言

本教程内容:

  • 如何使用ssh登录Linux服务器
  • 如何借助ssh进行传输文件

1. 使用ssh登录Linux服务器

支持 Linux系统、MacOS、windows系统( 需要安装第三方软件: git-scm

1.1 创建一个rsa密钥对(key pair)

创建key pair的命令是

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 ssh-keygen -t rsa -b 8192
  • -t rsa : key pair的加密算法,rsa就是RSA加密算,默认选择。
  • -b 8192 : 指定密钥长度是8192比特,数值越大越安全(仅指被黑客破解网络加密传输的安全性)
    • 密钥文件的安全性还在于要保密 ~/.ssh/id_rsa
    • 如果不小心泄漏 ~/.ssh/id_rsa,第一时间创建新的密钥对,并更新服务器上的公钥。
  • 把公钥文件 ~/.ssh/id_rsa.pub 添加到远程Linux系统账户下的 ~/.ssh/authorized_keys

注:
- ssh采用RSA非对称加密算法,来保证端到端的数据传输的安全性和私密性。rsa算法需要一对密钥进行数据的加密和解密;
- private key是私钥,顾名思义,不能与任何人分享,需要保密,用来解密public key加密的数据;
- public key是公钥,顾名思义,可以与任何人分享,一般用来进行数据的加密。

执行此命令输出如下:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 Generating public/private rsa key pair.
2 Enter file in which to save the key (/home/admin/.ssh/id_rsa): [回车]
3 Enter passphrase (empty for no passphrase): [回车] # 留空则无密码保护;如果输入文字作为key pair的保护密码。
4 Enter same passphrase again: [回车] # 如果设置密码,则重复一遍密码。
5 Your identification has been saved in /home/admin/.ssh/id_rsa. # 此行提示 私钥 保存的路径
6 Your public key has been saved in /home/admin/.ssh/id_rsa.pub. # 此行提示 公钥 保存的路径
7 The key fingerprint is:
8 SHA256:BIQZafmxmMQB3SmW4Tk1ySQhfHqCvaJptXcugWGRdyg admin@localhost.localdomain
9 The key's randomart image is:
10 +---[RSA 4096]----+
11 | .o+B/Bo |
12 | .E#**+ |
13 | o *B=.o. |
14 |. +o+.o. |
15 | .+o S |
16 |. .o . |
17 |.o. . . |
18 |o. . o . |
19 |. . +. |
20 +----[SHA256]-----+
1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 使用该命令查看刚才新建的密钥文件。
2 ls -hl ~/.ssh

这样就创建好了密钥对,其中 ~/.ssh/id_rsa 为私钥;~/.ssh/id_rsa.pub为公钥。

1.2 添加客户端ssh的配置文件 ~/.ssh/config

假设待登录的远程Linux系统:
- 名称:RemoteLinux(任何字母数字代号均可,随意取名)
- IP地址: 192.168.1.100
- SSH端口:22(默认),或者其它端口
- 账户用户名:my_name

则~/.ssh/config 如下:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # Global Configure 全剧默认配置
2 Host *
3 # uncomment this line to disable check ~/.ssh/known_hosts
4 # StrictHostKeyChecking no
5 ServerAliveInterval 1
6 ServerAliveCountMax 30
7 ForwardAgent no
8 ForwardX11 no
9 ForwardX11Trusted no
10 GSSAPIAuthentication no
11
12 # ======================================
13 # My Remote Host
14 # ======================================
15
16 Host RemoteLinux
17 HostName 192.168.1.100
18 Port 22
19 User my_name
20 IdentityFile ~/.ssh/id_rsa # 刚刚创建的私钥文件

说明:

  • StrictHostKeyChecking
  • no: 禁止检查~/.ssh/known_hosts;用来解决Server端的public key频繁变化的问题。
  • ForwardX11
  • 在安全性未知的服务器上执行X11程序存在安全隐患;
  • no:禁止在远程服务器上执行X11程序(访问本机的数据);
  • yes:允许在远程服务器上执行X11程序(访问本机的数据);
  • ForwardX11Trusted
  • no:表示不信任任何服务器,拒绝执行不安全的X11程序。
  • yes:完全“信任”远程服务器,允许执行任何(甚至存在安全风险的)的X11程序。

1.3 修改文件的权限

ssh对文件的权限超级敏感,若文件权限错误,ssh直接报错!执行下述操作,撤销group、other的权限。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 只允许自己访问自己的Home目录
2 chmod og-rwx ~
3
4 # 只允许自己访问~/.ssh目录
5 chmod -R og-rwx ~/.ssh
6
7 # 查看权限,确保 group、other的权限清除掉。
8 ls -hl ~
9
10 ls -R -hl ~/.ssh

1.4 把公钥添加到远程Linux系统的账户

把 ~/.ssh/id_rsa.pub(public key) 的内容复制一份,追加到 ~/.ssh/authorized_keys 文件尾部。~/.ssh/authorized_keys 可以添加多个公钥,每个公钥必须是一行,若格式错误,则无法登陆。

1.5 测试

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 ssh RemoteLinux

第一次登录,ssh会提示检查服务器的指纹是否正确,以来确保登录了正确的服务器。输入yes然后回车,登录Linux。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 The authenticity of host 'localhost (127.0.0.1)' can't be established.
2 ECDSA key fingerprint is SHA256:hJmlBX46//sd1559Eo2X+eiJ9YGcgig8eZJ5Y98PD0A.
3 Are you sure you want to continue connecting (yes/no/[fingerprint])?

若出现新的终端界面,则表示登录成功。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 使用此命令,来检查该Linux系统的名称,以此来检查是否登录了正确的Linux系统。
2 hostname

2. 使用ssh进行文件传输

若ssh能够正常登录Linux系统,则表明ssh配置正确。则可以进行电脑之前的数据传输。
在ssh基础之上进行文件传输的工具有很多,本教程主要介绍笔者认为好用的工具:scp、sftp、lftp、rsync、sshfs。

2.1 scp

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1. 上传文件,把本地电脑上的文件local-file.bin上传到 远程系统RemoteLinux的用户目录下面。
2 scp local-file.bin RemoteLinux:
3
4 # 或者指定具体的路径
5 scp /path/to/local/file remote-name:/path/to/remote/file
6
7 # 2. 下载文件,简单交换命令行的两个路径的位置就能实现
8 scp remote-name:/path/to/remote/file /path/to/local/file

2.2 sftp

sftp是借助ssh的加密线路进行文件传输的,使用方式模仿了经典FTP。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 sftp RemoteLinux
2 Connected to RemoteLinux.
3 # 进入sftp的交互界面,常用的指令由put、get
4 # 1. 上传文件
5 put /path/to/local/file /path/to/remote/file
6 # 2. 下载文件
7 get /path/to/remote/file /path/to/local/file

2.3 lftp

scp、sftp这些工具比较简陋,传输大量文件的时候,不够给力,这个时候,lftp就可以大展拳脚。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 lftp sftp://RemoteLinux
2 # 进入lftp的交互界面,支持的命令很多,这里仅介绍一个指令mirror,超级强大的指令。
3 # 如果上传一个文件夹/path/to/local/dir到远程电脑上/path/to/remote/dir:
4 # -R 表示上传
5 # -P 5 同时传输5个文件
6 # -c 续传,从上次中断的地方继续传输
7 # -v 打印一些信息,看看正在干啥?
8 # --use-pget-n=5 把一个文件拆分成5份,同时传输5份,加速文件传输。
9 mirror -R -P 5 -c -v --use-pget-n=5 /path/to/local/dir /path/to/remote/dir
10
11 # 文件夹的下载
12 # 与上面的命令对比一下差异,去掉了-R, 调换了文件夹的位置。
13 mirror -P 5 -c -v --use-pget-n=5 /path/to/remote/dir /path/to/local/dir

2.4 rsync

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1. 文件上传,上传一个文件夹/path/to/local/dir到远程电脑上/path/to/remote/dir:
2 rsync -avm --progress /path/to/local/ RemoteLinux:/path/to/remote/dir/
3
4 # 2. 文件下载,调换一下路径的位置。
5 rsync -avm --progress RemoteLinux:/path/to/remote/dir/ /path/to/local/
6
7 # 3. 高阶操作,不传输某些文件,此处使用了通配符
8 # --exclude=".*" 剔除 . 开头的文件
9 # --exclude="*.txt" 剔除 .txt 文件
10 rsync -avm --progress --exclude=".*" RemoteLinux:/path/to/remote/dir/ /path/to/local/
11
12 # 4. 高阶操作,仅输某些文件,此处使用了通配符
13 # --include="*.txt" 仅包含 .txt 文件
14 rsync -avm --progress --include="*.txt" --include="*/" --exclude="*" RemoteLinux:/path/to/remote/dir/ /path/to/local/

2.5 sshfs

sshfs懒人的神器,超级方便,把远程电脑的文件夹挂在到本地电脑上,当作本地文件操作。

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 # 1. 在本地电脑创建一个空的文件夹作为挂载点。
2 mkdir -p mount-point-dir
3
4 # 2. 把RemoteLinux的/path/to/dir挂载到 mount-point-dir
5 sshfs RemoteLinux:/path/to/dir mount-point-dir
6
7 # 3. 如果不用了,卸载这个目录
8 fusermout -u mount-point-dir
文章目录