蓝牙:未收到文件或文件为空

蓝牙:未收到文件或文件为空

我正在尝试通过蓝牙将图像从我的手机(旧款华为型号)传输到运行 Ubuntu 20.04 LTS 的电脑上。

保持蓝牙设置对话框打开(正如某些网站上所描述的那样),手机报告 PC 拒绝接收该文件。

尝试“blueman”作为另一个答案中建议(或者在一个答案中这个问题),我有一个奇怪的行为:

  • 如果手机被标记为“值得信赖设备”,我从手机上收到了同样的错误信息。
  • 当手机被标记为“联合国信任设备”,手机报告文件已成功发送,Ubuntu 报告文件已收到。
    但是,文件并未存储在磁盘上,我无法重现该行为。

使用时bt-obex,我的手机报告“文件传输成功”,但文件并未存储在Downloads目录中,而是空的文件创建于~/.cache/obexd

$ mkdir destdir

$ bt-obex -y -s destdir
[OBEX Server] OBEX session opened
[OBEX Server] Transfer started
[Transfer Request]
  Name: IMG_20211009_102029.jpg
  Size: 2667331 bytes
[OBEX Server] OBEX transfer closed
[OBEX Server] OBEX session closed
^C

$ find . | grep IMG_20211009_102029
./.cache/obexd/IMG_20211009_102029.jpg

$ wc .cache/obexd/*.jpg
0 0 0 .cache/obexd/IMG_20211009_102029.jpg

如果该文件存储在中,那就没有问题了.cache/obexd,但正如您所见,该目录中的文件是空的!

为什么文件接收失败?

编辑

我发现使用接收文件obexpushd效果很好......

答案1

我自己找到了答案:

我的HOME目录是指向目录的符号链接:

/home/myname是 的符号链接/other_directory

默认情况下,obexd(由内置文件接收器和 使用bt-obex)检查临时文件目标(在 中~/.cache/obexd)和“最终”文件目标(在 中~/Downloads)是否确实位于目录的子目录中HOME

obexd如果涉及符号链接,则使用“真实”目录名,因此它会发现完整文件名/other_directory/.cache/obexd/...不是以 开头/home/myname/并拒绝继续操作。

一个解决方案是执行pkill obexd并重新开始obexd使用参数传递真实的主目录名称-r

我认为进行此项检查是为了避免有人/usr/bin/ls通过发送名为 的文件来覆盖文件../../../../../usr/bin/ls

有趣的是,这个检查是 obexd已经用标志打开了文件O_CREAT|O_TRUNC,因此在这种情况下,/usr/bin/ls将被空文件覆盖!

相关内容