菜鸟科技网

ssh命令测试方法有哪些?

基础连接性测试 (最常用)

这个测试的目的是验证你是否能够成功登录到远程服务器。

ssh命令测试方法有哪些?-图1
(图片来源网络,侵删)

场景1:使用用户名和密码登录 (适用于临时测试或未配置密钥的情况)

这是最直接的方式,系统会提示你输入密码。

命令格式:

ssh -l <用户名> <远程主机IP或域名>
# 或者更常见的格式:
ssh <用户名>@<远程主机IP或域名>

示例: 假设你的用户名是 testuser,远程服务器 IP 是 168.1.100

ssh testuser@192.168.1.100

如何判断测试结果:

ssh命令测试方法有哪些?-图2
(图片来源网络,侵删)
  • 成功:

    1. 终端会提示你输入密码:testuser@192.168.1.100's password:
    2. 你输入密码(输入时不会显示任何字符),然后按回车。
    3. 如果认证成功,你将直接看到远程服务器的命令行提示符([testuser@server ~]$),表示你已经成功登录。
  • 失败:

    • 连接被拒绝: ssh: connect to host 192.168.1.100 port 22: Connection refused
      • 可能原因: 远程主机的 SSH 服务未启动,或者防火墙阻止了 22 端口。
    • 无路由到主机: ssh: connect to host 192.168.1.100 port 22: No route to host
      • 可能原因: 网络不通,检查你的网络连接、IP 地址是否正确。
    • 权限被拒绝 (publickey,password):Permission denied (publickey,password).
      • 可能原因: 这是最常见的错误之一,通常意味着服务器只允许密钥登录,或者你的用户名/密码错误。
    • 认证失败: Permission denied, please try again.
      • 可能原因: 你输入的密码错误。

高级功能性测试

当你已经能成功连接后,可以测试 SSH 的一些高级功能。

场景2:使用 SSH 密钥对登录 (更安全、更方便)

这是生产环境推荐的方式,你需要先在本地生成密钥,并将公钥上传到服务器。

ssh命令测试方法有哪些?-图3
(图片来源网络,侵删)

步骤 1: 在本地生成 SSH 密钥 (如果还没有的话)

# 一路按回车使用默认选项即可
ssh-keygen -t rsa -b 4096

这会在 ~/.ssh/ 目录下生成 id_rsa (私钥) 和 id_rsa.pub (公钥)。

步骤 2: 将公钥复制到远程服务器

# 方法A: 使用 ssh-copy-id 命令 (最简单)
ssh-copy-id -i ~/.ssh/id_rsa.pub testuser@192.168.1.100
# 方法B: 手动复制 (ssh-copy-id 不可用)
# 1. 在本地查看公钥内容
cat ~/.ssh/id_rsa.pub
# 2. 复制输出的全部内容
# 3. 登录到远程服务器 (用密码)
ssh testuser@192.168.1.100
# 4. 在远程服务器上,将公钥追加到 authorized_keys 文件中
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴刚才复制的公钥内容到这里" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

步骤 3: 测试密钥登录

ssh testuser@192.168.1.100

如何判断测试结果:

  • 成功: 直接登录,无需输入密码。
  • 失败: 仍然提示输入密码或 Permission denied
    • 可能原因:
      1. 远程服务器 ~/.ssh/authorized_keys 文件权限不正确,必须是 600
      2. 远程服务器 SSH 服务配置 (/etc/ssh/sshd_config) 中 PubkeyAuthentication 被设置为 no
      3. 你上传的是公钥,但登录时使用的是错误的私钥。

诊断和调试测试

当你遇到连接问题时,这些选项可以帮助你定位问题。

场景3:启用详细模式 (Verbose Mode)

ssh 命令的 -v (verbose) 选项会打印出详细的调试信息,这对于排查连接问题非常有用,你可以使用多个 -v 来增加详细程度(-vvv 最详细)。

命令:

ssh -vvv testuser@192.168.1.100

你会看到什么:

  • 本地 SSH 客户端的版本信息。
  • 尝试的认证方法(如:尝试公钥、尝试密码等)。
  • DNS 解析过程。
  • TCP 连接的建立过程(Connecting to 192.168.1.100 port 22)。
  • 远程 SSH 服务器版本和密钥交换信息。
  • 如果连接失败,这里会明确指出在哪一步失败了(是网络不通,还是认证失败)。

如何判断测试结果: 通过阅读 -vvv 的输出,你可以精确地定位到问题所在,如果看到 debug1: Trying private key: /home/your_user/.ssh/id_rsa,然后紧接着 debug1: Offering public key: /home/your_user/.ssh/id_rsa RSA SHA256:xxx agentdebug1: Authentications that can continue: publickey,password,就说明密钥认证失败了,服务器回退到密码认证。


场景4:指定非标准的 SSH 端口

有些服务器为了安全,会将 SSH 服务的端口从默认的 22 修改为其他端口(2222),这时需要使用 -p 选项。

命令:

ssh -p 2222 testuser@192.168.1.100

如何判断测试结果:

  • 成功: 像往常一样登录。
  • 失败: 如果忘记 -p 选项,会提示 Connection refused,因为客户端在尝试连接 22 端口。

场景5:执行远程命令而不登录交互式 Shell

有时候你只需要在远程服务器上执行一个命令,然后立即返回本地。

命令:

# 在远程服务器上创建一个文件
ssh testuser@192.168.1.100 "touch /tmp/test_file_from_ssh"
# 在远程服务器上查看系统负载
ssh testuser@192.168.1.100 "uptime"

如何判断测试结果:

  • 成功: 命令会立即在本地终端执行并显示其输出,然后返回本地命令行,你不会进入远程服务器的 Shell。
  • 失败: 会看到命令执行的错误信息,bash: touch: command not found(如果远程服务器没有 touch 命令)或 Permission denied

场景6:测试端口转发 (隧道)

SSH 可以创建安全的加密隧道,这是一个更高级的测试,但功能强大。

本地端口转发: 将本地机器的某个端口(本地:8080)的流量,通过 SSH 服务器(jump-server.com)转发到目标服务器(internal-db.example.com:3306)的某个端口。

命令:

ssh -L 8080:internal-db.example.com:3306 testuser@jump-server.com

这个命令会建立一个 SSH 连接并保持,然后在你的本地机器上,访问 localhost:8080 就相当于访问 internal-db.example.com:3306

如何判断测试结果:

  • 成功: 命令会挂起,不返回命令行,这表示隧道已建立,你可以打开另一个终端,使用 telnetnc 测试本地端口:
    # 在另一个终端窗口执行
    telnet localhost 8080

    如果能成功连接,说明隧道工作正常。

  • 失败: telnet 连接失败,检查 ssh -L 命令中的端口、目标地址和用户名是否正确。

一个典型的测试流程

  1. 检查网络: ping <远程主机IP> 确保网络是通的。
  2. 基础测试: ssh -vvv <用户名>@<远程主机IP>,使用 -vvv 看看详细的连接过程。
  3. 检查认证:
    • -vvv 显示在尝试密码,说明密钥未配置成功,检查 authorized_keys 文件和权限。
    • -vvv 显示在尝试公钥但失败,检查本地私钥路径是否正确。
  4. 测试功能: 尝试执行一个简单命令,如 ssh <用户名>@<远程主机IP> "ls -l",确认连接是功能性的。
  5. 检查配置: 如果以上都失败,检查远程服务器上的 SSH 配置文件 /etc/ssh/sshd_config 和本地客户端的配置文件 ~/.ssh/config
分享:
扫描分享到社交APP
上一篇
下一篇