ssh简明教程
0. 前言
本教程内容:
- 如何使用ssh登录Linux服务器
- 如何借助ssh进行传输文件
1. 使用ssh登录Linux服务器
支持 Linux系统、MacOS、windows系统( 需要安装第三方软件: git-scm )
1.1 创建一个rsa密钥对(key pair
)
创建key pair
的命令是
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
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
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
# 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
# 只允许自己访问自己的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
ssh RemoteLinux
第一次登录,ssh会提示检查服务器的指纹是否正确,以来确保登录了正确的服务器。输入yes
然后回车,登录Linux。
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
# 使用此命令,来检查该Linux系统的名称,以此来检查是否登录了正确的Linux系统。
2
hostname
2. 使用ssh进行文件传输
若ssh能够正常登录Linux系统,则表明ssh配置正确。则可以进行电脑之前的数据传输。
在ssh基础之上进行文件传输的工具有很多,本教程主要介绍笔者认为好用的工具:scp、sftp、lftp、rsync、sshfs。
2.1 scp
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
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
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
# 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
# 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