小米电视、Mac、SMB

Other Other

0x00前言

小米电视上有个应用叫【高清播放器】,此播放器可以连接开启了【共享】功能的设备

通过此功能可以在大屏上浏览其它设备上的文件

MacDown logo

MacDown logo

MacDown logo

MacDown logo

0x01问题

问题是连不上MacBook

用户名和密码完全正确也还是有下面的提示

MacDown logo

对比Windows

MacDown logo

MacDown logo

0x02原因

原因是小米电视的samba和Mac的smbd不兼容,目前并没有找到一个比较完美的解决方案

0x03方案

1、改小米电视的samba版本

2、改Mac上的smbd

3、都不改,用一个兼容的版本代替Mac上的smbd

0x04解决过程

Mac上开启samba服务

docker run -it --name samba -p 139:139 -p 445:445 -v ~/Downloads:/shares -d dperson/samba -s "shares;/shares;yes;yes;yes;" -S

可能会出现这个错误

Error starting userland proxy: listen tcp 0.0.0.0:445: bind: address already in use.

MacDown logo

445端口被占用了,因为之前开启了smbd,smbd占用了445

MacDown logo

先关掉系统的共享功能再重试

MacDown logo

查看下445端口的情况

sudo lsof -i:445

MacDown logo

成功了但还是连接不上

猜测应该是还有其他服务一起限制,单是开了445端口是不行的

于是重新打开系统的共享功能,由于docker已经占了445端口,所以系统的smbd启动不了,成功替换

MacDown logo

0x05解决步骤

1、关闭共享功能

2、开启新的samba服务

3、打开共享功能

0x06进一步

写个脚本来解决

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/sh

SHARE_DIR=~/Downloads

SMBD=/System/Library/LaunchDaemons/com.apple.smbd.plist

if [ "$(docker ps | grep "samba")" = "" ]; then
    STOPED=true
else
    STOPED=false
fi

stop(){
    sudo launchctl unload -w $SMBD
    sudo sed -i "" 's/<string>\/usr\/sbin\/smbd -ports "446"<\/string>/<string>\/usr\/sbin\/smbd<\/string>/g' $SMBD
    if ! $STOPED; then
        docker rm -f samba
    fi
}

force_start(){
    stop
    docker run -it --name samba -p 139:139 -p 445:445 -v $SHARE_DIR:/shares -d dperson/samba -s "shares;/shares;yes;yes;yes;" -S
    sudo sed -i "" 's/<string>\/usr\/sbin\/smbd<\/string>/<string>\/usr\/sbin\/smbd -ports "446"<\/string>/g' $SMBD
    sudo launchctl load -w $SMBD
}

start(){
    if $STOPED; then
        echo "===starting==="
        force_start
        echo "===started==="
    fi
}

if [ $# -eq 0 ];then
    start
else
    if [ $1 = "start" ]; then
        start
    elif [ $1 = "stop" ]; then
        echo "===stoping==="
        stop
        echo "===stoped==="
    elif [ $1 = "restart" ]; then
        echo "===restarting==="
        force_start
        echo "===restarted==="
    fi
fi

exit

保存为samba.sh,这样用

sh samba.sh start/restart/stop

0x07踩坑记录

samba

docker run -it --name samba -p 139:139 -p 445:445 -v ~/Downloads:/shares -d dperson/samba -s "shares;/shares;yes;yes;yes;" -S

命令最后有个”-S”参数,这个是关键,表示”Disable SMB2 minimum version”

具体可参看https://hub.docker.com/r/dperson/samba

如果不加这个参数,在电视上是连接不了的,但在PC上可以连接

倒推回来,可能问题的原因是电视用的是SMB1,而Mac又放弃了对SMB1的支持,PC则同时支持SMB1~3

smbd

mac上用命令打开和关闭【共享】功能的命令是

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.smbd.plist

小坑: unload了之后,445端口有可能还没来得及关闭,这时候开samba就会出现端口被占用的问题

解决方法是让smbd用另外一个端口,如446,所以脚本里会有

SMBD=/System/Library/LaunchDaemons/com.apple.smbd.plist

sudo sed -i "" 's/<string>\/usr\/sbin\/smbd<\/string>/<string>\/usr\/sbin\/smbd -ports "446"<\/string>/g' $SMBD

sudo sed -i "" 's/<string>\/usr\/sbin\/smbd -ports "446"<\/string>/<string>\/usr\/sbin\/smbd<\/string>/g' $SMBD