清风日常

Stay curious. Stay gentle.

听一会儿

4 首收藏
LOVE 2000 封面

LOVE 2000

遠野ひかる

0:004:23
首页/Linux/正文

Linux 入门(七):SSH 远程连接与文件传输

理解 SSH 客户端与服务端、主机身份和用户认证,掌握密码与密钥登录、连接别名、文件传输和 tmux 会话,并按连接阶段排查常见问题。

文章目录 17 个章节

Linux 入门指南 · 第七章:远程使用一台 Linux 主机。

SSH 在加密连接上提供远程登录、命令执行和文件传输。使用时要分清两台机器:本地机器运行客户端,远程机器运行 SSH 服务。本地终端中建立连接后,输入的命令通常在远程主机执行。

本章使用示例用户 aron、示例地址 192.168.1.20 和示例端口 2222。这些值只用于说明格式,不代表你的主机配置。通过 SSH 修改配置前,应先确认当前操作的是哪台机器。

一、连接之前需要哪些条件

条件 含义
客户端 本地有 ssh 命令
服务端 远程主机安装并运行 SSH 服务
网络路径 地址与端口可达,相关访问规则允许连接
账号 远程账号存在且允许使用相应登录方式
认证信息 密码、私钥或管理员分配的其他认证方式

查看本地客户端版本:

bash
ssh -V

如果需要在自己的 Linux 主机上安装服务端,按发行版选择一种方式。安装服务端意味着让这台机器提供远程登录能力。

Debian/Ubuntu 常见命令:

bash
sudo apt install openssh-server
systemctl status ssh.service

采用 DNF 的系统常见命令:

bash
sudo dnf install openssh-server
systemctl status sshd.service

在使用 systemd 的系统中,确认服务名称和已有配置后,可通过 sudo systemctl enable --now 服务名 设置启动。实际监听端口以服务配置和 sudo ss -lntp 的结果为准,不应为了匹配示例而修改端口。

云主机还需要检查平台的安全组或防火墙规则。允许 SSH 访问与允许 Web 端口访问是不同配置。

二、第一次连接:确认主机身份

下面的命令在本地终端执行:

bash
ssh -p 2222 aron@192.168.1.20

首次连接时,客户端可能提示远程主机密钥的指纹。它回答的是“连接到的是哪台服务器”,并不是在验证你的用户密码。

应通过管理员提供的信息、云控制台或其他可信渠道核对指纹。若能通过控制台直接访问服务器,可以在服务器上查看相应主机公钥的指纹,例如:

bash
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

主机可能使用其他类型的密钥,应比较提示中对应的类型。核对后接受,客户端通常将主机身份记录在本地 ~/.ssh/known_hosts。

主机密钥与用户密钥的区别

密钥 用来证明什么 通常由谁持有
主机密钥 服务器的身份 SSH 服务端
用户密钥 登录用户持有相应私钥 用户的客户端

收到“主机密钥发生变化”的提示时,可能是系统重装、地址复用或其他异常。先确认变更原因并核对新指纹,再更新记录,不要直接关闭主机身份检查。

确认确实需要移除旧记录后,对非默认端口可使用:

bash
ssh-keygen -R '[192.168.1.20]:2222'

此命令只移除本地记录,不会证明新的主机身份可信。

三、密码登录与密钥登录

密码登录

服务器允许密码认证时,连接后会提示输入远程账号密码。输入时通常没有回显。

登录成功后,可以确认远程身份和位置:

bash
hostname
whoami
pwd

用 exit 退出远程 Shell,返回本地。SSH 服务策略可能禁用密码认证或 root 登录,此时应使用管理员允许的方式。

在本地创建用户密钥

下面命令在本地机器执行,创建一对用于登录的密钥:

bash
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,且服务器允许当前账号通过已有方式登录,可以运行:

bash
ssh-copy-id -i "$HOME/.ssh/id_ed25519_linux_guide.pub" -p 2222 aron@192.168.1.20

它会把公钥添加到远程账号的授权文件。也可以由管理员或云平台把公钥安装到对应账号,常见位置是远程 ~/.ssh/authorized_keys,但具体路径可由服务端配置改变。

显式指定私钥连接:

bash
ssh -i "$HOME/.ssh/id_ed25519_linux_guide" -p 2222 aron@192.168.1.20

验证新的登录方式成功之前,保留现有可用会话。若之后调整服务端认证策略,先使用该系统实际的 sshd 程序运行 sshd -t 检查配置,再按服务管理方式应用。

常见权限要求

在本地客户端,可以限制私钥访问:

bash
chmod 700 "$HOME/.ssh"
chmod 600 "$HOME/.ssh/id_ed25519_linux_guide"

在远程账号下,常见授权文件权限为:

bash
chmod 700 "$HOME/.ssh"
chmod 600 "$HOME/.ssh/authorized_keys"

这些命令针对已经存在的文件。文件所有者、上级目录是否可被其他用户写入,以及 SELinux 等策略也可能影响认证,不能只看一个权限数字。

四、使用连接别名与 SSH 配置

在本地 ~/.ssh/config 中保存连接参数:

sshconfig
Host linux-notes
    HostName 192.168.1.20
    User aron
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_linux_guide
    IdentitiesOnly yes

保存后限制配置文件权限:

bash
chmod 600 "$HOME/.ssh/config"

以后可以直接连接:

bash
ssh linux-notes

Host 是本地别名,不需要在 DNS 中存在。IdentitiesOnly yes 可以让客户端按指定身份文件尝试认证,避免代理中大量其他密钥干扰这个连接。

如果本地已经运行兼容的认证代理,可以使用:

bash
ssh-add "$HOME/.ssh/id_ed25519_linux_guide"

代理可在一定范围内缓存解锁后的认证能力,生命周期取决于桌面会话或代理配置。没有运行代理时,先确认本机环境的管理方式;密钥登录本身并不要求必须使用代理。

五、远程执行单条命令

bash
ssh linux-notes 'hostname; uptime; df -h'

本地 Shell 先处理引号,SSH 再把命令交给远程环境执行。上例用单引号保留命令内容,避免本地提前展开其中的变量。

比较下面两条命令:

bash
ssh linux-notes 'printf "%s\n" "$HOME"'
ssh linux-notes "printf '%s\n' '$HOME'"

第一条的 $HOME 在远程展开;第二条的 $HOME 会先在本地双引号中展开,再成为远程命令的一部分。复杂命令应明确每一层的解析位置,避免混用本地和远程路径。

远程非交互命令不一定读取与交互登录相同的配置文件。需要依赖固定路径或环境的任务,应显式设置,而不是假设登录时可用的命令始终可用。

六、传输文件:scp、sftp 与 rsync

scp:直接复制

以下命令在本地执行:

bash
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:交互式传输

bash
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 连接已配置时,可以先预览:

bash
rsync -av --dry-run ./project/ linux-notes:/home/aron/project-copy/

确认目标和变更后,移除 --dry-run 执行同步:

bash
rsync -av ./project/ linux-notes:/home/aron/project-copy/
写法 含义
project/ 传输目录中的内容
project 传输目录本身,结果还取决于目标是否存在
-a 归档模式,尽可能保留属性,仍受权限与文件系统限制
-v 显示过程
--dry-run 展示计划变更,不实际同步

以上命令没有启用 --delete,因此不会为了镜像源目录而删除目标中多出来的文件。但目标同名文件仍可能更新。同步副本也可能继承源文件的错误修改,不能自动替代有历史版本的备份。

七、远程会话与后台任务

SSH 断开后,直接依赖该登录会话的任务可能结束。Shell 的 & 只表示后台运行,不能保证任务在断线后继续,也不提供自动重启。

需要保留交互工作现场时,可以使用 tmux:

bash
tmux new -s notes

会话内按 Ctrl+B,松开后再按 D,可以暂时分离。回到终端后查看与恢复:

bash
tmux ls
tmux attach -t notes

分离通常不会停止会话中的程序,但主机重启后会话不会自动恢复。所有窗口都退出时,对应会话也会结束。

nohup 适合部分临时后台命令,但不提供完整的服务生命周期管理。需要长期运行、自动重启和统一日志的程序,应按第四章的方式交给 systemd 或其他服务管理器。

八、按连接阶段排查问题

现象 优先检查
找不到 ssh 命令 本地是否安装客户端,命令是否在 PATH 中
名称解析失败 地址或别名拼写、SSH 配置、名称解析
连接超时 网络路径、端口、访问控制与目标是否在线
Connection refused 端口是否监听,是否连接错端口或被明确拒绝
主机密钥变化 服务器身份是否确实改变,先核对指纹
Permission denied (publickey) 用户名、公钥安装位置、私钥选择和服务端策略
私钥权限过宽 本地私钥和目录权限
登录成功但传输失败 远程目标路径、写权限、剩余空间和传输子系统

客户端查看详细连接信息:

bash
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 脚本与定时任务 · 指南目录。

Aron 的清风日常

作者 Aron · 发布于 2026.02.23

愿这份记录能为你提供一点参考。发现问题,欢迎通过 GitHub 或 邮件交流。

如果这篇记录对你有用,留下一份喜欢。

← 所有文章继续阅读Linux 入门(六):用户、用户组与权限管理 →
SEARCH MY NOTES

在记录里,找一点答案

搜索标题、标签与全文 · 按 Esc 关闭