使用 SSH 进行远程访问和文件传输

LinuxBeginner
立即练习

简介

SSH 提供了加密的命令行访问能力,让你可以登录另一台 Linux 主机上的账户;SCP 则利用相同的身份验证和传输机制来复制文件。首次安全连接时,应先验证服务器的主机密钥;之后可以改用个人密钥进行身份验证,无需反复输入账户密码。

本实验使用 localhost 上隔离的 remoteuser 账户作为远程主机。虽然两个账户实际上共享同一台训练虚拟机,但 SSH 协议、身份验证提示、远程主目录和文件传输行为,都与基本的双主机工作流程一致。默认的 labex SSH 访问路径不会发生变化。

检查 SSH 目标

在本步骤中,你将识别 SSH 客户端、解析目标名称、确认正在监听的服务器,并查看其公用主机密钥。

进入本地工作区:

cd /home/labex/project/ssh-lab

显示 OpenSSH 客户端版本。该程序会将版本信息写入标准错误,因此使用 2>&1 将其与标准输出合并:

ssh -V 2>&1

通过系统名称服务配置解析本地目标:

getent hosts localhost

确认 SSH 服务器正在 TCP 端口 22 上监听:

sudo ss -ltnp | grep ':22'

ssh-keyscan 可以在不登录的情况下获取公用主机密钥。将 ED25519 密钥通过管道传给 ssh-keygen -lf -,以显示其指纹:

ssh-keyscan -t ed25519 localhost 2>/dev/null | ssh-keygen -lf -

在真实环境中,接受主机密钥前,应将此指纹与管理员提供的可信值进行比对。保存一份简要的目标信息:

printf 'target=localhost\nport=22\nuser=remoteuser\n' > ssh-target.txt
cat ssh-target.txt

打开第一个远程 Shell

在本步骤中,你将验证主机密钥、使用密码进行身份验证、检查远程账户,然后关闭远程 Shell。

使用 user@host 格式进行连接:

ssh remoteuser@localhost

由于初始化过程删除了之前保存的 localhost 主机密钥记录,SSH 会询问你是否信任显示的指纹。将其与步骤 1 中的指纹进行比对后,输入:

yes

在密码提示处输入:

RemoteLab123!

输入密码时,终端不会显示任何字符。登录后,提示符属于 remoteuser,而不是 labex。确认远程身份、主机和当前目录:

whoami
hostname
pwd

在远程账户的主目录中创建一个远程标记文件:

mkdir -p ~/ssh-lab
printf 'connected as %s\n' "$(whoami)" > ~/ssh-lab/connected.txt

关闭远程 Shell,返回本地的 labex 提示符:

exit

exit 命令只会结束远程 Shell,本地终端仍会保持打开状态。

执行远程命令

在本步骤中,你将不打开持续运行的交互式 Shell,直接在远程主机上执行命令,并将输出保存到本地。

如有需要,返回本地工作区:

cd /home/labex/project/ssh-lab

在主机名后加入带引号的命令。SSH 会在远程主机上执行该命令,并将输出返回到本地终端:

ssh remoteuser@localhost 'whoami; uname -srm; uptime'

出现提示时输入 RemoteLab123!。分号用于分隔由远程 Shell 解释执行的命令。

执行第二条远程命令,并将返回的输出重定向到本地文件:

ssh remoteuser@localhost 'printf "remote_user=%s\nremote_home=%s\n" "$(whoami)" "$HOME"' > remote-context.txt

再次输入密码。> 重定向由本地 Shell 处理,因此 remote-context.txt 会在本地工作区中创建:

cat remote-context.txt

该文件应显示 remoteuser/home/remoteuser

使用 SCP 传输文件

在本步骤中,你将上传一个本地文件,在远程主机上检查其内容,然后以新的本地文件名下载它。

创建一个本地配置示例:

cd /home/labex/project/ssh-lab
printf 'mode=training\nport=8080\n' > app.conf

SCP 使用 user@host:path 表示远程路径。将文件上传到预先准备好的远程 incoming 目录:

scp app.conf remoteuser@localhost:/home/remoteuser/incoming/app.conf

出现提示时输入 RemoteLab123!。通过 SSH 确认远程文件内容:

ssh remoteuser@localhost 'cat /home/remoteuser/incoming/app.conf'

再次输入密码。现在交换源路径和目标路径,将文件下载到本地:

scp remoteuser@localhost:/home/remoteuser/incoming/app.conf downloaded-app.conf

输入密码,然后比较本地原文件和下载的副本:

cmp app.conf downloaded-app.conf && echo "The files match"

递归传输目录

在本步骤中,你将使用 SCP 的递归模式,将整个目录树复制到远程账户。

创建一个小型本地项目目录树:

cd /home/labex/project/ssh-lab
mkdir -p site/assets
printf '<h1>SSH transfer practice</h1>\n' > site/index.html
printf 'body { color: navy; }\n' > site/assets/style.css

-r 选项会递归复制目录及其内容:

scp -r site remoteuser@localhost:/home/remoteuser/incoming/

出现提示时输入 RemoteLab123!。使用一次性 SSH 命令列出远程目录树:

ssh remoteuser@localhost 'find /home/remoteuser/incoming/site -type f -printf "%P\n" | sort'

再次输入密码。你应看到 assets/style.cssindex.html

生成个人 SSH 密钥

在本步骤中,你将创建专用的 ED25519 密钥对,并检查其权限和指纹。

密钥对包含一个由你保管的私钥,以及一个可以安装到远程账户的公钥。生成一个专用于练习的密钥,并设置为空密码短语,以便自动验证使用:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/labex_remote_ed25519 -N '' -C 'labex-remote-practice'

-t 选项用于选择算法,-f 用于指定文件,-N '' 用于设置空的练习密码短语,-C 用于添加标签。在生产环境中,如果自动化要求不禁止使用密码短语,通常应为密钥设置强密码短语。

检查这两个文件及其权限:

ls -l ~/.ssh/labex_remote_ed25519 ~/.ssh/labex_remote_ed25519.pub

私钥应只能由 labex 读取。.pub 文件则可以安全共享。显示公钥指纹:

ssh-keygen -lf ~/.ssh/labex_remote_ed25519.pub

切勿复制或泄露私钥。

安装并使用公钥

在本步骤中,你将为 remoteuser 安装公钥,在不输入密码的情况下建立连接,并验证基于密钥的文件传输。

ssh-copy-id 会将公钥追加到远程账户的 ~/.ssh/authorized_keys 文件中,并设置适当的权限:

ssh-copy-id -i ~/.ssh/labex_remote_ed25519.pub remoteuser@localhost

为最后一次基于密码的身份验证操作输入 RemoteLab123!。使用 -i 测试指定的私钥:

ssh -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost 'printf "key authentication works\n" > ~/ssh-lab/key-authenticated.txt; cat ~/ssh-lab/key-authenticated.txt'

此命令不应要求输入远程账户密码。使用同一个身份文件进行 SCP:

scp -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost:~/ssh-lab/key-authenticated.txt key-authenticated.txt
cat key-authenticated.txt

下载的文件应包含 key authentication works。主机密钥用于验证服务器;你的私钥用于向远程账户证明你的身份。它们分别解决不同的信任问题。

总结

你验证了 SSH 主机密钥,打开并退出了远程 Shell,执行了一次性远程命令,并区分了本地重定向与远程执行。你还使用 SCP 上传和下载文件,并递归复制了目录。

此外,你生成了专用的 ED25519 密钥对,保护了私钥,仅安装公钥,并使用同一身份文件实现了无需密码的 SSH 和 SCP 连接。这些都是安全开展入门级远程管理所需的核心技能。