菜鸟科技网

Linux SSH命令密码如何正确设置与使用?

这是一个非常常见的需求,但理解其背后的原理和最佳实践至关重要。

Linux SSH命令密码如何正确设置与使用?-图1
(图片来源网络,侵删)

核心要点

在大多数现代 Linux 发行版中,强烈建议使用 SSH 密钥对进行认证,而不是密码,原因如下:

  • 安全性更高:密码容易被暴力破解(穷举攻击),而密钥对(尤其是带有密码保护的私钥)几乎不可能被破解。
  • 更便捷:配置好密钥后,登录时无需输入密码,可以实现自动化脚本、无密码登录等。
  • 更高效:密钥认证通常比密码认证更快。

理解如何使用密码登录仍然是基础,并且在某些特定场景下(如临时访问、某些云服务器的初始设置)仍然有用。


直接使用密码登录(最直接但不推荐用于自动化)

这是最基本的方式,当你执行 ssh 命令时,系统会提示你输入密码。

命令格式

ssh [用户名]@[主机地址或IP]

示例

# 登录到 user@example.com 这台服务器
ssh user@example.com

执行后,终端会显示类似下面的提示,并要求你输入密码:

Linux SSH命令密码如何正确设置与使用?-图2
(图片来源网络,侵删)
user@example.com's password: 

注意:为了安全,你输入的密码字符是不会显示在屏幕上的(光标也不会移动),你只需正常输入,然后按回车键即可。

选项:指定 SSH 端口

如果服务器的 SSH 服务不是默认的 22 端口,你需要使用 -p 选项指定端口。

ssh -p 2222 user@example.com

在命令行中直接提供密码(极其不推荐)

你也可以使用 sshpass 工具在命令行中一次性提供密码,从而避免交互式输入。这存在巨大的安全风险,请务必谨慎使用。

安全风险

  • 密码会暴露在命令历史记录中:任何人都可以通过 history 命令看到你的密码。
  • 密码会出现在进程列表中:使用 ps 命令可以看到密码明文。
  • 脚本泄露风险:如果包含此命令的脚本文件被泄露,密码也会一同泄露。

安装 sshpass

sshpass 通常不预装在系统中,你需要先安装它。

Linux SSH命令密码如何正确设置与使用?-图3
(图片来源网络,侵删)
  • 基于 Debian/Ubuntu 的系统:

    sudo apt-get update
    sudo apt-get install sshpass
  • 基于 RHEL/CentOS 的系统:

    sudo yum install sshpass

使用方法

使用 -p 选项(注意,这个 -psshpass 的选项,与 ssh-p 端口选项不同)来指定密码。

# -p 后面紧跟你的密码
sshpass -p 'your_password' ssh user@example.com
# 如果需要指定端口,将 ssh 命令用引号括起来
sshpass -p 'your_password' ssh -p 2222 'user@example.com'

更安全的替代方案(仍然不完美,但比直接暴露好)

你可以从文件中读取密码,而不是在命令行中直接写。

# 创建一个包含密码的文件(注意权限!)
echo "your_password" > password.txt
chmod 600 password.txt  # 只有所有者可以读写
# 使用 -f 选项从文件读取密码
sshpass -f password.txt ssh user@example.com
# 用完后最好删除文件
rm password.txt

即使这样,密码仍然会出现在进程列表中,只是没有留在命令历史里。


推荐的替代方案:SSH 密钥对认证

这才是专业和安全的做法。

工作原理

它使用一对密钥:私钥(存储在你的本地机器上,必须保密)和公钥(你可以安全地分享给任何人,将其添加到远程服务器的授权列表中)。

步骤 1:在本地生成密钥对

如果你的 ~/.ssh 目录下没有 id_rsa(或 id_ed25519)和 id_rsa.pub(或 id_ed25519.pub)这两个文件,你需要生成它们。

# 使用 Ed25519 算法(现代推荐)
ssh-keygen -t ed25519
# 或者使用传统的 RSA 算法
ssh-keygen -t rsa -b 4096

执行后,会提示你:

  1. 保存位置:直接按回车,使用默认的 ~/.ssh/id_rsa
  2. 设置密码(可选但强烈推荐):可以为你的私钥设置一个额外的密码,这即使你的私钥文件被盗,别人也无法使用,如果设置了,每次使用私钥时都需要输入这个密码。

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

有几种方法可以实现:

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

这个命令会自动将你的公钥内容追加到远程服务器 ~/.ssh/authorized_keys 文件的末尾。

# 首次需要输入一次密码来完成复制
ssh-copy-id user@example.com

方法 B:手动复制(ssh-copy-id 不可用)

  1. 查看你的公钥内容:

    cat ~/.ssh/id_rsa.pub

    复制输出的全部内容(通常以 ssh-rsassh-ed25519 开头,以你的邮箱结尾)。

  2. 登录到远程服务器(最后一次使用密码登录):

    ssh user@example.com
  3. 在远程服务器上,确保 .ssh 目录存在且权限正确,然后将公钥内容追加到 authorized_keys 文件:

    # 进入 .ssh 目录
    cd ~/.ssh
    # 确保目录权限正确
    chmod 700 .
    # 将公钥内容粘贴到 authorized_keys 文件中
    # (用你刚才复制的公钥内容替换下面的 <YOUR_PUBLIC_KEY>)
    echo "<YOUR_PUBLIC_KEY>" >> authorized_keys
    # 确保 authorized_keys 文件权限正确
    chmod 600 authorized_keys

步骤 3:测试无密码登录

退出远程服务器,然后再次尝试登录:

ssh user@example.com

如果一切顺利,你应该可以直接登录,而无需输入任何密码(如果你为私钥设置了密码,系统会提示你输入那个密码,这可以通过 ssh-agent 来进一步优化)。


总结与最佳实践

方法 优点 缺点 推荐场景
交互式密码登录 简单,无需额外工具 安全性低,无法自动化,每次都要手动输入 临时、一次性登录;调试 SSH 连接问题。
sshpass 命令行 可以实现自动化脚本 极不安全,密码会暴露在历史记录和进程中 强烈不推荐,仅在绝对可控的、临时的测试环境中使用。
SSH 密钥对 安全性极高,支持自动化,无需重复输入密码 初始配置稍显复杂 所有生产环境和日常使用的标准做法

最终建议:

  1. 永远优先使用 SSH 密钥对
  2. 只在万不得已的情况下才使用密码登录
  3. 绝对不要在脚本或命令行中直接硬编码密码,如果必须实现自动化,请研究更安全的方案,如 ssh-agent、Ansible Vault 或云服务商提供的 IAM 角色。
分享:
扫描分享到社交APP
上一篇
下一篇