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

核心要点
在大多数现代 Linux 发行版中,强烈建议使用 SSH 密钥对进行认证,而不是密码,原因如下:
- 安全性更高:密码容易被暴力破解(穷举攻击),而密钥对(尤其是带有密码保护的私钥)几乎不可能被破解。
- 更便捷:配置好密钥后,登录时无需输入密码,可以实现自动化脚本、无密码登录等。
- 更高效:密钥认证通常比密码认证更快。
理解如何使用密码登录仍然是基础,并且在某些特定场景下(如临时访问、某些云服务器的初始设置)仍然有用。
直接使用密码登录(最直接但不推荐用于自动化)
这是最基本的方式,当你执行 ssh 命令时,系统会提示你输入密码。
命令格式
ssh [用户名]@[主机地址或IP]
示例
# 登录到 user@example.com 这台服务器 ssh user@example.com
执行后,终端会显示类似下面的提示,并要求你输入密码:

user@example.com's password:
注意:为了安全,你输入的密码字符是不会显示在屏幕上的(光标也不会移动),你只需正常输入,然后按回车键即可。
选项:指定 SSH 端口
如果服务器的 SSH 服务不是默认的 22 端口,你需要使用 -p 选项指定端口。
ssh -p 2222 user@example.com
在命令行中直接提供密码(极其不推荐)
你也可以使用 sshpass 工具在命令行中一次性提供密码,从而避免交互式输入。这存在巨大的安全风险,请务必谨慎使用。
安全风险
- 密码会暴露在命令历史记录中:任何人都可以通过
history命令看到你的密码。 - 密码会出现在进程列表中:使用
ps命令可以看到密码明文。 - 脚本泄露风险:如果包含此命令的脚本文件被泄露,密码也会一同泄露。
安装 sshpass
sshpass 通常不预装在系统中,你需要先安装它。

-
基于 Debian/Ubuntu 的系统:
sudo apt-get update sudo apt-get install sshpass
-
基于 RHEL/CentOS 的系统:
sudo yum install sshpass
使用方法
使用 -p 选项(注意,这个 -p 是 sshpass 的选项,与 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
执行后,会提示你:
- 保存位置:直接按回车,使用默认的
~/.ssh/id_rsa。 - 设置密码(可选但强烈推荐):可以为你的私钥设置一个额外的密码,这即使你的私钥文件被盗,别人也无法使用,如果设置了,每次使用私钥时都需要输入这个密码。
步骤 2:将公钥复制到远程服务器
有几种方法可以实现:
方法 A:使用 ssh-copy-id 命令(最简单)
这个命令会自动将你的公钥内容追加到远程服务器 ~/.ssh/authorized_keys 文件的末尾。
# 首次需要输入一次密码来完成复制 ssh-copy-id user@example.com
方法 B:手动复制(ssh-copy-id 不可用)
-
查看你的公钥内容:
cat ~/.ssh/id_rsa.pub
复制输出的全部内容(通常以
ssh-rsa或ssh-ed25519开头,以你的邮箱结尾)。 -
登录到远程服务器(最后一次使用密码登录):
ssh user@example.com
-
在远程服务器上,确保
.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 密钥对 | 安全性极高,支持自动化,无需重复输入密码 | 初始配置稍显复杂 | 所有生产环境和日常使用的标准做法。 |
最终建议:
- 永远优先使用 SSH 密钥对。
- 只在万不得已的情况下才使用密码登录。
- 绝对不要在脚本或命令行中直接硬编码密码,如果必须实现自动化,请研究更安全的方案,如
ssh-agent、Ansible Vault 或云服务商提供的 IAM 角色。
