当前位置: 首页 > news >正文

SSH运维操作:从基础概念到高级

SSH 是运维工作中最常用、最核心的工具之一。实际操作中它远不止是一个远程登录工具。下面将从基础概念到高级用法,系统地讲解 SSH 的相关知识。


一、 SSH 是什么?为什么需要它?

  • SSH 是一种网络协议,用于在不安全的网络上安全地进行远程登录和其他网络服务。

  • 解决什么问题? 取代了传统的、不安全的 Telnet、rsh 等明文传输协议,防止密码和通信内容被窃听。

核心特性:

  1. 加密:所有传输的数据都被加密。

  2. 身份验证:支持多种方式验证用户身份。

  3. 完整性:保证传输的数据没有被篡改。


二、 最基本用法:远程登录

命令:

ssh [选项] [用户名@]主机名或IP地址 [命令]

示例:

# 以当前用户名登录远程主机
ssh 192.168.1.100# 指定用户名登录
ssh username@192.168.1.100# 使用非标准端口登录(例如 2222 端口)
ssh -p 2222 username@192.168.1.100# 登录后直接执行一条命令,然后退出(常用于自动化脚本)
ssh username@192.168.1.100 'ls -l /tmp'

三、 身份验证机制:密码 vs. 密钥

这是 SSH 安全的核心,也是新手和老鸟的主要区别。

1. 密码认证(默认,但不推荐)
  • 每次登录都需要输入远程服务器的用户密码。

  • 缺点:容易被暴力破解,不方便自动化。

2. 密钥对认证(推荐的生产环境做法)

原理:使用一对非对称加密的密钥(一个公钥,一个私钥)来验证身份。

  • 私钥:存放在客户端机器上,必须严格保密,相当于你的“身份指纹”。

  • 公钥:存放在远程服务器上,相当于一把“公开的锁”。

配置密钥登录的步骤:

  1. 在客户端生成密钥对,这行代码意思是“请使用 RSA 算法,为我生成一个长度为 4096 位的高强度密钥对,并给它打上 ‘your_email@example.com’ 的标签以便我管理。”

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    # -t 指定密钥类型 (rsa, ed25519)
    # -b 指定密钥长度
    # -C 添加注释,通常用邮箱

    "your_email@example.com" 只是一个注释,你可以把它替换成任何对你来说有意义的标识符,或者直接留空。

  2. 执行后会让你选择保存路径(默认 ~/.ssh/id_rsa)和设置密钥密码。为安全起见,强烈建议设置密钥密码

  3. 将公钥上传到服务器

    # 最简单的方法,使用 ssh-copy-id 工具
    ssh-copy-id -i ~/.ssh/id_rsa.pub username@192.168.1.100# 如果 ssh-copy-id 不可用,可以手动操作:
    # 1. 将公钥内容复制到剪贴板
    cat ~/.ssh/id_rsa.pub
    # 2. 登录服务器,将公钥内容追加到 ~/.ssh/authorized_keys 文件
    echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
    # 3. 设置正确的权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  4. 享受无密码登录
    之后再次 ssh username@192.168.1.100,你只需要输入密钥的密码(如果设置了),而不是服务器的用户密码。如果使用 SSH 代理,连密钥密码都无需重复输入。


四、 SSH 代理:管理你的密钥

SSH 代理可以帮你缓存解密后的私钥,这样在同一个终端会话中就不需要多次输入密钥密码了。

# 启动 SSH 代理
eval "$(ssh-agent -s)"# 将私钥添加到代理
ssh-add ~/.ssh/id_rsa
# 此时会提示你输入一次密钥密码,之后在同一会话中就不再需要了# 查看已添加的密钥
ssh-add -l# 清除所有已缓存的密钥
ssh-add -D

让 SSH 自动使用代理: 在你的 ~/.ssh/config 文件中添加:

AddKeysToAgent yes

五、 高级用法与技巧

1. 端口转发
  • 本地端口转发:将本地某个端口的流量转发到远程主机的某个端口。
    场景:访问远程服务器内网的 Web 服务。

    ssh -L 8080:localhost:80 username@192.168.1.100

    解释:访问你本机的 http://localhost:8080,就等于访问 192.168.1.100 机器上的 http://localhost:80

  • 远程端口转发:将远程主机某个端口的流量转发到本地网络的某个端口。
    场景:让你在公网的同事访问你本地开发的 Web 服务。

    ssh -R 9090:localhost:3000 username@public-server.com

    解释:任何人在 public-server.com 上访问 http://localhost:9090,就等于访问你本地机器的 http://localhost:3000

2. SSH 配置文件:告别繁琐的命令行参数

创建或编辑 ~/.ssh/config 文件,可以为不同的主机设置别名和默认参数。

示例配置:

Host myserverHostName 192.168.1.100User usernamePort 2222IdentityFile ~/.ssh/id_rsa_myserverHost github.comUser gitIdentityFile ~/.ssh/id_rsa_github

使用:现在你只需要输入 ssh myserver 就能连接,SSH 会自动使用配置文件中指定的所有参数。

3. SCP / SFTP:安全传输文件
  • SCP:基于 SSH 的安全拷贝。

    # 从本地上传文件到服务器
    scp local_file.txt username@192.168.1.100:/remote/path/# 从服务器下载文件到本地
    scp username@192.168.1.100:/remote/file.txt /local/path/# 递归拷贝整个目录
    scp -r local_dir/ username@192.168.1.100:/remote/path/
  • SFTP:基于 SSH 的交互式文件传输。

    # 启动 SFTP 会话
    sftp username@192.168.1.100
    # 然后可以使用 put, get, ls, cd 等命令
    sftp> put local_file.txt
    sftp> get remote_file.txt
    sftp> ls
    sftp> exit
4. 执行远程命令并处理输出
# 检查远程服务器的磁盘使用情况
ssh username@192.168.1.100 'df -h'# 将远程命令的结果保存到本地文件
ssh username@192.168.1.100 'cat /var/log/nginx/access.log' > local_access.log

六、 安全最佳实践

  首先要明确你的角色:

  • SSH 服务端:你想要被连接的那台服务器。它运行着 sshd 守护进程。

  • SSH 客户端:你用来发起连接的那台个人电脑。它使用 ssh 命令。

  1. 禁用密码登录:配置密钥登录后,在服务器端编辑 /etc/ssh/sshd_config

  2. sudo vim /etc/ssh/sshd_config
    # 或者使用 nano
    sudo nano /etc/ssh/sshd_config
    PasswordAuthentication no
    ChallengeResponseAuthentication no

    然后重启 SSH 服务:sudo systemctl restart sshd

  3. 禁止 root 用户直接登录

    PermitRootLogin no
  4. 使用非标准端口在文件中找到并修改 Port 指令

  5. 通常文件里会有一行:

    #Port 22

    你需要做两件事,1、删除行首的 # 符号来取消注释,2、将数字 22 改为 2222

  6. 修改后的结果应该是:

    Port 2222

    (高级用法:你可以配置多端口监听,例如写两行 Port 22 和 Port 2222。但在完成测试后,建议关闭 22 端口。)

  7. 删除行首的 # 符号来取消注释,将数字 22 改为 2222

  8. # 对于 Systemd 系统(Ubuntu, CentOS 7+, Debian 8+)
    sudo systemctl restart sshd
    # 对于旧版系统(CentOS 6)
    sudo service sshd restart
  9. 然后不要关闭当前的连接会话! 打开一个新的终端窗口,尝试用新端口连接你的服务器:

    ssh -p 2222 username@your_server_ip

    如果测试成功,你才能关闭原来的旧连接会话。 这是为了防止新端口配置错误导致你被锁在服务器外面。

  10. (可选但推荐)配置防火墙
    如果你的服务器开启了防火墙(如 ufw 或 firewalld),你需要放行新的 2222 端口。

    # 使用 ufw (Ubuntu/Debian)
    sudo ufw allow 2222/tcp# 使用 firewalld (CentOS/RHEL)
    sudo firewall-cmd --permanent --add-port=2222/tcp
    sudo firewall-cmd --reload


七、 故障排查

1. 调试连接问题
# 使用 -v 参数查看详细的连接过程
ssh -v username@192.168.1.100
# 更多细节可以使用 -vvv
2. 常见错误与解决
  • Permission denied (publickey):密钥认证失败。检查:

    1. 公钥是否正确上传到服务器的 authorized_keys

    2. 文件和目录权限(.ssh 目录应为 700authorized_keys 应为 600)。

    3. 是否指定了正确的私钥(ssh -i /path/to/private_key)。

  • Host key verification failed:服务器的密钥发生了变化(可能是服务器重装了系统)。解决方法是在本机的 ~/.ssh/known_hosts 文件中删除对应服务器的那一行。

总结

SSH 是一个功能极其丰富的工具,从简单的远程登录到复杂的网络隧道,都是运维工作的基础。掌握以下核心技能至关重要:

  1. 熟练使用密钥对认证,告别密码。

  2. 学会使用 SSH 配置文件,提高效率。

  3. 理解端口转发,解决网络访问难题。

  4. 掌握 SCP/SFTP,进行安全的文件传输。

  5. 遵循安全最佳实践,保护你的服务器。

把这些知识点融会贯通,你就能在服务器管理和网络调试中游刃有余。

http://www.dtcms.com/a/457936.html

相关文章:

  • WinSCP下载和安装教程(附安装包,图文并茂)
  • Linux环境基础开发工具
  • 备案期间网站wordpress个人简历主题
  • AI智能体(Agent)大模型入门【8】--关于ocr文字识别图片识别
  • 商城版网站建设网站开发的经验
  • Linux命令--minio安装
  • 长春网站推广网诚传媒互联网服务商
  • 提供网站建设的理由创建私人网站
  • 【Proteus仿真】基于AT89C51单片机的单片机双向通信
  • 温州市网站制作多少钱wordpress 数据库设计
  • 鲅鱼圈网站怎么做分公司vi设计
  • OpenTiny学习中如何快速提升项目效率?
  • 预训练与后训练 区别
  • 从 “死锁“ 到 “解耦“:重构中间服务破解 Java 循环依赖难题
  • 【原创】SpringBoot3+Vue3高校图书管理系统
  • docker部署相关知识
  • 现代AI训练系统的网络架构革命:协同优化破瓶颈
  • 做宾馆网站鸽WordPress主题
  • python项目环境切换
  • VBA URL 编码函数
  • 郑州网站商城建设dw怎么制作网页教程
  • wordpress4.7企业主题网站单页seo
  • 开发准备之日志 git
  • 好大夫在线个人网站王建设网站未做安全隐患检测怎么拿shell
  • 【MySQL】存储引擎
  • 深圳网a深圳网站建设wordpress qq 微博
  • e网站的图标怎么做自己做网站能赚到广告费吗
  • 吓MySQL复合查询全解析:从基础到多表关联与高级技巧N
  • 网站源码 酷移动版网站开发
  • (2)SwiftUI 样式修饰符:字体、颜色、内边距与背景