Linux 入门指南 · 第七章:远程使用一台 Linux 主机。
SSH 在加密连接上提供远程登录、命令执行和文件传输。使用时要分清两台机器:本地机器运行客户端,远程机器运行 SSH 服务。本地终端中建立连接后,输入的命令通常在远程主机执行。
本章使用示例用户 aron、示例地址 192.168.1.20 和示例端口 2222。这些值只用于说明格式,不代表你的主机配置。通过 SSH 修改配置前,应先确认当前操作的是哪台机器。
一、连接之前需要哪些条件
| 条件 | 含义 |
|---|---|
| 客户端 | 本地有 ssh 命令 |
| 服务端 | 远程主机安装并运行 SSH 服务 |
| 网络路径 | 地址与端口可达,相关访问规则允许连接 |
| 账号 | 远程账号存在且允许使用相应登录方式 |
| 认证信息 | 密码、私钥或管理员分配的其他认证方式 |
查看本地客户端版本:
ssh -V
如果需要在自己的 Linux 主机上安装服务端,按发行版选择一种方式。安装服务端意味着让这台机器提供远程登录能力。
Debian/Ubuntu 常见命令:
sudo apt install openssh-server
systemctl status ssh.service
采用 DNF 的系统常见命令:
sudo dnf install openssh-server
systemctl status sshd.service
在使用 systemd 的系统中,确认服务名称和已有配置后,可通过 sudo systemctl enable --now 服务名 设置启动。实际监听端口以服务配置和 sudo ss -lntp 的结果为准,不应为了匹配示例而修改端口。
云主机还需要检查平台的安全组或防火墙规则。允许 SSH 访问与允许 Web 端口访问是不同配置。
二、第一次连接:确认主机身份
下面的命令在本地终端执行:
ssh -p 2222 aron@192.168.1.20
首次连接时,客户端可能提示远程主机密钥的指纹。它回答的是“连接到的是哪台服务器”,并不是在验证你的用户密码。
应通过管理员提供的信息、云控制台或其他可信渠道核对指纹。若能通过控制台直接访问服务器,可以在服务器上查看相应主机公钥的指纹,例如:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
主机可能使用其他类型的密钥,应比较提示中对应的类型。核对后接受,客户端通常将主机身份记录在本地 ~/.ssh/known_hosts。
主机密钥与用户密钥的区别
| 密钥 | 用来证明什么 | 通常由谁持有 |
|---|---|---|
| 主机密钥 | 服务器的身份 | SSH 服务端 |
| 用户密钥 | 登录用户持有相应私钥 | 用户的客户端 |
收到“主机密钥发生变化”的提示时,可能是系统重装、地址复用或其他异常。先确认变更原因并核对新指纹,再更新记录,不要直接关闭主机身份检查。
确认确实需要移除旧记录后,对非默认端口可使用:
ssh-keygen -R '[192.168.1.20]:2222'
此命令只移除本地记录,不会证明新的主机身份可信。
三、密码登录与密钥登录
密码登录
服务器允许密码认证时,连接后会提示输入远程账号密码。输入时通常没有回显。
登录成功后,可以确认远程身份和位置:
hostname
whoami
pwd
用 exit 退出远程 Shell,返回本地。SSH 服务策略可能禁用密码认证或 root 登录,此时应使用管理员允许的方式。
在本地创建用户密钥
下面命令在本地机器执行,创建一对用于登录的密钥:
ssh-keygen -t ed25519 -f "$HOME/.ssh/id_ed25519_linux_guide" -C 'linux-guide'
创建时设置用于保护私钥的口令。指定路径若已存在,工具会询问是否覆盖;已有密钥仍在使用时应换一个名称。
| 文件 | 内容 | 保存方式 |
|---|---|---|
id_ed25519_linux_guide |
私钥 | 保留在客户端,限制访问 |
id_ed25519_linux_guide.pub |
公钥 | 可安装到被授权登录的服务器 |
安装到服务器的是公钥,私钥不需要上传。 私钥口令用于解锁本地私钥,与远程账号密码是不同信息。
安装公钥并验证连接
如果本地有 ssh-copy-id,且服务器允许当前账号通过已有方式登录,可以运行:
ssh-copy-id -i "$HOME/.ssh/id_ed25519_linux_guide.pub" -p 2222 aron@192.168.1.20
它会把公钥添加到远程账号的授权文件。也可以由管理员或云平台把公钥安装到对应账号,常见位置是远程 ~/.ssh/authorized_keys,但具体路径可由服务端配置改变。
显式指定私钥连接:
ssh -i "$HOME/.ssh/id_ed25519_linux_guide" -p 2222 aron@192.168.1.20
验证新的登录方式成功之前,保留现有可用会话。若之后调整服务端认证策略,先使用该系统实际的 sshd 程序运行 sshd -t 检查配置,再按服务管理方式应用。
常见权限要求
在本地客户端,可以限制私钥访问:
chmod 700 "$HOME/.ssh"
chmod 600 "$HOME/.ssh/id_ed25519_linux_guide"
在远程账号下,常见授权文件权限为:
chmod 700 "$HOME/.ssh"
chmod 600 "$HOME/.ssh/authorized_keys"
这些命令针对已经存在的文件。文件所有者、上级目录是否可被其他用户写入,以及 SELinux 等策略也可能影响认证,不能只看一个权限数字。
四、使用连接别名与 SSH 配置
在本地 ~/.ssh/config 中保存连接参数:
Host linux-notes
HostName 192.168.1.20
User aron
Port 2222
IdentityFile ~/.ssh/id_ed25519_linux_guide
IdentitiesOnly yes
保存后限制配置文件权限:
chmod 600 "$HOME/.ssh/config"
以后可以直接连接:
ssh linux-notes
Host 是本地别名,不需要在 DNS 中存在。IdentitiesOnly yes 可以让客户端按指定身份文件尝试认证,避免代理中大量其他密钥干扰这个连接。
如果本地已经运行兼容的认证代理,可以使用:
ssh-add "$HOME/.ssh/id_ed25519_linux_guide"
代理可在一定范围内缓存解锁后的认证能力,生命周期取决于桌面会话或代理配置。没有运行代理时,先确认本机环境的管理方式;密钥登录本身并不要求必须使用代理。
五、远程执行单条命令
ssh linux-notes 'hostname; uptime; df -h'
本地 Shell 先处理引号,SSH 再把命令交给远程环境执行。上例用单引号保留命令内容,避免本地提前展开其中的变量。
比较下面两条命令:
ssh linux-notes 'printf "%s\n" "$HOME"'
ssh linux-notes "printf '%s\n' '$HOME'"
第一条的 $HOME 在远程展开;第二条的 $HOME 会先在本地双引号中展开,再成为远程命令的一部分。复杂命令应明确每一层的解析位置,避免混用本地和远程路径。
远程非交互命令不一定读取与交互登录相同的配置文件。需要依赖固定路径或环境的任务,应显式设置,而不是假设登录时可用的命令始终可用。
六、传输文件:scp、sftp 与 rsync
scp:直接复制
以下命令在本地执行:
scp -P 2222 ./notes.txt aron@192.168.1.20:/home/aron/notes.txt
scp -P 2222 aron@192.168.1.20:/home/aron/app.log ./app.log
scp -r ./project linux-notes:/home/aron/uploads/
第一条上传,第二条下载,第三条使用连接别名复制目录。远程目标目录应事先存在,并且当前账号有写权限。
注意 ssh 指定端口使用小写 -p,scp 使用大写 -P;scp -p 表示保留部分文件属性。
sftp:交互式传输
sftp -P 2222 aron@192.168.1.20
进入后,常用命令如下:
| 命令 | 作用 |
|---|---|
pwd、ls |
查看远程目录与条目 |
lpwd、lls |
查看本地目录与条目 |
cd、lcd |
切换远程、本地目录 |
put notes.txt |
上传本地文件 |
get app.log |
下载远程文件 |
bye |
退出 |
SFTP 通过 SSH 提供文件传输,与传统 FTP 是不同协议。
rsync:重复同步目录
两端都具备 rsync,且 SSH 连接已配置时,可以先预览:
rsync -av --dry-run ./project/ linux-notes:/home/aron/project-copy/
确认目标和变更后,移除 --dry-run 执行同步:
rsync -av ./project/ linux-notes:/home/aron/project-copy/
| 写法 | 含义 |
|---|---|
project/ |
传输目录中的内容 |
project |
传输目录本身,结果还取决于目标是否存在 |
-a |
归档模式,尽可能保留属性,仍受权限与文件系统限制 |
-v |
显示过程 |
--dry-run |
展示计划变更,不实际同步 |
以上命令没有启用 --delete,因此不会为了镜像源目录而删除目标中多出来的文件。但目标同名文件仍可能更新。同步副本也可能继承源文件的错误修改,不能自动替代有历史版本的备份。
七、远程会话与后台任务
SSH 断开后,直接依赖该登录会话的任务可能结束。Shell 的 & 只表示后台运行,不能保证任务在断线后继续,也不提供自动重启。
需要保留交互工作现场时,可以使用 tmux:
tmux new -s notes
会话内按 Ctrl+B,松开后再按 D,可以暂时分离。回到终端后查看与恢复:
tmux ls
tmux attach -t notes
分离通常不会停止会话中的程序,但主机重启后会话不会自动恢复。所有窗口都退出时,对应会话也会结束。
nohup 适合部分临时后台命令,但不提供完整的服务生命周期管理。需要长期运行、自动重启和统一日志的程序,应按第四章的方式交给 systemd 或其他服务管理器。
八、按连接阶段排查问题
| 现象 | 优先检查 |
|---|---|
找不到 ssh 命令 |
本地是否安装客户端,命令是否在 PATH 中 |
| 名称解析失败 | 地址或别名拼写、SSH 配置、名称解析 |
| 连接超时 | 网络路径、端口、访问控制与目标是否在线 |
Connection refused |
端口是否监听,是否连接错端口或被明确拒绝 |
| 主机密钥变化 | 服务器身份是否确实改变,先核对指纹 |
Permission denied (publickey) |
用户名、公钥安装位置、私钥选择和服务端策略 |
| 私钥权限过宽 | 本地私钥和目录权限 |
| 登录成功但传输失败 | 远程目标路径、写权限、剩余空间和传输子系统 |
客户端查看详细连接信息:
ssh -v linux-notes
在服务器控制台或另一条可用连接中,再检查对应 SSH 服务的状态和日志。日志可能包含用户名、主机名和路径,分享时应按实际需要处理这些信息。
九、命令速查
| 命令 | 用途 |
|---|---|
ssh -p 端口 用户@地址 |
建立远程连接 |
ssh-keygen -t ed25519 -f 密钥路径 |
创建指定名称的用户密钥 |
ssh-keygen -lf 公钥文件 |
查看密钥指纹 |
ssh-copy-id -i 公钥 -p 端口 用户@地址 |
通过已有认证方式安装公钥 |
ssh -i 私钥 用户@地址 |
指定私钥连接 |
ssh 别名 '命令' |
执行远程命令 |
scp -P 端口 本地文件 用户@地址:远程路径 |
上传文件 |
sftp 别名 |
进入交互式文件传输 |
rsync -av --dry-run 源/ 别名:目标/ |
预览同步变更 |
tmux attach -t 会话名 |
恢复终端会话 |
上一篇:用户、用户组与权限管理 · 下一篇:Shell 脚本与定时任务 · 指南目录。

