主页

引言

在之前SSH原理与实践系列文章中,我们主要讲解了SSH协议的原理部分。作为该系列文章的最后一篇,本文将对SSH实践部分进行介绍。

好文回顾

本文主要内容如下:

  • SSH安装和部署
  • SSH常用命令使用

SSH安装和部署

SSH采用了C-S架构,因此有客户端和服务端两个程序需要安装,其中被访问的实体需要安装SSH服务端程序, 我们叫做ssh-server, 发起访问请求的实体需要安装SSH客户端程序, 我们叫做ssh-client。 值得注意的是,一般情况下ssh-server会以守护进程sshd运行在服务端,ssh-client一般通过命令ssh发起访问。

安装SSH客户端

ssh-client安装

  1. 在Ubuntu或Debian上,执行以下命令安装SSH客户端
sudo apt update
sudo apt install openssh-client
  1. 在CentOS或Red Hat上,执行以下命令安装SSH客户端
sudo yum install openssh-clients
  1. 在macOS上
macOS通常已经预装了SSH客户端,您可以在终端中直接使用

ssh-client配置

客户端ssh程序会加载并使用在~/.ssh/config中的配置,如果文件不存在则使用默认配置。以下是一个SSH客户端配置文件示例:

# SSH Client Configuration

# 默认选项
Host *
# SSH默认端口号是22,如果使用了非默认端口,可以在这里设置
# Port 2222 # 默认身份验证方式是通过密码认证,如果使用SSH密钥认证,可以在这里指定私钥文件路径
# IdentityFile ~/.ssh/id_rsa # 设置连接超时时间,单位为秒
# ConnectTimeout 30 # 是否开启SSH数据压缩
# Compression yes # 主机别名为"example-server"
Host example-server
# 实际的远程主机IP地址或主机名
HostName 192.168.1.100 # 远程登录使用的用户名
User user1 # 使用指定的私钥文件进行身份验证
IdentityFile ~/.ssh/example_id_rsa # 自定义端口号
Port 2222 # 主机别名为"another-server"
Host another-server
HostName example.com
User user2
IdentityFile ~/.ssh/another_id_rsa

在上述配置文件示例中:

  • Host *: 用于设置默认的连接选项,所有主机都会应用这些选项,除非在后面针对特定主机设置了不同的选项。
  • Host example-server: 定义一个主机别名为"example-server",下面的配置选项仅适用于该主机。
  • HostName: 指定远程主机的IP地址或主机名。
  • User: 指定远程登录时使用的用户名。
  • IdentityFile: 指定SSH私钥文件的路径,用于密钥对身份验证。
  • Port: 指定远程SSH服务监听的端口号,默认是22。
  • ConnectTimeout: 设置连接超时时间,如果在指定时间内无法连接上远程主机,则连接会失败。
  • Compression: 是否启用SSH数据压缩,可以加快数据传输速度。

请注意,配置文件中的选项不仅限于上述示例,还可以根据需求设置其他选项,例如代理设置、跳板主机、端口转发等。在配置SSH客户端时,建议先备份原始配置文件,并根据需求谨慎调整配置,以免出现错误导致无法连接到远程主机。

安装 SSH 服务

ssh-server安装

  1. 在 Ubuntu/Debian 上,执行以下命令来安装 SSH 服务器
#安装
sudo apt update
sudo apt install openssh-server # 查看状态
sudo service sshd status # 启动
sudo service sshd start
  1. 在 CentOS/Red Hat 上,执行以下命令来安装 SSH 服务器
#安装
sudo yum install openssh-server #查看状态
sudo systemctl status sshd #启动
sudo systemctl start sshd
  1. macOS通常已经预装了OpenSSH服务端,但默认情况下它可能未启动。您可以通过系统偏好设置中的“共享”选项来启动SSH服务。也可以通过命令行方式启动,如下:
# 查看状态。 注:如果返回为空,说明未启动
sudo launchctl list | grep sshd # 启动
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist # 关闭
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist

ssh-server配置

SSH服务端配置文件通常位于Linux系统中的/etc/ssh/sshd_config文件 (注:其他系统可能有差别)。注意,在修改此文件之前,最好先备份原始配置,并确保您具有管理员权限。以下是一个SSH服务端配置文件示例:

# SSH Server Configuration

# 端口号,SSH默认端口是22,您可以修改为其他端口,注意避免使用已经被其他服务占用的端口
Port 22 # 是否允许密码认证登录,建议使用SSH密钥认证
PasswordAuthentication yes # 是否允许root用户通过SSH登录,一般情况下不建议直接使用root登录SSH
PermitRootLogin no # 是否启用公钥认证,建议启用以提高安全性
PubkeyAuthentication yes # 允许哪些用户组访问SSH服务(注:设置后只有属于sshusers用户组的用户可以使用ssh客户端访问该服务)
AllowGroups sshusers # 允许哪些用户访问SSH服务(注:设置后只有user1和user2用户可以使用ssh客户端访问该服务)
AllowUsers user1 user2 # 是否允许TCP转发,默认为yes
AllowTcpForwarding yes # 是否允许X11转发,默认为no
X11Forwarding yes # 是否允许Agent转发,默认为no
AllowAgentForwarding yes # 是否允许密码更改,默认为yes
AllowTcpForwarding yes # 是否允许TCP转发,默认为yes
TCPKeepAlive yes # 是否启用压缩,可以加快数据传输速度,默认为yes
Compression yes # 登录时的Banner提示信息,可以自定义显示内容
Banner /etc/ssh/banner # 允许的登录尝试次数,达到次数后会自动断开连接
MaxAuthTries 3 # 登录会话的超时时间,单位为秒,默认为900秒(15分钟)
ClientAliveInterval 900
ClientAliveCountMax 3 # 是否启用TCP Wrapper,默认为no (注:这里使用PAM对用户进行认证,本质上会使用/etc/passwd和/etc/shadow进行口令检查)
UsePAM yes # 使用GSSAPI进行用户认证,默认为no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes # 是否启用SELinux支持,默认为no
SELinux no # 是否启用系统登录限制,默认为no
UseLogin no # 是否启用chroot目录,默认为no
ChrootDirectory none

上述示例是SSH服务端配置文件的一部分,其中包含了一些常见的配置选项。请注意,实际的配置选项可能因系统和需求而有所不同。在修改配置文件时,建议仔细阅读官方每个选项的说明和注释,确保理解其含义和影响,并根据实际需求进行设置。

修改配置文件后,需重启SSH服务以使更改生效。

SSH常用命令使用

OpenSSH提供了完善的SSH工具集,包括sshsshdsftp以及scp等等。其中ssh和sshd是ssh工具集的基础程序。ssh、sftp和scp都是客户端工具,它们的服务端都是sshd。

在安装完ssh-client后,除了ssh外,默认同时安装了sftp和scp工具。 后面我们将分开介绍这些常用的工具。

环境准备

启动ssh服务

由于本人使用的是MacOS系统,默认已安装ssh,现在我们通过命令方式启动ssh-server,使用系统默认配置 /etc/ssh/sshd_config (配置文件内容较为敏感,不易展示,略)

# 查看ssh服务状态 (注:未查询到,表示ssh服务未启动)
➜ ssh-server-dir sudo launchctl list | grep sshd # 启动ssh服务
➜ ssh-server-dir sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist # 再次查看ssh服务状态
➜ ssh-server-dir sudo launchctl list | grep sshd
- 0 com.openssh.sshd

设置ssh客户端配置

为了后文演示方便,我们对ssh客户端进行简单配置

➜  ~ vim ~/.ssh/config

# host配置,这里的Host在使用时可以用作别名,不用每次输入ip地址
Host ssh-server
HostName 127.0.0.1 # ssh服务器的ip地址
User hxy # 登陆ssh服务器时使用的用户名
IdentityFile ~/.ssh/id_rsa #客户端本地ssh密钥(私钥文件),在公钥认证模式下使用。

SSH登陆

命令ssh常用来进行远程登陆

➜  ssh-server-dir ssh ssh-server
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:MxBgZOViGL/iQAWzNs5L80lPeRNNNxt15e2km+Ee35U.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:20: localhost
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.
(hxy@127.0.0.1) Password:
Last login: Fri Aug 4 16:39:10 2023

说明:

  • 由于我们对ssh客户端进行了配置,这里可以使用ssh-server这个别名进行登陆,用户名默认使用了hxy
  • 虽然我们配置了IdentityFile,但我们未开启免密登陆,这里需要输入用户hxy的口令。 使用ssh-copy-id开启免密登陆请参考 SSH原理与实践(一)
  • 最后的Last login表示我们登陆成功,并打印了登陆时间。

SCP文件复制

SCP: 是一个基于SSH协议的安全文件复制命令,用于在本地计算机和远程主机之间进行加密的文件传输。以下是一些常用的scp命令及其用法:

# 从本地计算机上传文件到远程主机
scp local_file username@hostname:remote_path
# 远程主机下载文件到本地计算机
scp username@hostname:remote_file local_path
# 复制整个目录
scp -r local_directory username@hostname:remote_path

以文件上传为例:

# 服务端工作目录
➜ ssh-server-dir ls
server_file
➜ ssh-server-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-server-dir
➜ ssh-server-dir cat server_file
ssh server
# 客户端工作目录
➜ ssh-client-dir ls
client_file
➜ ssh-client-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-client-dir
➜ ssh-client-dir cat client_file
ssh client

在ssh客户端的工作目录下

# 从本地计算机上传文件到远程主机
➜ ssh-client-dir scp ./client_file ssh-server:/Users/hxy/wkdir/ssh-test/ssh-server-dir
(hxy@127.0.0.1) Password:
client_file 100% 11 19.4KB/s 00:00

我们登陆到服务器进行查看

➜  ssh-server-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-server-dir
➜ ssh-server-dir ls
client_file server_file #这里看到了刚才复制过来的client_file文件
➜ ssh-server-dir cat client_file
ssh client # 文件内容与客户端的一致

SFTP文件上传和下载

SFTP是一种基于SSH协议的安全文件传输协议,用于在本地计算机和远程主机之间进行加密的文件传输。类似scp,但更适用于文件列表查看、多文件上传下载的场景,目前许多文件上传下载的可视化工具基本都是基于sftp进行开发的。

以下是一些常用的SFTP命令及其用法:

# 连接到远程主机(注:username为您的用户名,hostname为远程主机的IP地址或域名)
sftp username@hostname # 将本地文件上传到远程主机
put local_file remote_path # 从远程主机下载文件到本地计算机
get remote_file local_path # 列出远程目录内容
ls # 退出SFTP会话
exit

以文件下载为例:

# 查看本地工作目录
➜ ssh-client-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-client-dir
➜ ssh-client-dir ls
client_file #只有client_file文件 # 连接远程主机ssh-server
➜ ssh-client-dir sftp ssh-server
(hxy@127.0.0.1) Password:
Connected to ssh-server.
# 进入远程目录
sftp> cd /Users/hxy/wkdir/ssh-test/ssh-server-dir
# 查看目录内容
sftp> ls
client_file server_file
# 复制server_file文件,如果未指定本地文件名,则使用原始文件名
sftp> get server_file
Fetching /Users/hxy/wkdir/ssh-test/ssh-server-dir/server_file to server_file
server_file 100% 11 13.3KB/s 00:00 # 退出会话
sftp> exit # 查看本地文件
➜ ssh-client-dir ls
client_file server_file # server_file为刚才下载的服务端文件
➜ ssh-client-dir cat server_file
ssh server #文件内容无误

结论

本文详细介绍了ssh的安装和部署、介绍了ssh客户端和服务端程序使用的配置文件以及关键配置、最后针对ssh常见工具集进行了详细介绍。

在云计算时代,作为一名软件开发者,熟练配置和使用ssh工具,能够提高运维效率、和运维安全性,希望本文有所帮助。

参考资料

SSH原理与实践(三)安装和使用的更多相关文章

  1. WebSocket原理与实践(三)--解析数据帧

    WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义:   在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...

  2. SSH 的原理和实践

    最近自己在学习使用SSH,现将自己理解的SSH原理和实践SSH的操作写成一篇博客,以供日后查看. 一.SSH是什么?为什么会出现SSH? SSH英文全称是Secure Shell,即安全外壳.首先SS ...

  3. 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践

    2017-2018-2 20155228 <网络对抗技术> 实验三:MAL_免杀原理与实践 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasi ...

  4. kafka原理和实践(三)spring-kafka生产者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  5. SSH原理讲解与实践

    一.简介 SSH全名Secure Socket Shell,安全外壳传输协议.专为远程登录会话和其他网络服务提供安全性的协议 二.加密算法 要了解SSH的原理,就要先知道目前主流的俩种加密算法 2.1 ...

  6. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  7. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

  8. 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...

  9. 2018-2019-2 20165237《网络对抗技术》Exp2 后门原理与实践

    2018-2019-2 20165237<网络对抗技术>Exp2 后门原理与实践 一.实践目标 使用netcat获取主机操作Shell,cron启动 使用socat获取主机操作Shell, ...

  10. 2018-2019-2 20165234 《网络对抗技术》 Exp3 免杀原理与实践

    实验三 免杀原理与实践 实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) 2.通过 ...

随机推荐

  1. TienChin-课程管理-添加课程接口

    CourseController.java @PreAuthorize("hasPermission('tienchin:course:create')") @Log(title ...

  2. paddleNLP-BUG和一些细节记录【一】

    1.TypeError: isfile() takes 1 positional argument but 2 were given File "/root/miniconda3/envs/ ...

  3. M2版Mac mini被京东杀到史低2888元!比苹果官网低1600

    苹果跳水王M2版Mac mini又降价了. 根据京东官方百亿补贴频道显示,Mac mini 8+256GB入门版只要2888元了,比前不久的拼多多2959还低,刷新了这款电脑的史上最低价. 对比官网原 ...

  4. Proxmox 7.4 使用vgpu_unlock,为GTX1060开启vGPU支持

    本文在 2021年发布的博客<Proxmox 5.4使用vgpu_unlock,为GTX1060开启vGPU支持>,介绍了 Proxmox VE 5.4 上部署vGPU unlock 的操 ...

  5. Oracle 11g ADG 部署(duplicate)快速参考

    本文旨在指导客户完成Oracle 11g的ADG部署工作,主库环境已具备,备库环境已安装完成数据库软件. 环境:RHEL 6.8 + Oracle 11.2.0.4 1.确认主库运行在归档模式 2.确 ...

  6. Wamp MySQL 报错 Got a packet bigger than 'max_allowed_packet' bytes

    点击电脑右下角wamp图标,然后进入mysql 下面的 my.ini 转移数据发现报这个错,字面意思允许的不够大.网上很多说法不起作用,解决方法如下: [mysqld] port=3306 expli ...

  7. .NET 云原生架构师训练营(RGCA 四步架构法)--学习笔记

    RGCA Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构 目录 从利益相关者获取 ...

  8. HBase-表的压缩

    一.如何选择压缩算法以及Data_Block_Encoding?(1)如果Key很长,或者有很多Column,那么推荐使用FAST_DIFF.(2)如果数据是冷数据,不经常被访问,那么使用GZIP压缩 ...

  9. NC14700 追债之旅

    题目链接 题目 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开始位于编号为1的城市,欠债人 ...

  10. windows远程连接centos及闪退异常解决记录

     平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的问题解决. 一. 安装Centos ...