• SSH详解


    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
      
      • 1
      • 2
    • 启动

      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
    
    • 1
    • 2

    公钥上传(免密登录)

    用户公钥保存在服务器的 ~/.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 
    # 执行远程命令,交互式
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    命令行配置

    参数说明
    -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文件保存的一致
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    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
    
    • 1
    • 2
    # 又或者,有些第三方服务部署在内网服务器B,本地只能访问内网服务器A,而A,B之间是互通的。
    ssh -NL 80:B-host:80 user@A-host:A-port
    
    • 1
    • 2

    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/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    远程复制到本地

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

    远程复制到远程

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

    Rsync命令

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

    安装

    # Debian
    sudo apt-get install rsync
     
    # Red Hat
    sudo yum install rsync
     
    # Arch Linux
    sudo pacman -S rsync
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    基本用法

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    本地同步到远程

    rsync -av source/ username@remote_host:destination
    
    • 1

    远程同步到本地

    rsync -av username@remote_host:source/ destination
    
    • 1

    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 协议

  • 相关阅读:
    点成分享 | 选择点成BEOnChip芯片的六大理由
    Skia4Dephi 的 Demo 程序界面架构分析
    使用OpenPCDet实现VoxelNext进行训练和测试:实现NuScence数据集的全局感知结果可视化
    TensorFlow Lite Micro简介与使用
    Qt SQL示例:Books(图书评级)
    map容器使用及员工分组实例
    SpringMVC之综合案例:参数传递,向页面传参,页面跳转
    《MySQL实战45讲》——学习笔记01 “MySQL基本架构和redo log两阶段提交“
    /apache/lib/libapr-1.so.0: undefined symbol: dlopen
    Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析
  • 原文地址:https://blog.csdn.net/al6nlee/article/details/132725924