SSH(Secure Shell)是一种加密的网络传输协议,专为在远程客户端和服务器之间提供安全的登录和其他网络服务而设计,广泛用于Linux系统的远程管理,相比传统的Telnet、FTP等明文传输协议,SSH通过对所有传输数据加密,有效防止了信息泄露和中间人攻击,成为Linux环境下远程运维的首选工具,本文将详细介绍SSH在Linux中的安装、配置、使用方法及高级功能,帮助用户全面掌握SSH的使用技巧。
SSH服务端安装与配置
在使用SSH之前,需先在目标服务器上安装SSH服务端软件(通常为OpenSSH),并进行基础配置。
安装SSH服务端
不同Linux发行版的安装命令略有差异:
- Ubuntu/Debian系统:
sudo apt update && sudo apt install openssh-server
- CentOS/RHEL系统:
sudo yum install openssh-server # CentOS 7及以下 sudo dnf install openssh-server # CentOS 8/RHEL 8及以上
安装完成后,SSH服务会自动启动(可通过
systemctl status sshd
查看状态),若未启动,可执行sudo systemctl start sshd
并设置开机自启sudo systemctl enable sshd
。
SSH服务端配置
SSH服务端的主配置文件为/etc/ssh/sshd_config
,通过修改此文件可调整SSH服务的行为,以下是常用配置项及其说明:
配置项 | 说明 | 默认值 | 推荐设置 |
---|---|---|---|
Port | SSH服务监听的端口号 | 22 | 修改为非默认端口(如2222)增强安全性 |
PermitRootLogin | 是否允许root用户直接登录 | yes | no(建议通过普通用户sudo提权) |
PasswordAuthentication | 是否使用密码认证 | yes | no(结合密钥认证提升安全性) |
PubkeyAuthentication | 是否启用公钥认证 | yes | yes(推荐使用) |
AuthorizedKeysFile | 存储用户公钥的文件路径 | ~/.ssh/authorized_keys | 保持默认即可 |
UseDNS | 是否通过DNS反向解析客户端IP | yes | no(减少连接延迟) |
配置完成后,需重启SSH服务使生效:sudo systemctl restart sshd
。
SSH客户端基础使用
Linux系统通常默认已安装SSH客户端工具(openssh-client
),无需额外安装,通过ssh
命令即可连接远程服务器。
基本连接语法
ssh [选项] [用户名@]主机地址
- 用户名:远程服务器上的合法用户(默认为当前本地用户名,如本地用户为
test
,连接时可省略test@
)。 - 主机地址:服务器的IP地址或域名(如
168.1.100
或example.com
)。
示例:
ssh root@192.168.1.100 # 以root用户连接192.168.1.100 ssh user@example.com -p 2222 # 连接example.com的2222端口(非默认端口)
常用SSH命令选项
选项 | 说明 |
---|---|
-p |
指定SSH服务端口(如-p 2222 ) |
-i |
指定私钥文件路径(如-i ~/.ssh/id_rsa ) |
-v |
详细模式输出(用于调试连接问题) |
-l |
指定用户名(等同于username@ ,如-l root ) |
-A |
启用SSH代理转发(可使用服务器的SSH密钥连接其他服务器) |
-C |
启用压缩(适用于网络较慢的环境) |
远程执行命令
无需登录远程服务器,直接通过SSH执行单条命令:
ssh user@remote_host "command"
示例:
ssh user@192.168.1.100 "ls -l /home" # 查看远程服务器/home目录内容 ssh root@192.168.1.100 "apt update && apt upgrade -y" # 远程更新系统
SSH文件传输:SCP与SFTP
SSH提供了安全的文件传输工具,包括scp
(secure copy,基于SSH的文件复制)和sftp
(SSH File Transfer Protocol,交互式文件传输)。
使用SCP传输文件
scp [选项] 源文件 目标地址
- 本地→远程:
scp local_file.txt user@remote:/path/to/dest/ # 上传文件 scp -r local_dir/ user@remote:/path/to/dest/ # 上传目录(需加-r)
- 远程→本地:
scp user@remote:/path/to/remote_file.txt ./ # 下载文件 scp -r user@remote:/path/to/remote_dir/ ./ # 下载目录
示例:
scp -P 2222 -i ~/.ssh/id_rsa test.txt user@192.168.1.100:/home/user/ # 指定端口和私钥传输
使用SFTP交互式传输
SFTP类似于FTP,但通过SSH加密传输,交互式操作更灵活:
sftp [用户名@]主机地址
连接后进入SFTP命令行界面,常用命令:
ls
:列出远程目录内容cd
:切换远程目录put local_file
:上传本地文件到远程get remote_file
:下载远程文件到本地mkdir
:创建远程目录exit
:退出SFTP
示例:
sftp user@192.168.1.100 put test.txt # 上传test.txt get remote.log # 下载remote.log exit # 退出
SSH高级功能
密钥认证与免密登录
密码认证易受暴力破解攻击,推荐使用基于密钥的认证方式实现免密登录:
- 生成密钥对:在本地执行
ssh-keygen -t rsa -b 4096
,默认在~/.ssh/
目录生成私钥(id_rsa
)和公钥(id_rsa.pub
)。 - 复制公钥到服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
执行后,公钥会被追加到远程服务器的
~/.ssh/authorized_keys
文件中,后续登录无需输入密码。
端口转发(SSH隧道)
SSH可通过端口转发将其他协议的流量封装在SSH连接中,实现安全传输:
- 本地转发:将本地端口映射到远程服务器的端口(如访问本地8080端口,实际访问远程服务器的web服务):
ssh -L 8080:remote_host:80 user@remote_host
- 远程转发:将远程端口映射到本地端口(适用于远程服务器访问本地服务):
ssh -R 8080:localhost:80 user@remote_host
- 动态转发:创建SOCKS代理,通过远程服务器访问内网资源:
ssh -D 1080 user@remote_host
配置浏览器代理为
0.0.1:1080
即可通过远程服务器上网。
常见问题排查
- 连接超时:检查网络连通性(
ping
远程主机)、防火墙是否开放SSH端口(如sudo ufw allow 22
)、SSH服务是否运行(systemctl status sshd
)。 - 拒绝连接(Permission denied):确认用户名、密码正确,或检查密钥认证是否配置成功(
~/.ssh/authorized_keys
权限需为600)。 - 端口被占用:修改
/etc/ssh/sshd_config
中的Port
配置后重启SSH服务,确保防火墙开放新端口。
相关问答FAQs
Q1: SSH连接时提示“Permission denied (publickey,password)”怎么办?
A: 通常是由于认证方式配置问题导致,检查/etc/ssh/sshd_config
中PasswordAuthentication
和PubkeyAuthentication
是否均为yes
;若使用密钥认证,确保公钥已正确添加到远程服务器的~/.ssh/authorized_keys
文件,且该文件权限为600(chmod 600 ~/.ssh/authorized_keys
)。
Q2: 如何修改SSH默认端口增强安全性?
A: 编辑/etc/ssh/sshd_config
文件,找到Port 22
,将其修改为其他未被占用的端口(如Port 2222
),保存后执行sudo systemctl restart sshd
重启服务,需在防火墙中开放新端口(如sudo ufw allow 2222
),并确保防火墙规则已更新。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32934.html