如何在 Linux 中根据需要正确安装 SMB 驱动器?

如何在 Linux 中根据需要正确安装 SMB 驱动器?

我主要使用笔记本电脑,在家时我喜欢能够访问 NAS 上的 SMB 共享。虽然我可以在 Thunar(我使用 XFCE)中轻松执行此操作,只需在地址栏中输入 smb://nas.address/share,但其他应用程序都无法访问共享上的文件。例如,如果我双击 /movies 共享中的视频文件,我希望它开始在我首选的视频播放器(VLC)中播放,但我却看到大量错误消息,不得不强制退出 VLC。我知道我可以通过 fstab 设置永久挂载,但 1) 我希望在挂载时被要求输入凭据,而不是将它们永久存储在我的电脑上;2) 因为它是一台笔记本电脑,所以我经常在本地网络之外使用它,我不希望它在启动时尝试挂载不可用的驱动器(不,我无意将我的 SMB 共享开放到互联网)。我厌倦了必须先通过 Thunar 将我想看/听的所有内容复制到我的笔记本电脑上 - 人们如何处理这种麻烦?

编辑:Thunar 中的身份验证弹出窗口如下

Thunar 中的身份验证弹出窗口如下

确实非常有希望,完全符合人们的期望 - 除了“记住直到你注销”的身份验证仅有的适用于 Thunar,不适用于其他应用程序。据我所知,smb:// 路径就像任何其他 URL 一样,并且使用存储在我的用户会话中的凭据,在该会话中运行的任何应用程序都应该能够使用这些凭据访问 URL - 当然前提是操作系统具有针对 SMB URL 的注册处理程序。

答案1

我用自动文件系统安装我的 NFS 共享一经请求在我的 Kubuntu 中。

autofs是一个根据需要自动挂载目录的程序。自动挂载仅在访问时挂载,并在一段时间不活动后卸载。​​因此,与通过 进行静态挂载相比,自动挂载 NFS/Samba 共享可节省带宽并提供更好的整体性能fstab

对于你来说这很有用:

在映射文件中指定 CIFS 共享时,请指定-fstype=cifs共享位置并在其前面加上冒号 ( :)。

例子:

mntpoint -fstype=cifs ://example.com/shrname

示例:以读写方式挂载,指定文件所属的用户和组:

mntpoint -fstype=cifs,rw,uid=myuserid,gid=mygrpid ://example.com/shrname

示例:以读写方式挂载,指定用于连接共享的用户名和密码:

mntpoint -fstype=cifs,rw,username=myuser,password=mypass ://example.com/shrname

地图文件是/etc/auto.master/etc/auto.*或例如/etc/auto.master.d/*。阅读文档并了解如何配置守护进程。

乍一看,这似乎不是你的完美解决方案,因为它似乎您必须将凭据存储在文件中。这可能是一个地图文件(如上例所示)或一个单独的文件,例如credentials.txt 正如你在这里看到的然而有这个评论

我想您可以创建credentials.txt一个命名管道并运行一个密码提示程序来为管道提供密码。

如果这是正确的,那么我预计这个“密码提示程序”可能只是一个echo或者printf你手动调用的。


编辑:

我要求的是一种简单的方法来做到这一点,而不必在提示时手动调用命令,也不必在文件中存储(或伪造)凭据。

Linux 可以通过mount.*umount.*可执行文件挂载/卸载各种文件系统。链接示例中的此credentials=/etc/credentials.txt选项实际上是 的选项mount.cifs。我认为如果您使用类似

mount -t foo …

或者在autofs配置中:

mntpoint -fstype=foo …

它将尝试查找并运行mount.foo,并将所有其他选项传递给它。

因此,您应该创建mount.mycifs一个包装器mount.cifs。它应该以某种方式提示您输入凭据(xterm -e …可能很简单,使用readdialog或其他方法;但请阅读此内容),将-o username=…,password=…或添加-o credentials=…到其余选项并将它们传递给mount.cifs(或mount -t cifs)执行实际的挂载。

如果有的话,请为其umount.cifs创建一个符号链接。umount.mycifs

然后在您的地图文件中使用-fstype=mycifs不带任何与凭证相关的选项。


以下/sbin/mount.mycifs是一个快速而粗略的概念证明。在操作系统中运行它之前先了解它的作用因为它将作为运行root,我是互联网上的一个随机人,你不应该相信我。

#!/bin/bash

tmpf="`mktemp`"
DISPLAY=:0 XAUTHORITY=/home/ola/.Xauthority xterm -e /bin/bash -c '\
read -p "user:" u; \
read -sp "password:" p; \
printf "username=%s\npassword=%s" "$u" "$p" > "$0"; \
' "$tmpf"

mount -t cifs "$@" -o credentials="$tmpf"
rm "$tmpf"

root:root它应该由或任何适合您操作系统的程序拥有mount.*。不要忘记使其可执行(sudo chmod a+x /sbin/mount.mycifs),否则它将无法工作。请注意,有一个恶意的黑客程序DISPLAYXAUTHORITY它允许守护程序在您的屏幕上autofs显示窗口,但是xterm一般来说它不应该这样做。该 hack 仅适用于守护进程,如果从桌面环境中调用,则无需 hackmount -t mycifs …即可显示。xterm

为了让它不那么脏,你应该编写另一个程序或脚本,并使用本地用户的有限权限运行它您访问的目录将自动安装 CIFS。此脚本应等待来自的信号mount.mycifs,提示您输入凭据(它可以显示窗口等,而无需恶意攻击)并将它们传递给mount.mycifs不应显示任何窗口也不应自行提示的。

答案2

您表示,您经常会在本地网络之外使用它,但您又表示,您不想将您的 SMB 共享开放到互联网。如果您想在本地网络之外访问您的共享,那么您将不得不将它们开放到互联网,因为没有其他方法可以做到这一点。

相关内容