主页

引言

在之前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. KPlayer无人直播

    KPlayer文档 其实就看这个教程就可以了: KPlayer文档 启动阿里云或者腾讯云的服务器进行这个步骤 服务器的购买链接: 腾讯云618 夏日盛惠_腾讯云年中优惠活动-腾讯云 域名特惠活动_域名 ...

  2. 3D圆饼图,可修改颜色,图片等,具体见代码:

    组件代码: <template> <!-- 饼图 --> <div :id="histogramId" v-bind:style="{hei ...

  3. Python 检测PE所启用保护方式

    Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要 ...

  4. 记录一次py2编码带来的坑

    "中文" == u"中文" # PY2 False"中文" == u"中文" # PY3 True

  5. Springboot创建项目、docker安装mysql及mybatis-plus调试

    Springboot创建项目及测试 1️⃣ idea构建springboot项目 2️⃣ 测试类 hello 1. 代码 RestController是ResponseBody + controlle ...

  6. 19c ADG Switchover 切换测试

    背景: 环境未配置DG Broker,手工切换ADG,19c也要比11g时代的切换更简单. 使用自己的测试环境,具体可参见: 单实例Primary快速搭建Standby RAC参考手册(19.16 A ...

  7. [Ngbatis源码学习][SpringBoot] ApplicationContextInitializer接口类的使用和原理解读

    ApplicationContextInitializer接口类的使用和原理解读 在看Ngbatis源码的过程中,看到了自定义的ApplicationContextInitializer实现类,对Ap ...

  8. JS leetcode 旋转数组 题解分析

    壹 ❀ 引 今天来做一道同样简单,但是挺有趣的题,题目来自leetcode189. 旋转数组,题目描述如下: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: ...

  9. CentOS7中搭建GitLab踩坑实录

    今晚闲来无事,尝试了下自己搭建一台git服务器,很多人可能不明白平时自己随手就可以提交代码,为什么还要自己搭建服务器呢?首先你有没有考虑过你是怎么能把代码提交上去的?如果公司突然有一天需要你来负责搭建 ...

  10. 【Android】使用ContentProvider实现跨进程通讯

    1 前言 ​ ContentProvider 即内容提供器,是 Android 四大组件之一,为 App 存取数据提供统一的对外接口,让不同的应用之间可以共享数据. ​ 如图,Server 端通过 C ...