下面我将从基础到高级,系统地介绍 ssh 命令的用法。

核心语法与基本用法
ssh 命令的基本语法结构如下:
ssh [用户名@]主机名 [命令]
[用户名@]:可选,如果不指定,默认使用你当前本地的用户名。主机名:必需,可以是 IP 地址或域名。[命令]:可选,如果指定,ssh会在远程主机上执行该命令后立即退出,如果不指定,ssh会启动一个交互式 shell。
最常用的基本命令
远程登录到服务器
这是最常见的用法,它会打开一个远程终端,让你像坐在电脑前一样操作远程服务器。
# 使用当前本地用户名登录 ssh user@example.com # 指定用户名登录 ssh root@192.168.1.100
执行后,系统会提示你输入该用户的密码,输入密码(输入时不会显示任何字符)并按回车,即可登录。
在远程主机上执行单条命令
如果你只想在远程服务器上运行一个命令并获取结果,而不想进入交互式 shell,可以这样操作:

# 在 example.com 上查看磁盘使用情况 ssh user@example.com 'df -h' # 在 example.com 上创建一个文件 ssh user@example.com 'touch /tmp/remote_file.txt'
注意:命令部分通常用单引号 括起来,这样可以防止本地 shell 对其进行解释。
更安全高效的认证方式:SSH 密钥
每次都输入密码很麻烦,也不够安全,推荐使用SSH 密钥对进行认证,这是一种更安全、更便捷的方式。
生成 SSH 密钥对
在你的本地机器上执行此命令,如果已经存在,可以跳过。
# -t 指定密钥类型,ed25519 是目前推荐的高效安全的类型 # -C 添加一个注释,通常是你的邮箱,方便识别 ssh-keygen -t ed25519 -C "your_email@example.com"
执行后,会提示你选择保存密钥的位置(直接回车使用默认的 ~/.ssh/id_ed25519)和设置一个可选的密码短语(passphrase),设置密码短语可以为你的私钥再增加一层保护。

完成后,你会在 ~/.ssh/ 目录下找到两个文件:
id_ed25519:私钥,必须严格保密,绝对不要泄露给任何人!id_ed25519.pub:公钥,可以安全地分享给任何人或任何服务。
将公钥复制到远程服务器
你需要将公钥 (id_ed25519.pub) 的内容添加到远程服务器的 ~/.ssh/authorized_keys 文件中,有几种方法:
使用 ssh-copy-id 命令(最简单)
# 将你的公钥复制到 user@example.com 的 authorized_keys 文件中 ssh-copy-id user@example.com
这个命令会自动处理权限设置,非常方便。
手动复制
ssh-copy-id 不可用,你可以手动操作:
-
在本地机器上查看并复制公钥内容:
cat ~/.ssh/id_ed25519.pub
-
登录到远程服务器(使用密码):
ssh user@example.com
-
在远程服务器上,确保
.ssh目录存在并设置正确权限,然后将公钥内容追加到authorized_keys文件中:# 进入 .ssh 目录 cd ~/.ssh # 设置目录权限(非常重要!) chmod 700 . # 设置文件权限(非常重要!) chmod 600 authorized_keys # 复制粘贴公钥内容到文件末尾 echo "粘贴你的公钥内容到这里" >> authorized_keys
设置完成后,下次你登录时,ssh 就会自动使用你的私钥进行认证,而不再需要输入密码。
常用的高级选项与技巧
指定 SSH 私钥文件
如果你有多个私钥,或者私钥不在默认位置,可以使用 -i 选项指定:
ssh -i /path/to/your/private_key.pem user@example.com
(这在 AWS 等云服务中非常常见,.pem 文件就是私钥。)
指定非标准的 SSH 端口
默认情况下,SSH 使用 22 端口,如果服务器修改了端口,使用 -p 选项:
ssh -p 2222 user@example.com
调试连接问题
当连接出现问题时,-v (verbose) 选项非常有用,它会打印出详细的连接过程信息。
ssh -v user@example.com # 更详细的调试信息 ssh -vvv user@example.com
在后台执行命令(nohup)
当你通过 ssh 在远程服务器上启动一个长时间运行的任务时,如果关闭本地终端,任务也会被中断,可以使用 nohup (No Hang Up) 来解决这个问题:
# nohup 表示不挂断,& 表示在后台运行 ssh user@example.com 'nohup long_running_command > output.log 2>&1 &'
nohup:让进程忽略挂断信号。> output.log:将标准输出重定向到output.log文件。2>&1:将标准错误也重定向到标准输出。&:让命令在后台运行。
通过 SSH 安全地传输文件
虽然 scp 和 sftp 是专门的文件传输工具,但它们底层都使用 SSH 协议,因此同样是安全的。
使用 scp (Secure Copy)
# 从本地复制到远程 scp /path/to/local_file.txt user@example.com:/path/to/remote_directory/ # 从远程复制到本地 scp user@example.com:/path/to/remote_file.txt /path/to/local_directory/ # 复制整个目录(需要加 -r 递归选项) scp -r /path/to/local_dir/ user@example.com:/path/to/remote_dir/
使用 sftp (Interactive File Transfer)
sftp 提供了一个类似 FTP 的交互式命令行界面。
sftp user@example.com # 登录后,可以使用以下命令: ls # 列出文件 cd /path/to/dir # 切换目录 get remote_file # 下载文件 put local_file # 上传文件 exit # 退出
配置文件 (~/.ssh/config)
为了避免每次都输入长长的命令,你可以编辑 ~/.ssh/config 文件来创建别名,这是提升效率的神器!
# 编辑配置文件 nano ~/.ssh/config
示例配置:
# 为我的个人服务器设置一个别名
Host myserver
HostName 203.0.113.10
User john
Port 2222
IdentityFile ~/.ssh/id_ed25519_personal
# 可选:每次连接都要求输入私钥的密码短语
# AddKeysToAgent yes
# 为我的 AWS 服务器设置一个别名
Host aws-prod
HostName ec2-123-45-67-89.compute-1.amazonaws.com
User ec2-user
IdentityFile ~/.ssh/aws_key.pem
配置完成后,你就可以用简单的别名来连接了:
ssh myserver ssh aws-prod
安全最佳实践
- 始终使用密钥认证:比密码认证安全得多。
- 为私钥设置密码短语:即使私钥泄露,没有密码短语也无法使用。
- 禁用密码登录(在服务器上):在服务器的 SSH 配置文件 (
/etc/ssh/sshd_config) 中,设置PasswordAuthentication no,然后重启 SSH 服务,这能极大增强服务器安全性,防止暴力破解。 - 使用非标准端口:将默认的
22端口改为其他高端口,可以减少自动扫描攻击。 - 定期更新 SSH 软件:保持系统和 OpenSSH 包为最新版本,以修复已知的安全漏洞。
希望这份详细的指南能帮助你全面掌握 ssh 命令!
