凌峰创科服务平台

Ubuntu如何SSH远程服务器?

目录

  1. SSH 是什么? - 简要介绍
  2. 准备工作
    • 在服务器上安装和启动 SSH 服务
    • 在客户端电脑上安装 SSH 客户端
  3. 首次连接 (基本用法)
    • 基本命令
    • 首次连接的密钥确认提示
  4. 更安全的连接方式 (使用 SSH 密钥)
    • 为什么推荐使用密钥?
    • 在客户端生成 SSH 密钥对
    • 将公钥上传到服务器
    • 使用密钥进行连接
  5. 常用 SSH 命令和技巧
    • 指定用户名和端口
    • 断开连接
    • 在后台运行命令 (nohup, tmux, screen)
  6. SSH 配置优化 (~/.ssh/config)
    • 为什么需要配置文件?
    • 配置文件示例
    • 使用配置文件简化连接
  7. 常见问题与解决方案
    • Connection refused (连接被拒绝)
    • Permission denied (publickey,password) (权限被拒绝)
    • Could not resolve hostname (无法解析主机名)
    • 连接缓慢或卡顿

SSH 是什么?

SSH (Secure Shell) 是一种网络协议,用于计算机之间的安全通信和数据传输,它最广泛的应用就是安全地远程登录和管理服务器,与传统的 Telnet、FTP 等协议不同,SSH 对所有传输的数据都进行了加密,可以有效防止信息泄露和中间人攻击。

Ubuntu如何SSH远程服务器?-图1
(图片来源网络,侵删)

准备工作

你需要两台机器:

  • 服务器: 一台运行 Ubuntu 的远程服务器,拥有一个公网 IP 地址。
  • 客户端: 你本地的电脑(可以是 Windows, macOS, 或另一台 Linux)。

在服务器上安装和启动 SSH 服务

如果你的 Ubuntu 服务器还没有安装 SSH 服务,可以按以下步骤操作。

  1. 更新软件包列表:

    sudo apt update
  2. 安装 OpenSSH 服务器:

    Ubuntu如何SSH远程服务器?-图2
    (图片来源网络,侵删)
    sudo apt install openssh-server
  3. 检查 SSH 服务状态:

    sudo systemctl status ssh

    如果看到 active (running),说明服务已成功启动并正在运行。

  4. 启动并设置开机自启 (如果未自动启动):

    sudo systemctl start ssh
    sudo systemctl enable ssh

在客户端电脑上安装 SSH 客户端

  • Linux / macOS: 通常已经预装了 SSH 客户端,打开终端,输入 ssh 命令,如果能看到帮助信息,说明已安装。
  • Windows:
    • 推荐 (Windows 10/11): 使用内置的 OpenSSH 客户端,直接在命令提示符 或 PowerShell 中使用 ssh 命令即可。
    • 传统方式: 使用第三方客户端,如 PuTTY, MobaXterm 等,PuTTY 是一个非常流行的选择。

首次连接 (基本用法)

假设你的服务器 IP 地址是 168.1.100,用户名是 ubuntu

Ubuntu如何SSH远程服务器?-图3
(图片来源网络,侵删)

在客户端的终端中,输入以下命令:

ssh ubuntu@192.168.1.100
  • ubuntu 是你要登录的服务器用户名。
  • 168.1.100 是服务器的 IP 地址。

首次连接会提示:

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是 SSH 的安全机制,它在警告你正在连接一个你之前没有连接过的服务器,指纹是用来验证服务器身份的,如果确认 IP 地址正确,输入 yes 并回车。

之后,系统会提示你输入该用户的密码:

ubuntu@192.168.1.100's password:

输入密码(输入时不会显示任何字符),然后按回车,如果密码正确,你将成功登录到服务器的命令行界面。


更安全的连接方式 (使用 SSH 密钥)

每次输入密码很麻烦,而且有被暴力破解的风险,强烈推荐使用 SSH 密钥对 进行认证,这是一种更安全、更便捷的方式。

为什么推荐使用密钥?

  • 安全性高: 密钥比密码复杂得多,极难被破解。
  • 方便: 配置好后,登录时无需输入密码。
  • 自动化: 便于脚本自动化操作,无需人工干预。

步骤:

第1步:在客户端生成 SSH 密钥对

在你的客户端电脑上打开终端,运行以下命令:

ssh-keygen -t ed25519 -C "your_email@example.com"
  • -t ed25519:指定密钥类型,Ed25519 是一种现代、安全的加密算法,推荐使用。
  • -C "...":添加一个注释,通常是你的邮箱,用于标识密钥。

命令会提示你:

  1. 保存密钥的位置: 直接按回车,使用默认路径 ~/.ssh/id_ed25519
  2. 设置密码(可选): 可以设置一个额外的密码来保护你的私钥,如果设置了,每次使用私钥时都需要输入这个密码,如果不想输入,可以直接按回车跳过。

执行完成后,你的用户主目录下会多出一个 .ssh 文件夹,里面包含:

  • id_ed25519私钥绝对不能泄露! 保存在你的客户端电脑上。
  • id_ed25519.pub公钥,可以安全地分享给任何人或服务器。

第2步:将公钥上传到服务器

有两种常用方法:

方法A:使用 ssh-copy-id 命令 (最简单)

如果你的客户端系统支持 ssh-copy-id (Linux, macOS, Windows WSL/PowerShell),这是最简单的方法,它会自动将你的公钥追加到服务器上指定用户的 ~/.ssh/authorized_keys 文件中。

ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@192.168.1.100

系统会提示你输入 ubuntu 用户的密码,验证通过后,你的公钥就会被安全地复制到服务器上。

方法B:手动复制公钥内容

ssh-copy-id 不可用,你可以手动操作:

  1. 在客户端,查看你的公钥内容:

    cat ~/.ssh/id_ed25519.pub

    你会看到一长串以 ssh-ed25519 开头的文本。

  2. 登录到服务器(使用密码方式):

    ssh ubuntu@192.168.1.100
  3. 在服务器上,确保 .ssh 目录和 authorized_keys 文件存在并拥有正确的权限:

    mkdir -p ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  4. 将刚才复制的公钥内容,粘贴到 authorized_keys 文件的末尾:

    nano ~/.ssh/authorized_keys

    (使用 nano, vim 或其他编辑器粘贴并保存)

第3步:使用密钥进行连接

完成上述步骤后,再次尝试连接:

ssh ubuntu@192.168.1.100

这次,如果一切顺利,你应该可以直接登录,而无需输入服务器密码了!


常用 SSH 命令和技巧

  • 指定用户名和端口: 如果你的 SSH 服务运行在非标准端口(2222),可以这样连接:

    ssh -p 2222 ubuntu@192.168.1.100
  • 断开连接:

    • 输入 exit 命令。
    • 或者使用快捷键 Ctrl + D
  • 在后台稳定运行命令: 有时候你需要在服务器上运行一个长时间的任务,但又不想保持 SSH 连接不断,可以使用 tmuxscreen

    1. 安装 tmux:
      sudo apt install tmux
    2. 启动一个 tmux 会话:
      tmux new -s my_session
    3. 在会话中运行你的命令(python my_script.py)。
    4. 断开会话(但保持其运行):Ctrl + B,然后按 D
    5. 稍后重新连接到会话:
      tmux attach -t my_session

      这样,即使你关闭了 SSH 客户端,服务器上的命令也会继续运行。


SSH 配置优化 (~/.ssh/config)

每次都输入 -p 2222user@host 很麻烦。~/.ssh/config 文件可以让你为每个服务器创建一个“别名”。

  1. 编辑配置文件:

    nano ~/.ssh/config
  2. 添加以下内容:

    # 为我的生产服务器创建一个别名
    Host prod-server
        HostName 192.168.1.100
        User ubuntu
        Port 22
        IdentityFile ~/.ssh/id_ed25519
        # 如果不想每次输入私钥密码,可以使用 ssh-agent
        # AddKeysToAgent yes
    # 为我的另一台测试服务器创建别名
    Host test-server
        HostName 203.0.113.55
        User admin
        Port 2222
        IdentityFile ~/.ssh/id_rsa_test
  3. 保存文件后,连接变得极其简单:

    ssh prod-server
    ssh test-server

    这比记住完整的 IP、用户名和端口方便多了!


常见问题与解决方案

Connection refused (连接被拒绝)

  • 原因: 服务器上的 SSH 服务没有运行,或者防火墙阻止了连接。
  • 解决方案:
    1. 在服务器上检查 SSH 服务状态:sudo systemctl status ssh,如果没运行,启动它:sudo systemctl start ssh
    2. 在服务器上检查防火墙(如 ufw)是否允许 SSH 端口(默认是 22)。
      # 检查 ufw 状态
      sudo ufw status
      # SSH 被阻止,允许它
      sudo ufw allow OpenSSH
      # 或者允许特定端口
      sudo ufw allow 2222/tcp
      # 启用防火墙
      sudo ufw enable

Permission denied (publickey,password) (权限被拒绝)

  • 原因: 这是最常见的错误,通常是因为:
    1. 你使用了密钥认证,但服务器上的 authorized_keys 文件不存在或内容不正确。
    2. 服务器上的 .ssh 目录或 authorized_keys 文件的权限不正确,SSH 非常严格,只允许所有者读写。
    3. 你尝试使用密码,但服务器禁用了密码登录(为了安全)。
  • 解决方案:
    1. 检查权限: 在服务器上运行以下命令修复权限:
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
    2. 确保文件存在: ls -l ~/.ssh/authorized_keys
    3. 检查公钥内容: 确保公钥文件内容正确无误,并且没有多余的空格或换行符。
    4. 检查服务器配置: 如果你想用密码登录,检查 /etc/ssh/sshd_config 文件,确保 PasswordAuthentication yes 这一行没有被注释掉(),修改后需要重启 SSH 服务:sudo systemctl restart sshd

Could not resolve hostname (无法解析主机名)

  • 原因: 你的客户端无法通过你提供的主机名或 IP 地址找到服务器。
  • 解决方案:
    1. 检查 IP 地址/主机名: 确保你输入的 IP 地址或域名是正确的。
    2. 检查网络连接: 确保你的客户端电脑能访问互联网,并且网络没有问题。
    3. DNS 问题: 如果使用域名,可能是 DNS 解析问题,尝试用 IP 地址连接看是否成功。

连接缓慢或卡顿

  • 原因: 可能是 DNS 反向解析问题,或者网络延迟。
  • 解决方案:
    1. 在服务器上禁用 DNS 反向解析: 编辑 /etc/ssh/sshd_config 文件,找到 UseDNS 这一行,将其值设为 no
      UseDNS no

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

    2. 检查网络延迟: 使用 ping 命令测试到服务器的网络延迟:ping 192.168.1.100,如果延迟很高,可能是网络本身的问题。

希望这份详细的指南能帮助你顺利地在 Ubuntu 上使用 SSH!

分享:
扫描分享到社交APP
上一篇
下一篇