主页

引言

在之前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. 手撕Vuex-实现getters方法

    经上一篇章介绍,完成了实现共享数据的功能,实现方式是在 Store 构造函数中将创建 Store 时将需要共享的数据添加到 Store 上面,这样将来我们就能通过 this.$store 拿到这个 S ...

  2. SpringAll

    目录 Spring Cloud 01-初识SpringCloud与微服务 02-SpringCloud-Feign声明式服务的调用 Spring Security 01-SpringSecurity- ...

  3. 强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法

    强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法 1.核心词汇 同策略(on-policy):要学习的智能体和与 ...

  4. PGL图学习之图游走类metapath2vec模型[系列五]

    PGL图学习之图游走类metapath2vec模型[系列五] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5009827?contr ...

  5. C/C++ 进程线程操作技术

    手动创建单进程: 下面通过一个实例来分别演示进程的创建函数. #include <windows.h> #include <stdio.h> BOOL WinExec(char ...

  6. 《Spring 手撸专栏》| 开篇介绍,我要带新人撸 Spring 啦!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 不正经!写写面经,去撸Spring源码啦? 是的,在写了4篇关于Spring核心源码 ...

  7. 程序设计实验第一学期期末考试复习用源代码【C语言深度解剖】【超详细注释】

    有关此篇 在这里博主先告诉大家,博主在学校学的C语言课本是<谭浩强的C语言>那这本红色的书. 博主到期末阶段是学到了结构体那一章,下面是博主的复习代码,是一些比较有编程思想的一些源代码,博 ...

  8. 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)

    可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...

  9. NC200324 魔改森林

    题目链接 题目 题目描述 曾经有一道叫做迷雾森林的题目,然而牛牛认为地图中的障碍太多,实在是太难了,所以删去了很多点,出了这道题. 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n+1 ...

  10. java 基础常见(上)

    title category tag head Java基础常见面试题总结(上) Java Java基础 keywords JVM,JDK,JRE,字节码详解,Java 基本数据类型,装箱和拆箱 de ...