伪造 Samba 上的可用磁盘空间

伪造 Samba 上的可用磁盘空间

我在 Debian 机器上运行 Samba 服务器。它运行良好;Windows 可以正常读取和写入它,但有一个问题。

我通过 Samba 共享的文件夹 (/var/samba) 存储在我的主驱动器上,这是一个旧的 40GB IDE 驱动器。该文件夹内有指向我系统上其他文件夹的符号链接,其中 2 个实际上位于我的 1TB SATA 驱动器上。

在 Windows 中,我将 Samba 共享映射到驱动器号,它显示只剩余 9GB(这是服务器根驱动器(40GB 驱动器)上剩余的空间量)。

我可以让 Samba 报告剩余的可用空间量不同吗?我试图将 Windows 备份到与 1TB 驱动器符号链接的文件夹之一中(是的,该驱动器上有足够的剩余空间),但 Windows 不允许我这样做,因为它认为剩余的可用空间不足。

答案1

我真的不知道除了作假

从链接文章中复制。

在 smb.conf 中,将 dfree 命令设置为脚本。该参数需要一个命令,该命令将返回块的总数,然后返回可用的块数。samba 文档建议如下:

[global]
dfree command = /usr/local/bin/dfree

脚本 /usr/local/bin/dfree

#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$4}'

男人smb.conf 部分‘dfree 命令’


以下内容是直接从https://web.archive.org/web/20150410132141/http://www.subvs.co.uk/faking_available_disk_space_samba它是原始网页地址的复制品,以便未来的互联网访问者可以访问。https://m.xkcd.com/979/的确。

伪造 Samba 上的可用磁盘空间

我在一台即将报废的 Exchange 服务器上运行 exmerge,而我能找到的唯一可以存放导出的 pst 文件的地方是一台老旧的、工作量不足的 ubuntu 服务器。它有所需的可用空间,因此只需对 smb.conf 进行一些更改,它就可以运行了。第一次运行很顺利,但过了一会儿,我想再次运行它。如果与它导出的邮箱相匹配的 pst 文件已经存在,Exmerge 将进行某种同步,因此当它说需要 60G 时,它实际上并没有这样做,因为已经有 59G 了。

当然,除非有足够的空间进行完全导出,否则它将拒绝运行(除非有一个“强制”开关,我不知道?)。samba 出现了,还有一个实际上不是为这项工作而制作但工作完美的命令:dfree 命令。这将让您欺骗连接的机器,让它们相信您有您想要的任何磁盘空间。

该参数需要一个命令,该命令将返回块的总数以及可用的块数。samba 文档建议如下:

#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$4}'

然后在你的 smb.conf 中:

[global]
dfree command = /usr/local/bin/dfree

当然现在您可以选择如何伪造 samba 报告的可用磁盘空间,您可以使该命令只是 cat 一个带有您想要的数字的文本文件,或者更简单,只是使它看起来像一个魔术磁盘,具有相同的总空间和可用空间量:

#!/bin/sh
df $1 | tail -1 | awk '{print $2" "$2}'

通过巧妙地更改命令,它会将可用空间报告为与总空间相同。这样可能不是一个好主意,但在紧急情况下它确实很有用!

答案2

设置确实是解决这个问题的办法,但不幸的是dfree commandsmb.conf这是文档截至 2023 年 5 月,数据并不准确。

  • 正如@Hashbrown 在评论中指出的那样,共享的路径并未作为被调用脚本的参数给出。$1始终为“。”。
  • 也无法为脚本提供自定义参数。
  • 但是,Samba 从共享目录调用脚本,因此如果需要,脚本可以$PWD根据所需的共享选择其操作。
  • 该设置通常不应放在[global]部分中,而应放在需要它的共享部分中。因此其他共享将使用默认机制来返回大小。

因此,如果您在单个 Samba 共享下安装了不同的磁盘,则需要确定要报告该共享的大小并定义执行此操作的脚本。

这是一个例子,在单个共享下安装了 2 个不同的磁盘。

$ tree /mnt

/mnt
└── myshare
    ├── disk1
    └── disk2

在“smb.conf”中:

[myshare]
    comment = Share with 2 mounted disks
    path = /mnt/myshare
    ;# ... other share settings ...
    dfree command = /usr/local/bin/my_dfree.sh

my_dfree.sh脚本中,选择要返回哪个磁盘的大小,然后回显该磁盘的总块数和可用块数:

#!/bin/bash

diskA="$PWD/disk1"
diskB="$PWD/disk2"

# get total number of blocks and free blocks
# into arrays sizesA and sizesB
sizesA=( $( df $diskA | tail -1 | awk '{print $2,$4}' ) )
sizesB=( $( df $diskB | tail -1 | awk '{print $2,$4}' ) )

# return sizes of the disk with smaller free space left
if (( ${sizesA[1]} <= ${sizesB[1]} )); then
    echo "${sizesA[@]}"
else
    echo "${sizesB[@]}"
fi

相关内容