SSH和FTP和Samba

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

327.2.5SSH和FTP和Samba

#include <stdio.h>            // 引入标准输入输出头文件,为 printf 函数提供声明。
int main()                   // 定义程序入口函数,返回 int 类型的状态值。
{                            // main 函数体开始。
    printf("i am wfeng!\n"); // 输出字符串,并使用 \n 换行。
    return 0;                // 返回 0,表示程序正常结束。
}                            // main 函数体结束。

本节没有新编写 C 程序。以上是视频结尾通过 Samba 在 Windows 版 VS Code 中打开并保存的 test.c 最终版本:讲师删除了上一节遗留的 while (1);,随后按 Ctrl+S 保存。它用于验证 Windows 能否直接修改 Ubuntu 中的文件。

本节在 Windows 11 宿主机和 Ubuntu 20.04 虚拟机之间配置三类能力:用 SSH 远程登录、用 FTP 传输文件、用 Samba 将 Ubuntu 目录映射为 Windows 网络驱动器。视频中的 Ubuntu 用户名为 wfeng,虚拟机当时的 IPv4 地址为 192.168.31.230;IP 地址会随网络环境变化,不能机械照抄。

一、环境搭建

1.1 注意

  1. 确认 USB 串口连接到哪一侧。 视频开头,USB 转串口设备被 VMware 自动连接给 Ubuntu 虚拟机,导致 Windows 串口工具看不到 COM 口。若要在 Windows 中使用串口,就在 VMware 的提示框中选择连接到宿主机;若要在 Linux 中使用,则连接到虚拟机。同一 USB 设备不能同时由宿主机和虚拟机占用。讲师没有勾选“记住我的选择”,是为了之后可以方便地切换,并非任何场景都禁止记忆选择。VMware 官方说明
  2. 先处理虚拟机,再关闭宿主机。 正常结束实验时,应在 Ubuntu 内关机,或让 VMware 完整执行“挂起”后再关闭 Windows。挂起只是保存虚拟机运行状态,不等同于 Ubuntu 正常关机;虚拟磁盘仍在写入时强行断电可能损坏文件系统或虚拟机状态。
  3. 确认网络可达。 本节演示时宿主机能够访问 192.168.31.230。两台设备看似处于同一网段,也仍可能受到 VMware 网络模式、Windows 防火墙、Ubuntu 防火墙或无线网络客户端隔离的影响。

1.2 SSH

SSH(Secure Shell)提供加密的远程登录和远程命令执行能力。安装 OpenSSH Server 后,同一套 SSH 服务还可承载 SFTP、SCP 等加密文件传输方式。Ubuntu OpenSSH Server 文档

1.2.1 sudo apt-get install openssh-server

视频在 Ubuntu 中执行:

sudo apt-get install openssh-server

其中:

  • sudo:以管理员权限执行命令;
  • apt-get install:从软件源安装软件包;
  • openssh-server:SSH 服务端,核心守护进程为 sshd;安装过程也会带上 openssh-sftp-server。

安装完成后可检查服务状态和 TCP 22 端口:

systemctl status ssh --no-pager
ss -lntp | grep ':22'

若修改了 SSH 配置,应先检查配置,再重启服务:

sudo sshd -t
sudo systemctl restart ssh.service
1.2.2 Ubuntu中配置SSH

视频先用 ifconfig 查看虚拟机地址,得到 192.168.31.230。原笔记中的 if config 是 OCR 错误;命令名中间没有空格。若系统未安装 net-tools,可使用系统自带的现代命令:

ip -br address

应选取 Windows 能访问的网卡 IPv4 地址,而不是环回地址 127.0.0.1。本节没有修改 /etc/ssh/sshd_config;所谓“配置 SSH”主要是安装并启动服务、查明 IP,以及从 Windows 发起连接。

1.2.3 Windows中配置SSH

视频使用 MobaXterm:选择 Session → SSH,在 Remote host 中输入 192.168.31.230,再以用户 wfeng 登录。首次连接时,客户端会提示确认服务器主机密钥;实际使用中应核对指纹,而不是不加判断地接受,以免连接到被冒充的服务器。

登录后看到的是在 Ubuntu 上运行的远程 shell,并不是又启动了一套 Ubuntu。命令使用 Linux 路径和权限;虚拟机、网络和 SSH 服务都必须保持可用。MobaXterm 左侧的文件浏览器通常使用 SFTP,因此它与后文的传统 FTP 不是同一种协议。

视频为了演示使用了极弱的密码 0。该密码只能视作隔离实验环境里的临时示例;真实环境应使用强且唯一的密码,最好进一步配置 SSH 密钥认证。

1.3 传文件

本节演示两条图形化路径:FileZilla 通过 FTP 上传、下载文件;Windows 资源管理器通过 SMB(Samba)把 Linux 目录映射成网络驱动器。SSH 安装好以后,也已经具备更安全的 SFTP/SCP 路径。

1.3.1 FTP配置

视频安装的 FTP 服务端是 vsftpd:

sudo apt-get install vsftpd

传统 FTP 的登录凭据和数据默认不加密,不应直接暴露到互联网,也不适合不可信网络。Ubuntu 官方文档明确建议优先考虑 OpenSSH 提供的安全文件传输能力;SFTP 是基于 SSH 的协议,而 FTPS 是给 FTP 增加 TLS,两者不能混为一谈。Ubuntu FTP Server 文档

1.3.1.1 修改配置文件

视频执行:

sudo vim /etc/vsftpd.conf

思维导图写的是 sudo vi /etc/vsftpd.conf,二者都可以编辑该文件。讲师把这一行:

#write_enable=YES

改为:

write_enable=YES

这会打开 FTP 写命令的总开关。视频配置中还保留了 local_enable=YES 和 anonymous_enable=NO,所以演示的是本地 Linux 用户认证,而非匿名上传。能否真正写入某个目录,还要同时满足 Linux 文件所有者、用户组及权限位的要求;write_enable=YES 不会绕过文件系统权限。

视频按思维导图执行了旧式重启命令:

sudo /etc/init.d/vsftpd restart

在该系统中它经由 systemd 成功重启。更清晰的写法是:

sudo systemctl restart vsftpd.service
systemctl status vsftpd.service --no-pager
1.3.1.2 Windows中配置FTP

视频在 FileZilla 顶部的快速连接栏中填写:

  • 主机:192.168.31.230
  • 用户名:wfeng
  • 密码:视频中为 0,仅是弱密码演示

连接后,左侧是 Windows 本地文件,右侧是 Ubuntu 远端文件。视频进入远端 /home/wfeng/test,双击 Windows 端的开发板原理图 PDF 完成上传,又在远端右击 test.c 将其下载到 Windows。

FileZilla 支持 FTP、FTPS 和 SFTP,使用它并不自动说明连接是安全的,必须在站点管理器中明确选择协议。对于本节环境,更推荐直接选择 SFTP 并连接 SSH 的 TCP 22 端口。远端文件操作也可能覆盖或删除文件,其风险由账户权限和用户操作决定,不能笼统地说“使用 FileZilla 就不会破坏文件”。

“FTP 适合大文件、Samba 只适合小文件”不是协议本身的硬性边界。应按安全要求、使用习惯、网络质量、权限模型和是否需要像本地磁盘一样持续编辑来选择工具。

1.3.2 Samba配置

Samba 在 Linux 上实现 SMB 文件共享,使 Windows 可以通过 \\服务器\共享名 访问目录。视频思维导图列出的安装前命令顺序是:

sudo apt-get upgrade
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install samba samba-common

这组顺序不应作为推荐模板:软件包索引应先 update,而安装 Samba 通常不需要先做全系统 upgrade 或 dist-upgrade。本节需要的最小安装流程是:

sudo apt update
sudo apt install samba samba-common

大版本升级或依赖关系重排应另行评估,避免为了安装单个服务而无意改变整个实验系统。Ubuntu 软件包管理文档

1.3.2.1 查看Samba是否安装成功

视频执行:

samba -V

输出为 Version 4.15.13-Ubuntu。这里必须使用大写 -V;原笔记中的小写 -v 不准确。版本号只证明命令可用,不等于文件共享服务已经正确运行。还应检查:

systemctl status smbd.service --no-pager
sudo testparm -s

testparm 用于检查 smb.conf 的内部一致性并显示解析后的有效配置,但它不能单独证明网络、账户和目录权限全部正常。Samba testparm 手册

视频的安装输出提到了被屏蔽的 samba-ad-dc.service。本节配置的是普通独立文件服务器 smbd,不是 Active Directory 域控制器,所以不能把该提示等同于 Samba 文件共享安装失败。

1.3.2.2 设置Samba默认密码

视频先执行:

sudo mkdir /home/share
sudo chmod 777 /home/wfeng
sudo smbpasswd -a wfeng

smbpasswd -a wfeng 将已经存在的 Linux 用户 wfeng 加入 Samba 的账户数据库,并交互输入两次 Samba 密码;输入密码时终端不显示字符是正常现象。Samba 密码可以与 Linux 登录密码不同。Samba smbpasswd 手册

其中有两个重要问题:

  1. 视频创建了 /home/share,但后面的共享配置实际使用 /home/wfeng/,因此 /home/share 在本节没有被使用。
  2. chmod 777 /home/wfeng 让所有本机用户都能读取、写入和进入整个家目录,权限过宽;后面再把整个家目录共享出去,会暴露 Desktop、Documents、Downloads、test 等全部内容。应只创建并授权专用共享目录。

较安全的单用户实验目录可这样准备:

sudo install -d -o wfeng -g wfeng -m 0750 /home/wfeng/share
sudo smbpasswd -a wfeng
1.3.2.3 备份配置文件

视频在修改前备份:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

这是必要的回退点。若新配置出错,可恢复后重新检查:

sudo cp /etc/samba/smb.conf.bak /etc/samba/smb.conf
sudo testparm -s

备份文件也可能包含敏感的路径和认证相关设置,不应把它随意上传或开放给普通用户。

1.3.2.4 修改配置文件

视频使用 sudo vim /etc/samba/smb.conf,并在配置文件末尾粘贴思维导图中的内容。下面保留画面中出现的有效配置行,未替讲师优化:

security = user
username map = /etc/Samba/smbusers

[share]
comment = Shared Folder with username and password
path = /home/wfeng/
public = no
valid users = wfeng
browsable = no
create mask = 777
directory mask = 777
force user = wfeng
force group = wfeng
available = yes
browseable = yes
writable = yes

这份课堂配置能够说明各字段的位置和作用,但不宜直接用于真实环境:

  • [share] 是 Windows 看到的共享名,path 才是 Ubuntu 上的真实目录。
  • security 和 username map 是全局参数,应放在 [global] 中;视频把内容直接追加到文件末尾,可能落在前一个共享段内。/etc/Samba/smbusers 还写错了标准目录名的大小写,而且本节并未创建该映射文件,因此该行没有必要。
  • browsable 与 browseable 是同一参数的两种拼写,配置先写 no、后写 yes,后者覆盖前者。即使设为不可浏览,知道准确 UNC 路径的用户仍可能直接访问。
  • create mask = 777 会允许普通文件出现不必要的可执行权限;directory mask = 777 也过宽。掩码约束新建对象的权限,仍要与客户端请求、强制权限项和底层 Linux 权限共同作用。
  • force user、force group 会让连接后的文件操作强制使用指定身份,削弱多用户场景的所有权区分和审计价值;本节的单用户共享并不需要它们。
  • public = no 表示不允许访客访问;writable = yes 表示共享可写,但 Samba 仍不能突破 Linux 文件系统权限。Samba smb.conf 手册

如果目标只是让 wfeng 访问一个专用目录,可另行采用更小的配置;这是安全实践示例,不是对视频画面中源码或配置的冒充还原:

[share]
    comment = wfeng project share
    path = /home/wfeng/share
    browseable = yes
    read only = no
    guest ok = no
    valid users = wfeng
    create mask = 0640
    directory mask = 0750

修改后先执行 sudo testparm -s,确认语法和最终生效值,再重启服务。Ubuntu 官方的 Samba 文件服务器说明也强调要同时准备目录、配置共享和重启服务。Ubuntu Samba 文件服务器文档

视频讲解绝对路径与相对路径时提到 cp test/test.c /etc:在当时的 /home/wfeng 下,test/test.c 是相对路径,/etc 是绝对路径。它只是路径示意,并不是 Samba 配置步骤;普通用户也无权直接向 /etc 写文件。

1.3.2.5 重启Samba服务器

思维导图给出:

sudo /etc/init.d/samba restart

视频实际执行后得到 -bash: /etc/init.d/samba: No such file or directory,因此这条命令在该 Ubuntu 环境中失败。随后执行:

sudo service smbd restart

没有报错,完成了 smbd 重启。使用 systemd 时更推荐:

sudo testparm -s
sudo systemctl restart smbd.service
systemctl status smbd.service --no-pager

现代 SMB 直接访问主要使用 TCP 445。只有依赖旧式 NetBIOS 名称发现时才可能还要关注 nmbd;视频通过 IP 和明确共享名连接,并不依赖网络浏览发现。

1.3.2.6 Windows中配置Samba

视频在 Windows 文件资源管理器中打开“此电脑”,选择“更多”菜单中的“映射网络驱动器”,指定盘符 U:,并输入:

\\192.168.31.230\share

UNC 路径开头必须是两个反斜杠。share 对应 smb.conf 中的 [share],不是 Linux 目录名。随后用 Samba 用户 wfeng 及其 Samba 密码认证。视频第一次出现“拒绝访问”,调整后成功映射,U: 盘中直接显示 /home/wfeng/ 下的多个目录,这也印证了课堂配置共享的是整个家目录。

若 Windows 缓存了错误凭据,可断开旧映射并检查“凭据管理器”;公用电脑上不应勾选永久记住凭据。若 DHCP 导致虚拟机地址改变,还应重新用 ip -br address 查询地址,或配置稳定的名称/地址分配。

二、结束

完成映射后,视频在 U: 盘进入 test 目录,用 Windows 版 VS Code 打开 test.c,删除上一节遗留的 while (1);,并按 Ctrl+S 保存。文首代码块就是画面中的最终内容。

这里的“在线编程”准确地说是:编辑器运行在 Windows,文件实际存放在 Ubuntu,保存动作通过 SMB 写回 Linux。它不是云端编程,也不代表程序已被编译或运行。能打开文件不等于一定能保存;最终写入仍受 Samba 规则和 Linux 目录、文件权限共同约束。

三、SSH和FTP和Samba

本节几种方式的关系如下:

能力常用端口默认加密本节用途
SSHTCP 22是Windows 远程登录 Ubuntu 并执行命令
SFTP / SCP通常随 SSH 使用 TCP 22是安全上传、下载文件
FTP控制连接通常为 TCP 21,另有数据连接否FileZilla 图形化上传、下载演示
SMB / Samba现代实现主要为 TCP 445取决于协议版本和双方配置,不能默认视为端到端安全通道将 Linux 目录映射成 Windows 网络驱动器

不要把 FTP 或 SMB 服务直接暴露到公网。跨不可信网络访问时,应优先使用 SSH/SFTP,或先通过受控 VPN 进入实验网络。

3.1 SSH编译

SSH 本身不负责“编译”,它只是让 Windows 用户在 Ubuntu shell 中执行 Ubuntu 上的编译器。典型流程是先通过 Samba、SFTP 或编辑器保存源文件,再在 SSH 终端中执行上一节已经使用过的编译命令,例如:

cd /home/wfeng/test
gcc test.c -o test

本节视频没有再次展示这两条编译命令,只说明后续可以通过 SSH 完成编译。因此不能把按下 Ctrl+S 误认为程序已经构建。虚拟机必须处于运行状态,SSH 服务和网络也必须可达。

3.2 Samba

Samba 的核心链路是:准备 Linux 目录与权限 → 创建 Samba 用户 → 配置 [share] → 用 testparm 校验 → 重启 smbd → Windows 通过 \\IP\share 认证访问。任一层出错,都可能表现为“找不到网络路径”“拒绝访问”或“能读不能写”。

3.2.1 任务信息资源知导图

本标题中的“知导图”是原笔记/课程标题中的文字,实际指本节配套的任务信息思维导图。导图适合快速查看命令,但画面已经证明其中的 /etc/init.d/samba restart 在当前系统失败,且更新顺序、目录权限和共享范围也需要修正,不能跳过实际输出照抄。

排查 Samba 时可按从底层到上层的顺序检查:

ip -br address
systemctl status smbd.service --no-pager
sudo testparm -s
ss -lntp | grep ':445'
namei -l /home/wfeng/share
sudo journalctl -u smbd.service --no-pager -n 50

依次确认 IP、服务状态、配置解析结果、监听端口、整条目录路径的权限,以及服务日志,比反复重装软件更容易定位问题。

3.3 Linux scp命令

视频只在思维导图中列出 SCP 学习资料,没有实际演示。SCP 通过 SSH 认证并加密传输,基本写法如下:

scp local-file wfeng@192.168.31.230:/home/wfeng/test/
scp wfeng@192.168.31.230:/home/wfeng/test/test.c .

第一条从当前计算机上传,第二条把远端 test.c 下载到当前目录。复制目录可加 -r,保留时间戳和模式可加 -p。目标位置已有同名文件时可能被覆盖,执行前要核对方向、主机、用户名和路径。SCP 与 SFTP 都依赖 SSH,不能把它们称为传统 FTP。

3.4 Windows局域网文件共享

需要区分三个概念:

  • Windows 文件共享:Windows 原生通过 SMB 把 Windows 目录共享给局域网设备。
  • Samba:Linux/Unix 上的 SMB 实现,本节用它把 Ubuntu 目录提供给 Windows。
  • VMware Shared Folders:虚拟化软件提供的宿主机与客户机共享机制,不是通用的局域网文件共享协议;本节没有配置它。

原笔记所说“Windows 共享文件夹不能直接编辑,是因为两边文件系统不同”并不成立。SMB 或 VMware 的共享层会抽象底层文件系统差异,能否编辑主要取决于共享模式、账户权限、底层文件权限、文件锁和客户端行为。视频已经实际证明 Windows 能通过 Samba 修改并保存 Ubuntu 中的 test.c。

四、本节关键纠正

  • 用户名统一为视频中的 wfeng,不是 OCR 产生的 wangfeng 等写法。
  • Ubuntu 查询地址的命令是 ifconfig,不是 if config;更推荐 ip -br address。
  • Samba 版本参数是大写 samba -V,主配置文件是 /etc/samba/smb.conf。
  • Windows 网络路径是 \\192.168.31.230\share,开头必须有两个反斜杠。
  • /etc/init.d/samba restart 在视频环境中明确失败;成功执行的是 sudo service smbd restart。
  • 课程创建的 /home/share 没有被后续配置使用,而 chmod 777 /home/wfeng 和共享整个家目录都属于过宽权限。
  • SSH/SFTP/SCP 默认提供加密通道;传统 FTP 默认明文;Samba 是 SMB 文件共享实现,不能按文件大小简单划分这些工具。
  • “能在 Windows 中保存 Linux 文件”来自共享协议和权限配置,不是因为两端使用相同文件系统。

核对依据