1.关于SSH
SSH(缩写为“Secure Shell”或“Secure Socket Shell”)是一种网络协议,用于通过不安全的网络安全地访问网络服务。它包括实现SSH的一套实用工具,例如:
- ssh-keygen:用于为 SSH 创建新的身份验证密钥对;
- SCP(安全复制协议):用于在网络上的主机之间复制文件;
- SFTP(安全文件传输协议):用于发送和接收文件。它是FTP(文件传输协议)的SSH安全版本,它已取代 FTP 和 FTPS(FTP 安全)成为通过 Internet 共享文件的首选机制。
默认情况下, SSH服务器在标准传输控制协议(TCP) 端口22上监听连接。但也可以自定义其他端口, 但要注意避免端口冲突的问题。
SSH可以安全地管理远程系统和应用程序,例如通过网络登录到另一台计算机、执行命令以及将文件从一台计算机移动到另一台计算机。高级SSH功能是创建安全隧道以远程运行其他应用程序协议。
2.基本SSH命令
以下是整理的SSH命令清单:
命令 | 功能描述 |
ssh | 连接到远程服务器 |
ssh pi@raspberry | raspberry以用户身份pi通过默认 SSH 端口 22连接到设备 |
ssh pi@raspberry -p 3344 | raspberry以用户身份pi通过3344端口连接到设备 |
ssh -i /path/file.pem admin@192.168.1.1 | 以root用户身份通过密钥文件/path/file.pemadmin连接192.168.1.1 |
ssh root@192.168.2.2 'ls -l' | 以root用户身份连接192.168.2.2并执行远程命令ls -l |
$ ssh user@192.168.3.3 bash < script.sh | 调用当前工作目录中的脚本script.sh,以user用户身份连接192.168.3.3 |
ssh friend@Best.local "tar cvzf - ~/ffmpeg" > output.tgz | 以friend用户身份登录远程主机Best.local, 并在远程主机上对 ~/ffmpeg 目录进行压缩,并将压缩后的结果传输到本地主机上的 output.tgz 文件 |
ssh-keygen | 生成SSH密钥 |
ssh-keygen -F [ip/hostname] | 从~/.ssh/known_hosts文件(已登录的主机)中搜索某个IP地址或主机名 |
ssh-keygen -R [ip/hostname] | 从~/.ssh/known_hosts文件(已登录的主机)中删除某个IP地址或主机名 |
ssh-keygen -f ~/.ssh/filename | 指定文件名 |
ssh-keygen -y -f private.key > public.pub | 从私钥生成公钥 |
ssh-keygen -c -f ~/.ssh/id_rsa | 更改密钥文件~/.ssh/id_rsa`的注释 |
ssh-keygen -p -f ~/.ssh/id_rsa | 更改私钥~/.ssh/id_rsa`的密码 |
ssh-keygen -t rsa -b 4096 -C "my@email.com" | 生成一个带有注释 "my@email.com" 的RSA 4096位密钥:-t:密钥类型 ( rsa, ed25519, dsa, ecdsa) -b:密钥中的位数 -C:提供新注释 |
scp | 在服务器之间安全地复制文件 |
scp user@server:/folder/file.ext dest/ | 从远程复制到本地目的地dest/ |
scp dest/file.ext user@server:/folder | 从本地复制到远程 |
scp user1@server1:/file.ext user2@server2:/folder | 在两个不同服务器之间复制 |
scp user@server:/folder/* . | 从服务器文件夹复制到本地计算机上的当前文件夹 |
scp -r | 递归复制整个目录 |
scp -r user@server:/folder dest/ | 将整个文件夹复制到本地目的地dest/ |
scp user@server:/folder/* dest/ | 将文件夹中的所有文件复制到本地目标dest/ |
scp -C | 压缩数据的选项 |
scp -v | 打印详细信息的选项 |
scp -p | 保留传输文件的最后修改时间戳的选项 |
scp -P 8080 | 连接到远程主机端口 8080 的选项 |
scp -B | 批处理模式选项并阻止输入密码串 |
sftp | 在服务器之间安全地传输文件 |
sftp -p | 保留传输文件的最后修改时间戳的选项 |
sftp -P 8080 | 连接到远程主机端口8080 |
sftp -r | 上传和下载时递归复制整个目录。SFTP不跟踪树遍历中遇到的符号链接。 |
3.SSH配置和选项
以下命令记录了SSH如何在不同机器上记录登录凭据:
命令 | 功能描述 |
man ssh_config | 打开OpenSSH SSH 客户端配置文件。本手册列出了可以更改的所有OpenSSH参数。 |
cat /etc/ssh/ssh_config | less | 查看OpenSSH 客户端系统范围的配置文件 |
cat /etc/ssh/sshd_config | less | 查看OpenSSH服务器系统范围的配置文件;“d”代表服务器“守护进程” |
cat ~/.ssh/config | less | 查看SSH客户端用户特定的配置文件 |
cat ~/.ssh/id_{type} | less | 查看SSH客户端私钥;type是 中的任何一个rsa, ed25519, dsa, ecdsa |
cat ~/.ssh/id_{type}.pub | less | 查看SSH客户端公钥;type是 中的任何一个rsa, ed25519, dsa, ecdsa |
cat ~/.ssh/known_hosts | less | 查看SSH客户端登录的主机 |
cat ~/.ssh/authorized_keys | less | 查看SSH客户端授权登录密钥 |
ssh-agent | 保存用于公钥身份验证的私有 SSH 密钥(RSA、DSA、ECDSA、Ed25519) |
ssh-agent -E fingerprint_hash | 指定显示密钥指纹时使用的哈希算法。有效fingerprint_hash选项是sha256(默认)和md5 |
ssh-agent -t lifetime | 设置lifetime身份/私钥的最大值,可由 中的相同设置覆盖ssh-add。 生命周期示例:• 600= 600 秒(10 分钟) • 23m= 23 分钟 • 1h45= 1 小时 45 分钟 |
ssh-add | 将 SSH 密钥添加到ssh-agent |
ssh-add -l | 列出缓存的私钥ssh-agent |
ssh-add -t lifetime | 设置lifetime身份/私钥的最大值。示例lifetime:• 600= 600 秒(10 分钟) • 23m= 23 分钟 • 1h45= 1 小时 45 分钟 |
ssh-add -L | 列出所有已保存身份的公钥参数 |
ssh-add -D | 删除所有缓存的私钥 |
ssh-copy-id | 在远程服务器上复制、安装和配置SSH密钥 |
ssh-copy-id user@server | 将SSH密钥复制到 aserver作为user |
ssh-copy-id server1 | server1使用默认登录名复制到某个别名服务器 |
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server | 将特定密钥复制到服务器上作为一个用户 |
4.远程服务器管理
SSH服务器的操作系统大多是Unix/Linux,因此通过SSH登录服务器后,以下命令与Unix/Linux中的命令基本相同。
命令 | 功能描述 |
cd | 更改当前工作目录 |
kill | 停止正在运行的进程 |
ls | 列出文件和目录 |
mkdir | 创建一个新目录 |
mv | 移动文件或目录 |
nano | 使用 Nano 在终端中编辑文件 |
ps | 列出正在运行的进程 |
pwd | 显示当前工作目录 |
tail | 查看文件的最后几行(默认为 10 行) |
top | 监控系统资源和进程 |
touch | 创建新文件或更新现有文件的时间戳 |
vim | 使用 Vim 在终端中编辑文件 |
exit | 关闭 SSH 会话 |
以下是在Windows10上使用PowerShell通过SSH访问网络计算机上的账户:
5.高级SSH命令
在下表中,列出了一些可以帮助完成网络管理任务的复杂SSH实用程序, 包括: SSH文件系统(SSHFS)、数据压缩和X11转发。
要通过SSH进行X11转发, 需要执行三个步骤:
(1) 要实现X11转发,在配置文件~/.ssh/config配置以下参数:
Host*
ForwardAgent yes
ForwardX11 yes
(2) 要允许X11执行, 在配置文件:/etc/ssh/sshd_config中配置以下参数:
- X11Forwarding yes
- X11DisplayOffset 10
- X11UseLocalhost no
(3) 在服务器中安装xauth,设置X11身份验证。
命令 | 功能描述 |
sshfs | 将远程服务器的文件系统挂载到本地目录上。在使用前将此程序安装。安装命令示例: • sudo apt install sshfs # Ubuntu/Debian • sudo yum install fuse-sshfs # CentOS |
ssh -C hostname | 压缩SSH流量以提高慢速连接的性能。或者,插入选项Compression yes到SSH配置文件中 |
ssh -o "Compression yes" -v hostname | 另一种压缩SSH流量以提高慢速连接性能的方法。这与插入配置选项Compression yes到SSH配置文件中的方法相同。 |
ssh -X user@server | 通过SSH启用X11转发: 以user用户身份将图形应用程序从远程server转发到本地 |
ssh -o ForwardX11=yes user@server | 通过SSH启用X11转发: 以user用户身份将图形应用程序从远程server转发到本地 |
ssh -x | 禁用X11转发 |
ssh -Y | 启用可信X11转发。此选项比ssh -X将SSH 服务器的整个显示转发到客户端的风险更大 |
6.隧道技术
使用下面的SSH命令创建安全隧道:
选项 | 功能描述 | 语法/示例 |
-L | 将本地主机的某个端口转发到远程主机, 实现从本地主机到远程主机的连接。本地主机充当服务中继, SSH将流量通过连接转发到远程主机上的指定端口 | 命令语法:# ssh user@ssh_server -L local_port:destination:remote_port 示例: # ssh root@192.168.0.1 -L 2222:10.0.1.5:3333 |
-J | 实现通过跳转主机连接目标主机。该参数是在连接到目标主机之前,先通过跳板主机建立连接,然后再跳转到目标主机上 | 示例1:# ssh -J proxy_host1 remote_host 2 示例2:# ssh -J user@proxy_host1 user@remote_host2 示例3(多个堡垒主机跳转): # ssh -J user@proxy_host1:port1,user@proxy_host2:port2 user@remote_host3 |
-R | 该参数实现反向端口转发, 它允许远程主机将其某个端口转发到本地主机, 实现从远程主机到本地主机的连接。本地主机此时充当服务中继,远程主机将流量通过SSH连接转发到本地主机上的指定端口。其中: -N参数表示不执行远程命令, 对于专用端口转发很有用。-f参数表示在后台运行SSH | 语法: ssh -R [remote:]remote_port:destination:destination_port [user@]ssh_serve r 例子: # ssh -R 8080:192.168.3.8:3030 -N -f user@remote.host |
-D | 在本地主机上创建一个SOCK5代理服务器, 使得通过该代理的流量都经过SSH连接到远程主机。本地主机上的指定端口将作为SOCK5代理端口, 可以配置浏览器或其他应用程序来使用该代理。流量将通过SSH连接到远程主机, 然后由远程主机发出 | 语法: # ssh -D local_port_number user@remote_host 例子: # ssh -D 6677 -q -C -N -f me@192.168.5.5 |
7.总结
上面总结了SSH、SCP、SFTP、SSH配置命令以及各种SSH隧道命令。以下是一些更高效、更安全的使用SSH的一些建议:
(1) 禁用X11和TCP转发, 攻击者可以利用此类弱点访问网络上的其他系统。将sshd_config中的选项调整如下:
- 将AllowTcpForwarding设置为no。
- 将X11Forwarding设置为no。
(2) 更改sshd_config中的默认配置选项, 将默认端口22改成其它数字。
(3) 使用ssh-keygen创建SSH证书并对客户端进行身份验证。
(4) 利用隧道命令使用堡垒主机。
(5) 限制SSH登录到特定的IP地址,例如通过在sshd_config中使用AllowUsers选项添加用户过滤。