![如何在 Linux 中根据需要正确安装 SMB 驱动器?](https://linux22.com/image/1536315/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E6%A0%B9%E6%8D%AE%E9%9C%80%E8%A6%81%E6%AD%A3%E7%A1%AE%E5%AE%89%E8%A3%85%20SMB%20%E9%A9%B1%E5%8A%A8%E5%99%A8%EF%BC%9F.png)
我主要使用笔记本电脑,在家时我喜欢能够访问 NAS 上的 SMB 共享。虽然我可以在 Thunar(我使用 XFCE)中轻松执行此操作,只需在地址栏中输入 smb://nas.address/share,但其他应用程序都无法访问共享上的文件。例如,如果我双击 /movies 共享中的视频文件,我希望它开始在我首选的视频播放器(VLC)中播放,但我却看到大量错误消息,不得不强制退出 VLC。我知道我可以通过 fstab 设置永久挂载,但 1) 我希望在挂载时被要求输入凭据,而不是将它们永久存储在我的电脑上;2) 因为它是一台笔记本电脑,所以我经常在本地网络之外使用它,我不希望它在启动时尝试挂载不可用的驱动器(不,我无意将我的 SMB 共享开放到互联网)。我厌倦了必须先通过 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 …
可能很简单,使用read
或dialog
或其他方法;但请阅读此内容),将-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
),否则它将无法工作。请注意,有一个恶意的黑客程序DISPLAY
,XAUTHORITY
它允许守护程序在您的屏幕上autofs
显示窗口,但是xterm
一般来说它不应该这样做。该 hack 仅适用于守护进程,如果从桌面环境中调用,则无需 hackmount -t mycifs …
即可显示。xterm
为了让它不那么脏,你应该编写另一个程序或脚本,并使用本地用户的有限权限运行它前您访问的目录将自动安装 CIFS。此脚本应等待来自的信号mount.mycifs
,提示您输入凭据(它可以显示窗口等,而无需恶意攻击)并将它们传递给mount.mycifs
不应显示任何窗口也不应自行提示的。
答案2
您表示,您经常会在本地网络之外使用它,但您又表示,您不想将您的 SMB 共享开放到互联网。如果您想在本地网络之外访问您的共享,那么您将不得不将它们开放到互联网,因为没有其他方法可以做到这一点。