我如何在同一家庭网络上与另一台Linux机器共享文件夹?

我正在尝试在同一家庭网络中的一台Ubuntu机器上与另一台Ubuntu机器共享一个文件夹。当我右键点击文件夹并选择共享选项时,它告诉我需要安装Windows网络共享服务才能共享文件夹。这和Windows有什么关系?我不是想与Windows机器共享...
9个回答

Windows与这有什么关系?我并不打算与Windows机器共享...
你说得对,这可能会让人感到困惑。所以让我先澄清一下术语:
Windows共享文件和打印机的方式被称为SMB。SAMBA项目的人员已经在Linux上实现了微软的所有协议和规范。因此,Ubuntu支持与Windows相同类型的文件共享,即Samba。
你可以使用SAMBA在Linux机器之间共享文件。事实上,如果你有一个朋友带着他们的Windows电脑过来,你可能更喜欢这种方式。
或者,你可以使用“Linux方式”来共享文件,即NFS(网络文件系统)。这个之前问题的答案解释了如何做到这一点。(但它比较技术性)
所以,当“共享选项”对话框要求安装软件包时,你实际上并没有安装任何微软软件或类似的东西。放心去做吧,它是完全安全的。
补充说明:
你可以在按照Salih Emin的说明之前尝试启用共享功能;如果不起作用,你会收到一个简单的警告,然后根据需要执行Salih描述的步骤。我已经在一个新安装并更新的系统上尝试过,确实需要这样做。

1谢谢解释。有趣的是,我正试图远离微软,结果发现连Linux都使用了他们的一些工作成果。唉。 - EmmyS
7嗯,桑巴人比微软自己更好地实施了微软的协议。这里有些安慰 :-) - Stefano Palazzo

我发现SSHFS本地化、稳定且极快。我有两台xubuntu机器(18.04),共享/home文件夹,并使用Intel NUC作为“dropbox”USB存储设备。全部通过sshfs实现。
2020-07-12更新:我找到了适用于Windows的SSHFS。一个干净漂亮的图形界面,零配置,并且可以使用来自Linux机器的SSH密钥。
操作指南:https://github.com/billziss-gh/sshfs-win 图形界面:https://github.com/evsar3/sshfs-win-manager 以下是如何设置sshfs并在重新启动后使用fstab自动重新连接而无需提供密码的方法。非常感谢serverfault用户kubanczyk提供的有关远程挂起/恢复后重新连接的方法。

我将使用“本地机器-冲浪盒”来表示您连接的计算机,使用“远程机器-开发盒”来表示您连接到的计算机。

检查您的userID和groupID,它们应该都是1000。

GroupID:id -g localuser UserID:id -u localuser

1. 获取本地和远程机器的IP地址。

hostname -I

我将使用192.168.1.150作为本地机器('surfbox')的IP地址,以及192.168.1.151作为远程机器('devbox')的IP地址。
2. 在本地和远程机器上安装软件包。
sudo apt install sshfs fuse ssh

3. 创建一个群组并将本地用户添加到其中

创建群组:sudo groupadd fuse

将本地用户添加到群组中:sudo usermod -a -G fuse $USER

4. 在fuse配置中启用"allow_other"

在fstab中挂载时,我们需要这个选项

使用命令行编辑器编辑/etc/fuse.conf。 删除user_allow_other前面的井号,并保存。

5. 在本地机器上生成SSH密钥

当提示时,请不要提供密码。只需按Enter键留空即可。

ssh-keygen -t rsa -C youremail@example.com

密钥存储在本地机器的主目录下的.ssh文件夹中

6. 将本地机器的公共SSH密钥传输到远程机器

ssh-copy-id -i ~/.ssh/id_rsa.pub remoteuser@192.168.1.151

您将被要求输入远程机器上远程用户的密码。 本地机器的公钥现已添加到远程机器上的文件~/.ssh/authorized_keys中。

7. 在本地机器的/mnt文件夹上创建一个目录,您将在其中挂载远程机器的/home文件夹。
选择一个对于您的远程机器有意义的名称。
sudo mkdir /mnt/devboxhome 8. 从终端挂载远程机器的/home目录。
sshfs的语法是
sshfs [user@]host:[directory] mountpoint [options]
我们使用
sudo sshfs [remoteuser]@192.168.1.151:/home/[remoteuser] /mnt/devboxhome -o allow_other,default_permissions -o identityfile=/home/[localuser]/.ssh/id_rsa
示例:假设"steve"是本地和远程机器上的用户名
sudo sshfs steve@192.168.1.151:/home/steve /mnt/devboxhome -o allow_other,default_permissions -o identityfile=/home/steve/.ssh/id_rsa
由于您已经将公共RSA密钥传输到远程机器,因此不应提示输入远程用户密码。
您将收到一个警告,指出该机器不受信任,并询问是否应将其添加为可信任机器。请将远程机器添加为可信任机器。
9. 验证:浏览远程机器的/home目录
在本地机器的终端中,您现在可以在/mnt/devboxhome下列出远程机器的/home目录。
cd /mnt/devboxhome ls
或者使用Nautilus浏览该目录。太棒了。
10. 启用重启后重新连接
我们将在/etc/fstab中添加一个条目来实现这一点。如果您错过了这一点,请参阅介绍以获取本地机器的用户ID和组ID。 使用命令行编辑器编辑/etc/fstab,并在/etc/fstab的末尾添加以下两行:
# Mount devbox at boot remoteuser@192.168.1.151:/home/[remoteuser]/ /mnt/devboxhome fuse.sshfs default_permissions,user,delay_connect,reconnect,ServerAliveInterval=15,ServerAliveCountmax=3,allow_other,identityfile=/home/[localuser]/.ssh/id_rsa,idmap=user,uid=1000,gid=1000 0 0
  • delay_connect 使内核在尝试挂载远程机器上的目录之前等待网络连接正常。
  • 由于我们在启动时以 root 身份运行,因此必须指定存储在本地用户主目录中的 keyfile
  • allow_other - 允许除实际进行挂载的用户之外的其他用户访问已挂载的文件系统。
  • idmap=user - 仅翻译连接用户的 UID。
  • reconnect, ServerAliveInterval, ServerAliveCountMax - ssh 发送保持活动的 ping。如果连续发送 ServerAliveCountMax 次 ping 失败,则重新连接。

在 Local 和 Remote 机器上以 steve 用户登录的用户将具有以下设置:

steve@192.168.1.151:/home/steve/ /mnt/devboxhome fuse.sshfs default_permissions,user,delay_connect,reconnect,ServerAliveInterval=15,ServerAliveCountmax=3,allow_other,identityfile=/home/steve/.ssh/id_rsa,idmap=user,uid=1000,gid=1000 0 0

重要:远程目录后面加一个斜杠:steve@192.168.1.151:/home/steve/

保存/etc/fstab和....

11. 重新启动

现在,您应该能够在本地机器/mnt/devboxhome中访问远程机器的/home目录。在Nautilus中,您可以将此文件夹拖到“位置”栏。

12. 重复

在远程机器上再次执行相同步骤,以共享本地机器的/home目录。


好答案。我不知道可以在fstab中挂载sshfs文件系统,谢谢你告诉我。 - Organic Marble
我正在寻找比sftp更快的替代方案。这个完美解决了我的问题。 - Nicholas
这对于让我的树莓派(运行Rasbian)的主文件夹在我的Fedora桌面上显示为一个目录来说非常完美! - Nigel Atkinson
为了让fstab正常工作,我必须做一件事 - 以root身份使用相同的详细信息通过ssh登录,将远程主机添加到root用户的已知主机列表中。 - Nigel Atkinson
我一直在家庭网络上使用SSHFS来挂载我的笔记本电脑上的硬盘(该硬盘直接连接到我的主要桌面电脑)。它运行良好。我甚至生成了密钥对,以便快速轻松地登录。然而,在网上看到一些评论称SSFHS是一种“hacky”的解决方案,因为它并非用于作为文件系统。他们说SAMBA和NFS更适合。我曾研究过SAMBA,但对我来说更加困惑。您认为有什么令人信服的理由要切换到SAMBA或NFS吗? - cardflopper

目前,在Lucid中存在一个小错误,该错误在Launchpad上列出:bug #536766。这个错误没有提示用户安装完成文件共享设置所需的必要软件包。在解决此问题之前,这里有一个快速的解决方法。
您需要安装libapache2-mod-dnssd并重新启动。点击此链接进行安装,或在软件中心找到libapache2-mod-dnssd
安装完成后,请转到系统 → 首选项 → 个人文件共享,然后勾选“在网络上共享公共文件”框。

alt text

完成上述步骤后,您应该能够查看网络中所有允许公共文件共享的计算机,这些计算机都在“公共”文件夹中。只需单击“位置→网络”,您就可以看到所有可用的计算机及其共享的公共文件夹。
双击服务器图标将在您的桌面上挂载相关的公共文件夹。
通过链接文本

这些软件包是否与Apache Web服务器有关?我已经安装了一个LAMP堆栈,其中包括了Apache,我不想破坏它。 - EmmyS
1太棒了!(顺便说一下,我已经编辑了答案,这个软件包将安装apache2.2-bin作为一个依赖项,这样看起来更简单) - Stefano Palazzo
1@EmmyS,这些软件包不会破坏你的Apache安装。我正在使用它们以及其他软件包,没有任何问题。 - RolandiXor
我发现这个链接在实际共享目录方面非常有帮助:https://itsfoss.com/share-folders-local-network-ubuntu-windows/ - MrMas
链接 link text 已失效,未找到(404)。 - dipenparmar12

你可以在Linux机器上简单地运行一个simpleHTTP服务器,并在其他机器上访问它。
步骤:
1. 首先从要共享的文件夹中启动终端。 2. 在终端中运行命令 - `python -m SimpleHTTPServer`。 3. 使用`ifconfig`命令检查你的IP地址。 4. 在其他机器的浏览器中输入IP地址:8000(例如:如果你的IP地址是127.3.4.123,那么在浏览器中输入127.3.4.123:8000)。 你将在文件夹中获得所需的文件以供下载。

9下载 != 分享。 - EmmyS
1对我来说,这是一个很好的答案,尽管对于Python3来说,它是python3 -m http.server - VanDavv

如果你想在Ubuntu上实现无缝集成,而且对Windows兼容性不感兴趣,那么SSH就是你的不二选择。
请参考如何在局域网中共享两台Linux机器之间的文件?
你可能需要安装SSH服务器:
sudo apt-get install openssh-server

从您的客户端文件管理应用程序中,您可以通过以下方式访问您的服务器:
sftp://servername.local

要从终端或以编程方式访问文件,请使用sshfs在客户端文件系统中创建一个挂载点。

1通过SSH复制文件的其他编程方式包括scp,以及(更好的)rsync - Brent Bradburn

我相信这是SAMBA软件包所列出的,或者至少是它们描述的一部分。作为另一种选择,您可以尝试首选项->文件共享,我相信它使用了不同的机制。不过,安装Samba还是很方便的。


我原以为(显然是错的)Samba可以在Linux和Windows之间共享。我并不想与Windows共享,只想与另一台Linux机器共享。 - EmmyS
不,你是对的。当然,两台电脑都必须安装Samba。 - Stefano Palazzo
两台机器都需要使用SMB协议。Windows是以一种方式实现的,而Linux机器则通过samba来实现。 - demented hedgehog

你可以安装"qweborf"。它将通过HTTP共享目录,其他主机可以通过浏览器访问。
它还可以启用WebDAV,并将目录挂载为可读/写的文件系统(已在davfs2、KDE、Gnome2和OsX上进行了测试)。

zx81roadkill 是对的,使用 "sshfs"。Samba 是垃圾,NFS 是废物。从我在加利福尼亚的电脑到阿根廷的电脑,完全可以使用 Sshfs。它是完全安全的,速度和其他任何东西一样快(我有一个千兆线)。

Sshfs 相对于 Samba 和 NFS 来说是一个相对较新的技术,但它比两者都要优秀得多。以下是运行它的示例(假设您已经安装了所有必要的软件包)。

# mount "username"'s home directory on "machine"
  mkdir -p /tmp/my_mount ; sshfs username@machine: /tmp/my_mount
# mount the root directory on "machine" (note: if "username" on "machine"
# can't write to the file, neither will you.  You have "username"'s privs
  mkdir -p /tmp/my_mount ; sshfs username@machine:/ /tmp/my_mount
# mount the directory "Videos" on "username"'s account on "machine"
  mkdir -p /tmp/my_mount ; sshfs username@machine:Videos /tmp/my_mount

一旦您输入密码,/tmp/my_mount将包含“用户名”在“机器”上的所有文件。不要费心去折腾Samba或NFS。它们只是配置或设置时无意义的痛苦。
卸载方法:
fusermount -u /tmp/my_mount

如果那失败了(无论出于何种原因):

umount -f /tmp/my_mount

所有通过挂载点发送的数据都是加密的。为什么这不是标准、完全被接受的远程机器挂载方式,对我来说是个谜。从简单性的角度来看,它比任何其他方法都要优越得多。
如果你需要原始速度,也许那个臃肿的垃圾Samba可以做到,或者NFS。我不知道,100 MB/s+ 对我来说已经足够好了。

我的文件分享方式:
sudo npm install -g http-server

去你想分享的文件夹,打开终端并运行以下命令:
http-server -o 

您将能够在同一网络中的所有计算机上通过该命令输出中提到的IP地址访问该文件夹。