在 SSH 命令中直接使用密码登录不推荐,因为它存在安全风险(如密码被嗅探、暴力破解),最佳实践是使用SSH 密钥对进行无密码登录。

最直接但危险的方式:sshpass
这是最直接在命令行中指定密码的方法,但它极度不安全,因为你的密码会以明文形式出现在命令历史、进程列表(ps)和日志中,几乎等于公开。
警告:仅用于测试或完全可控的自动化脚本,切勿在生产环境或公共网络上使用。
安装 sshpass
sshpass 通常不是系统默认安装的,你需要先安装它。
-
在 Debian/Ubuntu 上:
(图片来源网络,侵删)sudo apt-get update sudo apt-get install sshpass
-
在 CentOS/RHEL/Fedora 上:
sudo yum install sshpass
使用方法
sshpass 的基本语法是:sshpass -p '你的密码' ssh user@hostname
示例:
# 使用密码 'mysecretpassword' 登录到 '192.168.1.100' 上的 'root' 用户 sshpass -p 'mysecretpassword' ssh root@192.168.1.100
其他常用选项:

-
-P:允许交互式密码提示(与-p相对,通常不常用)。 -
-f filename:从文件中读取密码,这比-p稍好一点,因为密码不会出现在命令行中,但文件本身需要妥善保管。# 创建一个包含密码的文件 echo "mysecretpassword" > /path/to/passfile.txt chmod 600 /path/to/passfile.txt # 设置文件权限,只有所有者可读写 # 使用文件中的密码 sshpass -f /path/to/passfile.txt ssh root@192.168.1.100
标准但交互式的方式:手动输入密码
这是最标准、最常见的方式,当你执行 ssh 命令后,系统会提示你输入密码,然后你手动输入并回车。
优点:
- 安全性高,密码不会出现在命令行或历史记录中。
- 所有 SSH 客户端都支持。
缺点:
- 无法用于自动化脚本,因为需要人工干预。
示例:
# 登录到远程服务器 ssh user@remote_server_ip # 系统会提示你输入密码 user@remote_server_ip's password: # 输入密码,输入时不会显示任何字符(光标不动),输入完成后按回车
最佳实践:使用 SSH 密钥对(无密码登录)
这是业界公认最安全、最方便的 SSH 登录方式,它基于非对称加密,你拥有一对密钥:私钥(留在你的本地机器上,绝不外传)和公钥(可以安全地分发到远程服务器)。
工作流程
- 在本地机器生成密钥对(如果还没有的话)。
- 将公钥复制到远程服务器的
~/.ssh/authorized_keys文件中。 - 登录时,SSH 客户端会用你的私钥去“证明”你的身份,整个过程无需输入密码。
详细步骤
步骤 1:在本地机器生成 SSH 密钥对
如果你的 ~/.ssh 目录下没有 id_rsa(或 id_ed25519)和 id_rsa.pub(或 id_ed25519.pub)文件,就运行以下命令生成,推荐使用更安全的 ed25519 算法。
# -t 指定密钥类型,-C 添加一个注释(通常是你的邮箱) ssh-keygen -t ed25519 -C "your_email@example.com" # 系统会提示你: # 1. 保存密钥的位置(直接回车使用默认的 ~/.ssh/id_ed25519) # 2. 输入一个密码(可选,但强烈建议!这会给私钥再加一层保护) # 如果设置了密码,每次使用私钥时都需要输入这个密码。 # 3. 确认密码
步骤 2:将公钥复制到远程服务器 有多种方法可以实现这一步。
方法 A:使用 ssh-copy-id 命令(最简单推荐)
这个命令会自动将你的公钥追加到远程服务器的 authorized_keys 文件中。
# 将公钥复制到 user@hostname # 第一次连接时,它仍然会提示你输入一次密码 ssh-copy-id user@remote_server_ip # 系统会提示你输入 user@remote_server_ip 的密码 # 输入正确后,你的公钥就会被安全地复制过去
方法 B:手动复制(ssh-copy-id 不可用时)
-
查看你的公钥内容:
cat ~/.ssh/id_ed25519.pub
-
登录到远程服务器(使用密码),然后将公钥内容追加到
authorized_keys文件中:# 1. 登录 ssh user@remote_server_ip # 2. 在远程服务器上执行 mkdir -p ~/.ssh chmod 700 ~/.ssh echo "粘贴你的公钥内容到这里" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
步骤 3:无密码登录 你可以直接尝试登录,应该不会再提示你输入密码了。
ssh user@remote_server_ip # 如果你给私钥设置了密码,这里会提示你输入那个私钥的密码 # 否则,将直接登录成功
高级技巧:使用 SSH 代理转发
如果你需要通过一台“跳板机”(Bastion Host/Jump Server)访问另一台服务器,并且这两台服务器都配置了密钥登录,你可以使用 SSH 代理转发来避免在中间环节重复输入密码。
场景:
- 你(本地) -> 跳板机 (
bastion) -> 目标服务器 (target)
操作步骤:
- 启动 SSH 代理(如果还没启动):
eval "$(ssh-agent -s)"
- 将你的私钥添加到代理(如果还没添加):
ssh-add ~/.ssh/id_ed25519 # 如果你的私钥有密码,这里会提示你输入
- 通过
-A选项登录到跳板机:ssh -A user@bastion_server_ip
-A选项会把你本地 SSH 代理中的身份转发到跳板机上。 - 从跳板机登录到目标服务器时,SSH 会自动使用你转发过来的身份,无需再次输入密码:
ssh user@target_server_ip
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
sshpass |
命令行直接指定,适合脚本 | 极不安全,密码明文暴露 | 仅限本地测试、完全可信的内网自动化脚本 |
| 手动输入 | 安全,标准 | 无法自动化,效率低 | 日常手动管理服务器,偶尔登录 |
| SSH 密钥对 | 非常安全,方便,可自动化 | 初始配置稍复杂 | 强烈推荐,所有生产环境和个人日常使用 |
| SSH 代理转发 | 方便多跳登录,保持会话 | 配置稍复杂 | 需要通过跳板机访问内网服务器的场景 |
最终建议:
- 永远不要在命令行中直接使用明文密码。
- 为你的所有服务器配置 SSH 密钥登录,这是现代系统管理的基石。
- 为你的私钥设置一个强密码,以防止私钥文件被盗用。
- 在自动化脚本中,使用
ssh-agent和ssh-add来管理私钥,而不是硬编码密码。
