SSH原理与实践(三)安装和使用
主页
- 个人微信公众号:密码应用技术实战
- 个人博客园首页:https://www.cnblogs.com/informatics/
引言
在之前SSH原理与实践系列文章中,我们主要讲解了SSH协议的原理部分。作为该系列文章的最后一篇,本文将对SSH实践部分进行介绍。
好文回顾
- SSH原理与实践(一): SSH口令认证和免密登陆
- SSH原理与实践(二) :SSH安全通道建立
本文主要内容如下:
- SSH安装和部署
- SSH常用命令使用
SSH安装和部署
SSH采用了C-S架构,因此有客户端和服务端两个程序需要安装,其中被访问的实体需要安装SSH服务端程序, 我们叫做ssh-server, 发起访问请求的实体需要安装SSH客户端程序, 我们叫做ssh-client。 值得注意的是,一般情况下ssh-server会以守护进程sshd运行在服务端,ssh-client一般通过命令ssh发起访问。
安装SSH客户端
ssh-client安装
- 在Ubuntu或Debian上,执行以下命令安装SSH客户端
sudo apt update
sudo apt install openssh-client
- 在CentOS或Red Hat上,执行以下命令安装SSH客户端
sudo yum install openssh-clients
- 在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安装
- 在 Ubuntu/Debian 上,执行以下命令来安装 SSH 服务器
#安装
sudo apt update
sudo apt install openssh-server
# 查看状态
sudo service sshd status
# 启动
sudo service sshd start
- 在 CentOS/Red Hat 上,执行以下命令来安装 SSH 服务器
#安装
sudo yum install openssh-server
#查看状态
sudo systemctl status sshd
#启动
sudo systemctl start sshd
- 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工具集,包括ssh、sshd、sftp以及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原理与实践(一):https://www.cnblogs.com/informatics/p/17557907.html
- SSH原理与实践(二):https://www.cnblogs.com/informatics/p/17573764.html
SSH原理与实践(三)安装和使用的更多相关文章
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...
- SSH 的原理和实践
最近自己在学习使用SSH,现将自己理解的SSH原理和实践SSH的操作写成一篇博客,以供日后查看. 一.SSH是什么?为什么会出现SSH? SSH英文全称是Secure Shell,即安全外壳.首先SS ...
- 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践
2017-2018-2 20155228 <网络对抗技术> 实验三:MAL_免杀原理与实践 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasi ...
- kafka原理和实践(三)spring-kafka生产者源码
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- SSH原理讲解与实践
一.简介 SSH全名Secure Socket Shell,安全外壳传输协议.专为远程登录会话和其他网络服务提供安全性的协议 二.加密算法 要了解SSH的原理,就要先知道目前主流的俩种加密算法 2.1 ...
- Atitit.软件兼容性原理与实践 v5 qa2.docx
Atitit.软件兼容性原理与实践 v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...
- Atitit.软件兼容性原理与实践 v3 q326.docx
Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api vs 修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...
- 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- 2018-2019-2 20165237《网络对抗技术》Exp2 后门原理与实践
2018-2019-2 20165237<网络对抗技术>Exp2 后门原理与实践 一.实践目标 使用netcat获取主机操作Shell,cron启动 使用socat获取主机操作Shell, ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp3 免杀原理与实践
实验三 免杀原理与实践 实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) 2.通过 ...
随机推荐
- KPlayer无人直播
KPlayer文档 其实就看这个教程就可以了: KPlayer文档 启动阿里云或者腾讯云的服务器进行这个步骤 服务器的购买链接: 腾讯云618 夏日盛惠_腾讯云年中优惠活动-腾讯云 域名特惠活动_域名 ...
- 3D圆饼图,可修改颜色,图片等,具体见代码:
组件代码: <template> <!-- 饼图 --> <div :id="histogramId" v-bind:style="{hei ...
- Python 检测PE所启用保护方式
Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要 ...
- 记录一次py2编码带来的坑
"中文" == u"中文" # PY2 False"中文" == u"中文" # PY3 True
- Springboot创建项目、docker安装mysql及mybatis-plus调试
Springboot创建项目及测试 1️⃣ idea构建springboot项目 2️⃣ 测试类 hello 1. 代码 RestController是ResponseBody + controlle ...
- 19c ADG Switchover 切换测试
背景: 环境未配置DG Broker,手工切换ADG,19c也要比11g时代的切换更简单. 使用自己的测试环境,具体可参见: 单实例Primary快速搭建Standby RAC参考手册(19.16 A ...
- [Ngbatis源码学习][SpringBoot] ApplicationContextInitializer接口类的使用和原理解读
ApplicationContextInitializer接口类的使用和原理解读 在看Ngbatis源码的过程中,看到了自定义的ApplicationContextInitializer实现类,对Ap ...
- JS leetcode 旋转数组 题解分析
壹 ❀ 引 今天来做一道同样简单,但是挺有趣的题,题目来自leetcode189. 旋转数组,题目描述如下: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: ...
- CentOS7中搭建GitLab踩坑实录
今晚闲来无事,尝试了下自己搭建一台git服务器,很多人可能不明白平时自己随手就可以提交代码,为什么还要自己搭建服务器呢?首先你有没有考虑过你是怎么能把代码提交上去的?如果公司突然有一天需要你来负责搭建 ...
- 【Android】使用ContentProvider实现跨进程通讯
1 前言 ContentProvider 即内容提供器,是 Android 四大组件之一,为 App 存取数据提供统一的对外接口,让不同的应用之间可以共享数据. 如图,Server 端通过 C ...