运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。
今天我们要讲的是 SSH 命令。
一、简介
SSH 全称 Secure Shell(安全外壳协议),是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。SSH由IETF的网络小组(Network Working Group)所制定,它是建立在应用层基础上的安全协议。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris等等,都可运行SSH。
二、SSH 安全验证
从客户端来看,SSH提供两种级别的安全验证。
2.1. 基于口令的安全验证
只要你知道自己账号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
2.2. 基于密匙的安全验证
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
三、SSH 协议组成
SSH 主要由三部分组成。
3.1. 传输层协议 [SSH-TRANS]
提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。 SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上。 SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。
3.2. 用户认证协议 [SSH-USERAUTH]
用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H )。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。
3.3. 连接协议 [SSH-CONNECT]
将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。
四、SSH 使用
4.1. 基本用法
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command [argument ...]]
选项参数:
-4:强制使用IPv4地址
-6:强制使用IPv6地址
-p:远程服务器监听的端口
-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X:支持x11转发
-t:强制伪tty分配,如:ssh -t 10.0.0.5 ssh -t 10.0.0.6 ssh 10.0.0.7 这个可以实现多跳中的逐级登陆,最后达到可以登录最后一个服务器的目的
-o:option 如:-o StrictHostKeyChecking=no
-i:指定私钥路径,实现基于key验证,默认为: ~/.ssh/id_dsa,~/.ssh/id_ecdsa, ~/.ssh/id_ed25519,~/.ssh/id_rsa
说明:上述列举了常用的选项参数,详细参数说明参见 https://man.openbsd.org/ssh.1
4.2. 配置文件
SSH 主要有以下几个配置文件:
- /etc/ssh/ssh_config:系统范围的配置
- ~/.ssh/config:用户特定的配置
- ~/.ssh/id_{type}:私钥
- ~/.ssh/id_{type}.pub:公钥
- ~/.ssh/known_hosts:登录主机
- ~/.ssh/authorized_keys:授权登录密钥
相关目录权限需设置为:
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub
4.3. SSH 连接
$ ssh root@192.168.1.11 # 连接到服务器(默认端口 22)
$ ssh root@192.168.1.1 -p 2222 # 在特定端口上连接
4.4. SSH 执行命令
$ ssh root@192.168.1.11 'ls -lrt' # 执行远程命令
$ ssh root@192.168.1.11 bash < script.sh # 调用本地脚本
$ ssh root@192.168.1.11 "tar cvzf - ~/source" > output.tgz # 从服务器压缩和下载
4.5. SSH ProxyJump
ssh 可以使用 ProxyJump 创建初始和第二个连接,而不是首先通过 SSH 连接到跳板主机,然后在跳板上使用 ssh 连接到远程主机。
注意:ProxyJump 或 -J 标志是在 ssh 7.3 版中引入的。
$ ssh -J proxy_host1 remote_host2
$ ssh -J user@proxy_host1 user@remote_host2
$ ssh -J user@proxy_host1:port1,user@proxy_host2:port2 user@remote_host3 # 多次跳跃
4.6. ssh-copy-id
ssh-copy-id 功能是用于将本地生成的SSH公钥信息复制到远程主机,一般配合 SSH keygen 使用,用于服务器之间的免密登陆配置。
$ ssh-copy-id user@server # 复制到指定服务器
$ ssh-copy-id server1 # 复制到别名服务器
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server # 复制特定密钥
4.7. SCP
SCP(Secure Copy)是基于SSH协议的文件传输工具,用于在本地主机和远程主机之间安全地传输文件,跟 SSH 的差别就是 SCP 指定端口号使用的是大写的 -P。
用法:
scp -P [端口号] [本地文件或者目录] 用户名@IP地址:[远程服务器目录]
scp [本地文件或者目录] [别名]:[远程服务器目录]
示例:
$ scp user@server:/dir/file.ext dest/ # 从远程复制到本地
$ scp user@server:/file user@server:/dir # 两台服务器之间的副本
$ scp dest/file.ext user@server:/dir # 从本地复制到远程
$ scp -r user@server:/dir dest/ # 复制整个文件夹
$ scp user@server:/dir/* dest/ # 复制文件夹中的所有文件
$ scp user@server:/dir/* . # 从服务器文件夹复制到当前文件夹