我正在尝试通过蓝牙将图像从我的手机(旧款华为型号)传输到运行 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
将被空文件覆盖!