• 2022-08-14 SSH 相关命令详解


    ssh

    ssh – OpenSSH 远端登陆客户端,默认22端口

    描述:

    ssh (ssh client)是一个用于登录到远程计算机并在远程计算机上执行命令的程序。它旨在通过不安全的网络在两个不受信任的主机之间提供安全的加密通信。X11连接、任意TCP端口和unix域套接字也可以通过安全通道转发。
    
    ssh连接并登录到指定的目的地,该目的地可以指定为[user@]主机名,也可以指定为ssh://[user@]hostname[:port]形式的URI。用户必须使用以下几种方法之一向远程机器证明他/她的身份(见下文)。
    
    如果指定了一个命令,它将在远程主机上执行,而不是登录shell。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基本使用:

    # ssh [user]@[ip_or_name][:port],若不指定user默认使用本机当前用户名;若不指定端口默认使用22
    ssh root@121.199.172.217
    
    • 1
    • 2

    每次远程连接ssh都需要指定user和ip是一件非常繁琐的事情,可以是通过配置的形式使用默认值:

    # =============== 设置ip别名 =================
    # 配置ip别名
    vim /etc/hosts
    
    # 末尾添加'IP alias name'
    121.199.172.217 aliyun
    
    # 此时,ssh root@121.199.172.217等价于
    ssh root@aliyun
    
    # =============== 设置默认user =================
    # 进入~/.ssh/目录下
    cd ~/.ssh/
    
    # 在当前目录下config文件中添加内容,若文件不存在则创建(这里我默认登陆zsl用户)
    touch config
    
    vim config
    Host aliyun
    	User zsl
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    此时想要通过ssh连接远程121.199.172.217时,只需要执行:

    ssh aliyun
    
    • 1

    是不是非常方便呢(注意使用ssh需要安装OpenSSH)

    ssh-keygen

    每次使用ssh远程访问都需要输入密码一定觉得十分麻烦,此时就可以使用 ‘‘ssh-keygen’’ 用于生成公私钥文件,将公钥发送到远端服务器,就可以免密登陆远端服务器。

    # 指定文件名aliyun生成 私钥aliyun、公钥aliyun.pub
    ssh-keygen -f aliyun
    
    • 1
    • 2

    生成之后还需要将aliyun.pub传输到远端服务器上,将aliyun.pub内容追加到~/ssh/authorized_keys文件内容;

    注意:文件权限普通用户需要设置为chmod 600,root用户chmod 644。

    由于这里使用指定文件名,需要在配置文件中增加aliyun指定文件。

    zsl0@zsl0deMacBook-Pro .ssh % cat config
    # ============= 阿里云服务器 =============
    Host aliyun
    	User zsl
    	PreferredAuthentications publickey
    	IdentityFile ~/.ssh/aliyun
    
    # ========================================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果生成公钥并且发送到远端还是需要输入密码,排查步骤:

    第一步:ssh -vvv aliyun 查看详细步骤是否使用生成公钥;

    第二步:查看远端~/.ssh/authorized_key是否存在aliyun.pub内容

    其他可选option:

    • -t 加/解密算法
    • -b 秘钥长度,rsa默认秘钥长度的为 2048
    • -C 注释,一般是填写用户名
    • -f 指定生成的秘钥文件名,如果不提供此参数则使用默认文件名,如rsa私钥默认文件名 ~/.ssh/id_rsa ,公钥默认文件名 ~/.ssh/id_rsa.pub

    ssh-copy-id

    把本地的ssh公钥文件安装到远程主机对应的账户下,ssh-copy-id命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限远程主机。

    # ssh-copy-id -i [file_name] [user]@[ip_or_name]
    ssh-copy-id -i aliyun.pub zsl@aliyun
    
    • 1
    • 2

    注意:本地 ~/.ssh/id_rsa 的权限,chmod 400 ~/.ssh/id_rsa ,该文件包含用于授权的私钥,如果该文件可以被其他用户访问,ssh 会忽略该私钥。

    可选项:

    • -i 指定文件名,如果不传入 -i 参数,ssh-copy-id 使用默认 ~/.ssh/identity.pub 作为默认公钥。如果多次运行 ssh-copy-id ,该命令不会检查重复,会在远程主机中多次写入 authorized_keys 。

    ssh-agent 和 ssh-add

    ssh-agent 用来代理ssh密钥,如果没有通过配置的方式,指定对应服务器公钥路径,则每次都需要使用 ssh -i 来指定公钥地址,十分麻烦;这里就可以使用ssh-agent结合ssh-add命令来管理密钥。

    # 可以先查看当前ssh-agent状态
    zsl0@zsl0deMacBook-Pro ~ % ps -ef | grep ssh-agent
      501  2412     1   0 11:27上午 ??         0:00.03 /usr/bin/ssh-agent -l
      501  4597  4577   0 10:41下午 ttys000    0:00.00 grep ssh-agent
      
    # 启动ssh-agent
    ssh-agent $SHEEL
    
    # 此时再查看进程
    zsl0@zsl0deMacBook-Pro ~ % ps -ef | grep ssh-agent
      501  2412     1   0 11:27上午 ??         0:00.03 /usr/bin/ssh-agent -l
      501  4611  4610   0 10:43下午 ??         0:00.00 ssh-agent /bin/zsh
      501  4614  4610   0 10:43下午 ttys000    0:00.00 grep ssh-agent
      
    # 停止ssh-agent命令(注意当窗口关闭时,进程也会停止)
    ssh-agent -k
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在测试ssh-agent之前,需要将先前config文件配置的指定公钥地址注释掉:

    zsl0@zsl0deMacBook-Pro .ssh % cat config
    # ============= 阿里云服务器 =============
    Host aliyun
    	User zsl
    #	PreferredAuthentications publickey
    #	IdentityFile ~/.ssh/aliyun
    
    # ========================================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    此时再使用 ssh aliyun,访问就需要输入密码了;

    那么开始尝试ssh-agent代理吧!

    # 首先启动ssh-agent(注意如果刚刚没有停止ssh-agent则不需要启动)
    ssh-agent $SHELL
    
    # 查看进程是否启动成功
    zsl0@zsl0deMacBook-Pro ~ % ps -ef | grep ssh-agent
      501  2412     1   0 11:27上午 ??         0:00.03 /usr/bin/ssh-agent -l
      501  4611  4610   0 10:43下午 ??         0:00.00 ssh-agent /bin/zsh
      501  4614  4610   0 10:43下午 ttys000    0:00.00 grep ssh-agent
    # 添加密钥
    ssh-add ~/.ssh/aliyun
    
    # 访问aliyun
    ssh aliyun
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ssh-add其他参数:

    # -l查询所有密钥
    zsl0@zsl0deMacBook-Pro .ssh % ssh-add -l
    3072 SHA256:YUyjunktfEdZ45Esh+fG07rlEV0OqKHWWrhOOY1GQw0 zsl0@zsl0deMacBook-Pro.local (RSA)
    
    # -d 删除密钥
    zsl0@zsl0deMacBook-Pro .ssh % ssh-add -d ~/.ssh/aliyun
    Identity removed: /Users/zsl0/.ssh/aliyun RSA (zsl0@zsl0deMacBook-Pro.local)
    
    zsl0@zsl0deMacBook-Pro .ssh % ssh-add -l
    The agent has no identities.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    是不是非常方便,当有多个密钥时,对应不同远端地址,可以使用config配置文件的方式指定文件或者使用ssh-agent来代理管理多个密钥,不需要再操心哪个密钥对应哪个远端服务器。

    ssh-keyscan

    ssh-keyscan 用来收集公钥的主机地址

    zsl0@zsl0deMacBook-Pro .ssh % ssh-keyscan aliyun
    # aliyun:22 SSH-2.0-OpenSSH_7.4
    aliyun ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDB6pxxxxxxxxxxxxxx7GPZfK5U31/Im7bAYnxYtqndXSE9Tw8X73RJtc/u8cQhWKjuszPNMDTZS1kinKhbJDbWnLMXzd+rBfp++gZHXbfhIseVYmIpjiwmw0NmCZtARhVcPu1vPoSkxVPjXA0FPnGCQmwdpxcdo8R6j/oYE7yRWEXA3vbd2fxxxxxxxxxxxx33yBU27Eeev+u68zq6MEqvjQfGvxiRE8D7fAfIlw9ugmHCyebOjZbIW9mHwbti6UjVt/W/PdFiC7fDDKyJvgkDOTokA4RqdPRnqlX/phltA2dr2Vbxxxxxxxxxx
    # aliyun:22 SSH-2.0-OpenSSH_7.4
    aliyun ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIxxxxxxxxxBIpksTXSC3PDMccEmRjRZjhq72g0WwigP4IX+b430EeCxxxxxxxxx6JtEl/HE17rb8afZd4QHt0nppKoas=
    # aliyun:22 SSH-2.0-OpenSSH_7.4
    aliyun ssh-ed25519 AAAAC3NzaxxxxxxxE5AAAAIIlxxxxxxxxxxJrMUEs+e9r3pQJ4571uHmVRFAko1
    # aliyun:22 SSH-2.0-OpenSSH_7.4
    # aliyun:22 SSH-2.0-OpenSSH_7.4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其他可选项:

    • -4:强制使用IPv4地址;
    • -6:强制使用IPv6地址;
    • -f:从指定文件中读取“地址列表/名字列表”;
    • -p:指定连接远程主机的端口;
    • -T:指定连接尝试的超时时间;
    • -t:指定要创建的密钥类型;
    • -v:信息模式,打印调试信息。

    sshd

    sshd是 OpenSSH守护进程

    openssh套件在不安全的网络中为两台为信任的主机之间建立加密的数据通信,是rlogin、rsh等明文传输数据的通信工具的替代品。sshd指令是openssh套件中的核心程序,其他的指令(如,sftp-server、slogin、scp)等都是基于sshd命令的。

    # 查看aliyun(CentOS7系统) sshd服务
    [zsl@iZbp10sz66ubwocy0uxhauZ ~]$ systemctl status sshd
    ● sshd.service - OpenSSH server daemon
       Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
       Active: active (running) since 五 2021-11-05 19:04:37 CST; 9 months 8 days ago
         Docs: man:sshd(8)
               man:sshd_config(5)
     Main PID: 1126 (sshd)
       CGroup: /system.slice/sshd.service
               └─1126 /usr/sbin/sshd -D
    
    Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    常用参数:

    -4强制使用IPv4地址
    -6强制使用IPv6地址
    -D以非后台守护进程的方式运行服务器
    -d调试模式
    -e将错误发送到标准错误设备,而不是将其发送到系统日志
    -f<配置文件>指定服务器的配置文件
    -g<登录过期时间>指定客户端登录的过期时间(默认时间为120秒),如果在此期限内,用户没有正确认证,则服务器断开此客户端的连接
    -h<主机key文件>指定读取主机key文件
    -isshd以inetd方式运行
    -o<选项>指定sshd的配置选项
    -p<端口>指定使用的端口号
    -q静默模式,没有任何信息写入系统日志
    -t测试模式
  • 相关阅读:
    JS中的set集合和map映射
    接入小程序国产操作系统装上双翼
    将3D MAX设计模型导入NX1988
    css-边框流水线
    云计算是什么?学习云计算能做什么工作?
    一站式数据采集物联网平台:智能化解决方案,让数据管理更高效、更安全
    ARP 地址解析协议——IP地址到MAC地址
    操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别
    一文读懂:WMS、MES、OMS、ERP之间的联系与区别
    力扣203 - 移除链表元素【LeetCode转VS调试技巧教学】
  • 原文地址:https://blog.csdn.net/qq_19152901/article/details/126338111