SSH详解

文章目录

    • SSH简介
    • SSH安装
    • SSH秘钥
      • 秘钥生成
      • 公钥上传(免密登录)
    • 基本用法
    • 命令行配置
    • 配置文件
    • SSH代码
      • 动态转发
      • 本地转发
      • 远程转发
      • 搭建简易版的VPN
    • SCP命令
      • 本地复制到远程
      • 远程复制到本地
      • 远程复制到远程
    • Rsync命令
      • 安装
      • 基本用法
      • 本地同步到远程
      • 远程同步到本地
    • SFTP命令

SSH简介

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。
SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据。

SSH安装

OpenSSH 的客户端是二进制程序 ssh。它在 Linux/Unix 系统的位置是/usr/local/bin/ssh,Windows 系统的位置是\Program Files\OpenSSH\bin\ssh.exe

  • 查看是否安装了ssh服务

    ssh -V

  • ubuntu安装

    sudo apt-get install openssh-client 
    sudo apt-get install openssh-server
    
  • 启动

    sudo /etc/init.d/ssh start

  • 停止

    sudo /etc/init.d/ssh stop

  • 重启

    sudo /etc/init.d/ssh restart

SSH秘钥

秘钥生成

# 以 rsa 算法为例,生成的密钥文件默认就会是~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)
ssh-keygen -t rsa

公钥上传(免密登录)

用户公钥保存在服务器的 ~/.ssh/authorized_keys文件,两种方式:一种是手动复制写入文件、另一种是命令上传

  • 方式一

    密钥中的公钥文件 (id_rsa.pub) 复制到需要登录的ssh服务器的 ~/.ssh/authorized_keys 文件中

  • 方式二

    在本地执行命令,其中-i是指定公钥文件,可以不写

    ssh-copy-id -i key_file user@hostname

基本用法

# 用户名+ip地址访问
ssh hostname  <=>  ssh 192.168.0.1
ssh alan@192.168.0.1  <=>  ssh -l alan 192.168.0.1# 指定端口号(默认22)
ssh -p 5000 alan@192.168.0.1# 调用图形界面程序
ssh -X alan@192.168.0.1# 执行远程命令,并且执行完毕后仍然在本机上
ssh alan@192.168.0.1 <command>
# 执行远程命令,交互式
ssh -t alan@192.168.0.1 command# 对所有数据请求压缩
ssh -C alan@192.168.0.1# 打开调试模式,追踪调试建立的ssh连接情况
[Alvin.Alvin-computer] ➤ ssh -v pi@192.168.0.116
OpenSSH_7.1p2, OpenSSL 1.0.1g 7 Apr 2014
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to 192.168.0.116 [192.168.0.116] port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4p1 Raspbian-10+deb9u4
debug1: match: OpenSSH_7.4p1 Raspbian-10+deb9u4 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 192.168.0.116:22 as 'pi'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received# 当客户端存在多个ip地址时,明确使用哪一个ip连接到服务器
ssh -b 192.168.0.105 pi@192.168.0.116# 挂载远程文件系统,基于ssh的sshfs工具。将远程主机 pi 用户的主目录挂载到本地主目录下的 Pi 文件夹
sshfs -o idmap=user pi@192.168.0.116:/home/pi ~/Pi

命令行配置

参数说明
-c指定加密算法
-C压缩数据传输
-D动态转发
-fssh链接后台运行
-F指定配置文件,默认为 ~/.ssh/config
-i指定私钥
-l指定用户名
-L本地端口转发
-m指定效验数据完整性算法
-N只用于端口转发,不能指定远程命令
-o添加一个配置命令
-p指定端口
-q安静模式,不会输出任何警告信息
-R远程端口转发
-t提供一个交互式环境
-V显示版本信息
-v显示详细信息
-1,-2指定ssh协议版本
-4,-6指定ipv4还是ipv6
-X打开X窗口

配置文件

SSH 客户端的全局配置文件是/etc/ssh/ssh_config,用户个人的配置文件在~/.ssh/config,优先级高于全局配置文件。

目录地址说明
~/.ssh/id_ecdsa用户的 ECDSA 私钥
~/.ssh/id_ecdsa.pub用户的 ECDSA 公钥
~/.ssh/id_rsa用于 SSH 协议版本2 的 RSA 私钥。
~/.ssh/id_rsa.pub用于SSH 协议版本2 的 RSA 公钥
~/.ssh/identity用于 SSH 协议版本1 的 RSA 私钥
~/.ssh/identity.pub用于 SSH 协议版本1 的 RSA 公钥
~/.ssh/known_hosts包含 SSH 服务器的公钥指纹。
AddressFamily inet:表示只使用 IPv4 协议。如果设为inet6,表示只使用 IPv6 协议。
BindAddress 192.168.10.235:指定本机的 IP 地址(如果本机有多个 IP 地址)。
CheckHostIP yes:检查 SSH 服务器的 IP 地址是否跟公钥数据库吻合。
Ciphers blowfish,3des:指定加密算法。
Compression yes:是否压缩传输信号。
ConnectionAttempts 10:客户端进行连接时,最大的尝试次数。
ConnectTimeout 60:客户端进行连接时,服务器在指定秒数内没有回复,则中断连接尝试。
DynamicForward 1080:指定动态转发端口。
GlobalKnownHostsFile /users/smith/.ssh/my_global_hosts_file:指定全局的公钥数据库文件的位置。
Host server.example.com:指定连接的域名或 IP 地址,也可以是别名,支持通配符。Host命令后面的所有配置,都是针对该主机的,直到下一个Host命令为止。
HostKeyAlgorithms ssh-dss,ssh-rsa:指定密钥算法,优先级从高到低排列。
HostName myserver.example.com:在Host命令使用别名的情况下,HostName指定域名或 IP 地址。
IdentityFile keyfile:指定私钥文件。
LocalForward 2001 localhost:143:指定本地端口转发。
LogLevel QUIET:指定日志详细程度。如果设为QUIET,将不输出大部分的警告和提示。
MACs hmac-sha1,hmac-md5:指定数据校验算法。
NumberOfPasswordPrompts 2:密码登录时,用户输错密码的最大尝试次数。
PasswordAuthentication no:指定是否支持密码登录。不过,这里只是客户端禁止,真正的禁止需要在 SSH 服务器设置。
Port 2035:指定客户端连接的 SSH 服务器端口。
PreferredAuthentications publickey,hostbased,password:指定各种登录方法的优先级。
Protocol 2:支持的 SSH 协议版本,多个版本之间使用逗号分隔。
PubKeyAuthentication yes:是否支持密钥登录。这里只是客户端设置,还需要在 SSH 服务器进行相应设置。
RemoteForward 2001 server:143:指定远程端口转发。
SendEnv COLOR:SSH 客户端向服务器发送的环境变量名,多个环境变量之间使用空格分隔。环境变量的值从客户端当前环境中拷贝。
ServerAliveCountMax 3:如果没有收到服务器的回应,客户端连续发送多少次keepalive信号,才断开连接。该项默认值为3。
ServerAliveInterval 300:客户端建立连接后,如果在给定秒数内,没有收到服务器发来的消息,客户端向服务器发送keepalive消息。如果不希望客户端发送,这一项设为0。
StrictHostKeyChecking yes:yes表示严格检查,服务器公钥为未知或发生变化,则拒绝连接。no表示如果服务器公钥未知,则加入客户端公钥数据库,如果公钥发生变化,不改变客户端公钥数据库,输出一条警告,依然允许连接继续进行。ask(默认值)表示询问用户是否继续进行。
TCPKeepAlive yes:客户端是否定期向服务器发送keepalive信息。
User userName:指定远程登录的账户名。
UserKnownHostsFile /users/smith/.ssh/my_local_hosts_file:指定当前用户的known_hosts文件(服务器公钥指纹列表)的位置。
VerifyHostKeyDNS yes:是否通过检查 SSH 服务器的 DNS 记录,确认公钥指纹是否与known_hosts文件保存的一致

SSH代码

动态转发

本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。

命令格式:ssh -D local-port root@remote-host -p remote-port -N

  • -D 动态转发
  • local-port 本地端口
  • remote-host ssh 服务器 ip
  • remote-port ssh 服务器 端口号
  • -N 只进行端口转发,不建立 SSH 通道连接

说明:这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。

curl -x socks5://localhost:2121 https://www.baidu.com

  • 通过socks5代理服务器,发送http请求

本地转发

本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。

命令格式:ssh -L local-port:target-host:target-port root@remote-host -p remote-port

  • -L 本地转发
  • local-port 本地端口
  • target-host 目标地址
  • target-port 目标端口
  • remote-host ssh服务器地址
  • remote-port ssh服务器端口

ssh -L 3306:127.0.0.1:3306 -p 40022 root@xx.xx.xx.xx

远程转发

它跟本地转发正好反过来。建立本地计算机到远程计算机的 SSH 隧道以后,本地转发是通过本地计算机访问远程计算机,而远程转发则是通过远程计算机访问本地计算机。

命令格式:ssh -R remote-port:target-host:target-port -N root@remote-host -p remote-port

搭建简易版的VPN

处于安全考虑,我们一般不会将 mysql,redis 等数据库中间件的端口号暴露出来,此时就可以通过本地转发来进行访问

# 本地的3306,6379 端口转发到目标服务器(开发机)的3306,6379 端口
ssh -NL 3306:127.0.0.1:3306 -NL 6379:127.0.0.1:6379 -p 22 user@xx.xx.xx.xx
# 又或者,有些第三方服务部署在内网服务器B,本地只能访问内网服务器A,而A,B之间是互通的。
ssh -NL 80:B-host:80 user@A-host:A-port

SCP命令

scp是 secure copy 的缩写,相当于cp命令 + SSH,底层还是 SSH 协议

本地复制到远程

# 基本语法
scp -P port source user@hostname:target
# 将本机整个目录拷贝到远程目录下
scp -r ./dir user@hostname:/remote_dir/
# 将本机目录下的所有内容拷贝到远程目录下
scp -r .dir/* user@hostname:/remote_dir/

远程复制到本地

# 基本语法
scp user@hostname:source target
# 拷贝一个远程目录到本机目录下
scp -r user@hostname:/remote_dir .dir/
# 拷贝远程目录下的所有内容,到本机目录下
scp -r user@hostname:/remote_dir/* .dir/

远程复制到远程

# 基本语法
scp user@hostname1:source user@hostname2:target

Rsync命令

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。

安装

# Debian
sudo apt-get install rsync# Red Hat
sudo yum install rsync# Arch Linux
sudo pacman -S rsync

基本用法

rsync -r source destination

  • -r 递归,包含子目录
  • -a 类似于 -r,还可以同步元信息(修改时间,权限等)
  • -n 可以看到哪些内容会被同步,通常与 -v 一起使用
  • -v 输出到终端
  • –delete 会删除在 destination 中的,但不在 source 的
  • –exclude 排除文件
# 排除某个目录下的
rsync -av --exclude 'dir1/*' source/ destination
# 多个排除
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
# 排除多个,记录在文件中
rsync -av --exclude-from='exclude-file.txt' source/ destination

本地同步到远程

rsync -av source/ username@remote_host:destination

远程同步到本地

rsync -av username@remote_host:source/ destination

SFTP命令

sftp是 SSH 提供的一个客户端应用程序,主要用来安全地访问 FTP。因为 FTP 是不加密协议,很不安全,sftp就相当于将 FTP 放入了 SSH

sftp username@hostname

  • ls [directory]:列出一个远程目录的内容。如果没有指定目标目录,则默认列出当前目录
  • cd directory:从当前目录改到指定目录
  • mkdir directory:创建一个远程目录
  • rmdir path:删除一个远程目录
  • put localfile [remotefile]:本地文件传输到远程主机
  • get remotefile [localfile]:远程文件传输到本地
  • help:显示帮助信息
  • bye:退出 sftp
  • quit:退出 sftp
  • exit:退出 sftp

操作本地的文件命令前加个 l, 如 lls , lcd , lmkdir 等

注意到一些常用的 linux 文件传输工具走的大多也是 sftp 协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个有意思的线程相关的程序运行题

翻开之前的代码&#xff0c;发现了一个有意思的代码&#xff0c;猜以下代码的运行结果&#xff1a; package thread;/*** author heyunlin* version 1.0*/ public class ThreadMethodExample {public static void main(String[] args) {Thread thread new Thread(new Runnabl…

云原生Kubernetes:kubectl管理命令

目录 一、理论 1.kubectl 管理命令 2.项目的生命周期 二、实验 1.kubectl 管理命令 2.项目的生命周期 三、总结 一、理论 1.kubectl 管理命令 &#xff08;1&#xff09;陈述式资源管理方法 kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口…

复旦-华盛顿EMBA:AI时代掘金,科技进化里的挑战与机遇

如果从去年年底ChatGPT3.5发布算起&#xff0c;AI赛道的热度已经持续飙升了半年有余。      “AI的iPhone时刻”代表什么&#xff1f;AI驱动的商业时代已经到来&#xff1f;      我们能看到担忧、恐惧、憧憬&#xff0c;但唯独不缺狂飙突进、加速进化。人类制造AI&…

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…

Android 10.0 Launcher3桌面显示多个相同app图标的解决办法

1.前言 在10.0的系统ROM定制化开发中,在Launcher3的系统原生桌面中,在显示桌面的时候,在禁用和启用app的功能测试的时候,会发现有多个相同app的图标显示在桌面 这对Launcher3的体验效果不是很好,所以为了优化产品,需要解决这个bug,然后让产品更完善 2.桌面显示多个相同…

Hadoop的分布式文件存储系统HDFS组件的使用

Hadoop的第一个核心组件&#xff1a;HDFS&#xff08;分布式文件存储系统&#xff09; 一、HDFS的组成1、NameNode2、DataNode3、SecondaryNameNode4、客户端&#xff1a;命令行/Java API 二、HDFS的基本使用1、命令行操作2、Java API操作 三、HDFS的工作流程问题&#xff08;H…

Direct3D颜色

在Direct3D中颜色用RGB三元组来表示&#xff0c;RGB数据可用俩种不同的结构来保存&#xff0c;第一种是D3DCOLOR&#xff0c;它实际上与DWORD类型完全相同&#xff0c;共有32位&#xff0c;D3DCOLOR类型种的各位被分成四个8位项&#xff0c;每项存储了一种颜色分量的亮度值。 由…

【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录 测试数据需求说明需求实现 测试数据 create table test(user_id string,order_date string);INSERT INTO test(user_id, order_date) VALUES(101, 2021-09-21),(101, 2021-09-22),(101, 2021-09-23),(101, 2021-09-27),(101, 2021-09-28),(101, 2021-09-29),(101, 20…

ChatGPT如何协助人们学习新的科学和技术概念?

ChatGPT可以在许多方面协助人们学习新的科学和技术概念。随着科学和技术的不断发展&#xff0c;学习成为了一个终身的过程&#xff0c;人们需要不断地更新和扩展他们的知识。ChatGPT作为一种强大的自然语言处理工具&#xff0c;可以在以下几个方面为学习者提供帮助&#xff1a;…

力扣(LeetCode)算法_C++——至多包含两个不同字符的最长子串

给你一个字符串 s &#xff0c;请你找出 至多 包含 两个不同字符 的最长子串&#xff0c;并返回该子串的长度。 示例 1&#xff1a; 输入&#xff1a;s “eceba” 输出&#xff1a;3 解释&#xff1a;满足题目要求的子串是 “ece” &#xff0c;长度为 3 。 示例 2&#xff…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …

Java反射:探索对象创建与类信息获取

文章目录 1. 对象的创建2. 类的初始化2.1 类的加载2.2 类的连接2.3 类的初始化 3. 反射是什么&#xff1f;4. 获取Class类对象4.1 使用类名.class4.2 使用对象的getClass()方法4.3 使用Class.forName() 5. 获取构造器对象5.1 使用getConstructors()和getDeclaredConstructors()…

sql索引分析-插入了 a、b、c、d 四个字段作为索引,只要带上了a,那么任何排列的组合,都可以走索引。

sql索引分析 1、如果创建了一个索引 一 ALTER TABLE table_A ADD KEY nid_sn_key(a,b,c,d) USING BTREE; 第一种情况&#xff1a; explain SELECT * FROM table_A WHERE a "xxx"&#xff1b; explain SELECT * FROM table_A WHERE a ! "xxx"&…

Fabric.js+vue 实现鼠标滚轮缩放画布+移动画布

话不多说 直接贴代码 一、实现鼠标滚轮缩放画布 // 可以实现鼠标滚轮缩放 最小为原来的百分之一&#xff0c;最大为原来的20倍canvas.on(mouse:wheel, function (opt) {var delta opt.e.deltaYvar zoom canvas.getZoom()zoom * 0.999 ** deltaif (zoom > 20) zoom 20if…

【Linux】一些常见查看各种各样信息的命令

Linux命令 find命令&#xff0c;用来查找文件。常用的按照名字查找-name&#xff0c;按照文件类型查找-type&#xff0c;linux常用的文件类型有七种&#xff0c;普通文件&#xff0c;目录文件&#xff0c;管道&#xff0c;套接字&#xff0c;软链接&#xff0c;块设备&#xf…

pytorch代码实现之空间通道重组卷积SCConv

空间通道重组卷积SCConv 空间通道重组卷积SCConv&#xff0c;全称Spatial and Channel Reconstruction Convolution&#xff0c;CPR2023年提出&#xff0c;可以即插即用&#xff0c;能够在减少参数的同时提升性能的模块。其核心思想是希望能够实现减少特征冗余从而提高算法的效…

【探索Linux】—— 强大的命令行工具 P.8(进程优先级、环境变量)

阅读导航 前言一、进程优先级1. 优先级概念2. Linux查看系统进程3. PRI&#xff08;Priority&#xff09;和NI&#xff08;Nice&#xff09; 二、环境变量1. 概念2. 查看环境变量方法3. 环境变量的组织方式4.通过代码获取环境变量5. 环境变量的特点 总结温馨提示 前言 前面我们…

C++ - 多态的实现原理

前言 本博客主要介绍C 当中 多态语法的实现原理&#xff0c;如果有对 多态语法 有疑问的&#xff0c;请看下面这篇博客&#xff1a; 探究&#xff0c;为什么多态的条件是那样的&#xff08;虚函数表&#xff09; 首先&#xff0c;调用虚函数必须是 父类的 指针或 引用&#xf…

KT142C-sop16语音芯片ic的功能介绍 支持pwm和dac输出 usb直接更新内置空间

1.1 简介 KT142C是一个提供串口的SOP16语音芯片&#xff0c;完美的集成了MP3的硬解码。内置330KByte的空间&#xff0c;最大支持330秒的语音长度&#xff0c;支持多段语音&#xff0c;支持直驱0.5W的扬声器无需外置功放 软件支持串口通信协议&#xff0c;默认波特率9600.同时…

JavaWeb之Session的简单使用!!!

session使用 1.服务器端会话跟踪技术&#xff1a;将数据保存在服务器端 底层基于cookie实现封装的 2.常用的API&#xff1a; 2.1void session.setAttribute(k,v) session存入值 keyname,value yushengjun /** Copyright (c) 2020, 2023, All rights reserved.**/ package…