0%

Linux 学习笔记:SSH基础

写在前面

SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。

这则笔记当中,主要包括三个部分:

  • SSH 的基本构架
  • SSH 常用连接方式
  • SSH 远程文件传输

SSH 的基本构架

SSH 的架构是服务器/客户端模式,两端运行的软件是不一样的。OpenSSH 的客户端软件是 ssh,服务器软件是 sshd。

SSH 服务器端

安装及启动

  • 安装
1
2
3
4
# Debian 安装
$ sudo aptitude install openssh-server
# Red Hat (含centos)安装
$ sudo yum install openssh-server
  • 启动及终止
1
2
3
4
5
6
7
8
9
10
11
# 启动
$ sudo systemctl start sshd.service

# 停止
$ sudo systemctl stop sshd.service

# 重启
$ sudo systemctl restart sshd.service

# 设置开机自动运行
sudo systemctl enable sshd.service

配置

sshd 的配置文件在/etc/ssh目录,常用的配置文件有:

  • /etc/ssh/sshd_config:配置文件
  • /etc/ssh/ssh_host_rsa_key:用于存储 RSA 私钥。
  • /etc/ssh/ssh_host_rsa_key.pub:用于存储 RSA 公钥

可以用vim 修改配置文件

1
2
3
4
5
6
7
8
# 修改配置文件
$ vim /etc/ssh/sshd_config

# 验证配置文件是否有语法错误
$ sshd -t

# 必须重启 sshd, 配置文件生效
$ sudo systemctl restart sshd

ssh客户端

安装

linux、macOS通常自带终端,如没有,则采用以下命令安装

1
2
3
4
5
# Ubuntu 和 Debian
$ sudo apt install openssh-client

# CentOS 和 Fedora
$ sudo dnf install openssh-clients

配置

常见配置文件如下:

  • 全局配置文件: /etc/ssh/ssh_config

  • 用户配置文件: ~/.ssh/config

  • 存储私钥文件: ~/.ssh/id_rsa

  • 存储公钥文件: ~/.ssh/id_rsa.pub

修改配置文件,需重启或者使用source 命令,让配置文件生效。

常见连接方式

第一种:密码连接

1
2
3
# use@ 指定登录名
# -p表示指定端口,可不写
$ ssh user@hostname -p 22

之后,按照提示操作,输入密码即可。

第二种:SSH 密钥登录

  • 第一步:客户端生成私钥
1
2
3
4
5
# 采用ssh-keygen命令
# -t 指定加密算法
# -b 指定密钥的二进制位数,推荐2048以上
# -C 密钥文件指定新的注释,格式为username@host
$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"
  • 第二步:上传私钥至服务器

    • 手动上传
1
2
3
4
5
# 方法一:命令行操作
# user@host 为主机用户名@ip
$ cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 方法二:vim 修改~/.ssh/authorized_keys文件,保存后执行source命令
  • 自动上传
1
2
3
4
5
6
7
# ssh-copy-id 命令:自动上传公钥
# -i参数用来指定公钥文件
$ ssh-copy-id -i key_file user@host

# 注:
(1)ssh-copy-id是直接将公钥添加到authorized_keys文件的末尾。
(2)authorized_keys文件的末尾必须要有一个换行符
  • 第三步:设置配置文件权限
1
2
# authorized_keys文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件
$ chmod 644 ~/.ssh/authorized_keys
  • 第四步:修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
#  将下面两行内容的前面的 # 去掉
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys

# 然后,修改下面的内容的 yes 为 no
PasswordAuthentication yes

#修改后效果为
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
  • 第五步:关闭SElinux
1
2
3
4
5
# 临时关闭
setenforce 0

# 永久关闭
输入vi /etc/selinux/config,编辑这个文件,找到SELINUX=enforcing这一行,将enforcing改为disabled,保存退出。
  • 第六步:登陆
1
2
3
4
5
6
# 重启SSH服务,修改生效
# CentOS 6.x:
service sshd restart

# CentOS 7.x:
systemctl restart sshd

SSH 证书登录

证书(Certificate1 authority,简称 CA)是另一种验证机制,证书颁发机构对信任的服务器颁发服务器证书。主要特点有两个:

  • 用户和服务器不用交换公钥,这更容易管理
  • 证书可以设置到期时间,而公钥没有到期时间

实现步骤

  • 客户端:生成 CA 密钥对
1
2
3
4
5
# 采用ssh-Keygen命令
# -C comment 注释
# -b bits 位数
# -f keyfile 证书文件
ssh-keygen -C "server_ca" -b 2048 -f server_ca
  • 添加公钥到服务器端
1
2
3
4
# 修改目标机的/etc/ssh/sshd_config文件,添加刚生产的server_ca.pub信任:
sudo echo "TrustedUserCAKeys /etc/ssh/server_ca.pub" >>/etc/ssh/sshd_config
# 重启sshd服务
sudo systemctl restart sshd
  • 生产客户端密钥对
1
2
3
4
# -t 指定加密方式,可用dsa
ssh-keygen -t dsa -f dsa/id_dsa
# 或 rsa
ssh-keygen -t rsa -f rsa/id_rsa
  • 采用 CA 客户端 SSH 公钥进行签名
1
2
3
4
5
6
# -s:CA 证书私钥
# -I:识别证书的名称。
# -n:识别与此证书关联的名称(用户或主机)
# -V:指定证书的有效期为。 +52W 表示52周过期
# -O option:source-address=address_list :允许用户证书使用的客户端的地址,多个地址用逗号分隔。
ssh-keygen -s /root/ssh/CA/server_ca -I example.com -n root -V +52w id_rsa.pub
  • 登陆说明
1
2
3
# -i 指定加密证书
# 默认加载:id_dsa + id_dsa-cert.pub登陆测试机器
ssh -i id_dsa root@ip

SSH 远程文件传输

rsync 命令:文件传输

  • 安装
1
2
3
4
5
6
7
8
# Debian
$ sudo apt-get install rsync

# Red Hat
$ sudo yum install rsync

# Arch Linux
$ sudo pacman -S rsync
  • 常见用法
1
2
# rsysc 可同时传输多个文件
rsync -参数 source destination

其中,常见参数如下:

  • -r表示递归,即包含子目录
  • -a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
  • --exclude参数指定排除模式
  • --include指定必须同步的文件模式
  • 增量备份
1
2
3
# --link-dest参数指定基准目录/compare/path
# 然后源目录/source/path跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path
$ rsync -a --delete --link-dest /compare/path /source/path /target/path

SCP命令:文件传输

  • 常见用法
1
2
3
4
5
6
7
8
9
# 本地复制到远程
# -r 表示递归,既可以复制文件,也可以将本机整个目录拷贝到远程目录下
$ scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/

# 远程复制到本地
$ scp -r username@server_ip:/path_to_remote_directory local-machine/path_to_the_directory/

# 远程主机A到远程主机B
scp user@host1:directory/SourceFile user@host2:directory/SourceFile

常见参数如下:

  • -r参数表示是否以递归方式复制目录
  • -i指定密钥
  • -v显示详细的输出
  • -c 压缩文件

sftp 文件传输

  • 连接
1
2
3
4
5
# 连接
$ sftp remote_user@remote_host
# 指定端口连接
sftp -P remote_port remote_user@remote_host
# 之后,按提示输入密码
  • 常见操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看目录
ls [directory]
# 切换目录
cd directory
# 创建目录
mkdir directory
# 删除目录
rmdir path
# 本地文件传输到远程主机
put localfile [remotefile]
# 远程文件传输到本地
get remotefile [localfile]
# 显示帮助信息
help
# 退出 sftp的三种方式
# 方式一
bye
# 方式二
quit
# 方式三
exit
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!