[Share Experiences] Deepin开机自动挂载webdav
Tofloor
poster avatar
yicold
deepin product team
2021-12-11 05:04
Author

更新1:20211211

发现一种新的方法,基本思路是借助nautilus这款文管应用。具体操作如下:

  1. 安装 nautilus后,手动连接webdav server,并勾选永远记住;
  2. 在webdav初始界面使用快捷键 Ctrl + L ,进行复制操作,该地址一般为webdav server地址;
  3. 将之前的自动挂载脚本内容修改为下述内容:
#!/bin/bash
#使用 nautilus --new-window 打开 webdav URI
nautilus --new-window [第二步骤复制的地址,需要去除中括号]
echo "挂载成功" >>/home/cold/Documents/webdav.log
#sleep 2
#nautilus -q
#echo "退出成功" >>/home/cold/Documents/webdav.log
exit 0

些许小问题:由于开机启动时间不好把握,加入的自动关闭nautilus窗口貌似不生效。

引言

相较于微软、苹果的操作系统生态,Linux应用生态则显捉襟见肘,只能发挥自我折腾精神,没有应用可用就创造应用,比如打造Deepin可用的网盘客户端。

准备工作

  • 安装davfs2并进行配置
  • webdav服务端,以群晖为例,安装WebDAV Server

自动挂载脚本

选择合适的路径存放自动挂载脚本,一般为个人帐户使用,推荐在家目录的文档文件夹下存放,路径为:~/Documents/autoshell/,打开终端依次执行下述命令:

mkdir ~/Documents/autoshell/
cd ~/Documents/autoshell/
touch webdav.sh
vi webdav.sh

将下述脚本内容进行复制,并按需设置参数,该脚本为基础脚本,需提前创建挂载路径。

#!/bin/bash
#参数配置
##设置webdav地址,比如 https://www.baidu.com:5006
webdav=""
##设置挂载路径,比如 /media/username/webdavserver
mount=""
#
#执行挂载
#执行创建挂载路径命令
echo y | sudo mount -t davfs $webdav $mount
exit 0

如果对网络有判断需要,可以使用下述脚本,能够判断互联网和服务器的连通性。

#!/bin/bash
#moount webdav
#随便设置两个可以ping通的ip或者地址,联网检测,IP2设置为webdav的域名或者服务器地址
IP1="10.20.12.1"
IP2="www.baidu.com"
mount_count=1
#设置webdav地址:
webdav='https://www.baidu.com:5006'
#设置webdav挂载目的地址:
mnt_webdav='/media/cold/synology'
mkdir $mnt_webdav >/dev/null 2>&1
while true
do
    df -Th|grep $webdav
    if [ "$?" != "0" ]
    then
        echo "mount webdav..........fail" >>/home/cold/Documents/webdav.log
        sleep 1
        ping -s 1 -c 1 $IP1 #去PING第1个IP
        if [ "$?" = "0" ]
        then
            echo "ping $IP1 Success" >>/home/cold/Documents/webdav.log
            ping -s 1 -c 2 $IP2 #去PING第2个IP
            if [ "$?" != "0" ]
            then
                echo "ping $IP2 ERROR" >>/home/cold/Documents/webdav.log
            else
                echo "ping $IP2 SUCCESS,mount webdav.........." >>/home/cold/Documents/webdav.log
                echo y | sudo mount -t davfs $webdav $mnt_webdav >>/home/cold/Documents/webdav.log 2>&1
                sleep 3
                df -Th|grep $webdav
                if [ "$?" != "0" ]
                then
                    echo "mount webdav..........fail" >>/home/cold/Documents/webdav.log
                    continue
                else
                    echo "mount_count:$mount_count"
                    echo "mount webdav..........done" >>/home/cold/Documents/webdav.log
                    df -Th | grep $webdav >>/home/cold/Documents/webdav.log
                    echo "mount_count:$mount_count" >>/home/cold/Documents/webdav.log
                    break
                fi
            fi
        else
            echo "ping $IP1 ERROR"
            mount_count=$[$mount_count+1]
            sleep 5 #设置多长时间去PING一次
            continue
        fi
    else
        echo "mount_count:$mount_count"
        echo "mount webdav..........done" >>/home/cold/Documents/webdav.log
        df -Th|grep $webdav >>/home/cold/Documents/webdav.log
        echo "mount_count:$mount_count" >>/home/cold/Documents/webdav.log
        break
    fi
done
exit 0

如果对内外网有判断需要,可以使用下述脚本,能够判断内网和外网的使用环境。

#!/bin/bash
#mount local share dir
#sudo /usr/bin/mount --bind /media/admin/test /home/admin/Desktop/test
if [ "$?" != "0" ];then
    echo "mount local share dir fail...." >> /opt/mount_auto_boot/mount_auto_boot.log
else
    echo "mount local share dir....done" >> /opt/mount_auto_boot/mount_auto_boot.log
fi
#moount net_mount_point
#随便设置两个可以ping通的ip或者地址,联网检测。
IP1="180.76.76.76"
mount_count=1
#设置net_mount_point挂载目的地址:
#nfs 共享目录,如只使用webdav请注释掉:
nfs_net_dir='/volume1/data'
#webdav配置 5005为http 5006对应https端口
web_dav_port='5005'
mnt_net_mount_point='/media/admin/net_mount_point'
sudo mkdir $mnt_net_mount_point >/dev/null 2>&1
#内外网环境
#服务器内网ip
intra_ip='10.10.10.217'
#内网网关
intra_check_ip='10.10.10.10'
#外网域名
inter_ip='nas1.proyy.com'
while true
do
    df -Th|grep $mnt_net_mount_point
    if [ "$?" != "0" ];then
        echo "mount to $mnt_net_mount_point..........fail" >>/opt/mount_auto_boot/mount_auto_boot.log
        sleep 1
        ping -s 1 -c 1 $IP1 #去PING第1个IP
        if [ "$?" == "0" ]
        then
            echo "ping $IP1 Success" >>/opt/mount_auto_boot/mount_auto_boot.log
            echo `ifconfig|grep $intra_check_ip`
            ifconfig|grep $intra_check_ip
            if [ "$?" != "0" ];then
                    IPP=$inter_ip
                else
                    IPP=$intra_ip
            fi
            echo "当前检测访问点:"$IPP
            ping -s 1 -c 2 $IPP #去PING第2个IP
            if [ "$?" != "0" ];then
                echo "ping $IPP ERROR" >>/opt/mount_auto_boot/mount_auto_boot.log
            else
                echo "ping $IPP SUCCESS,mount to $mnt_net_mount_point.........." >>/opt/mount_auto_boot/mount_auto_boot.log
                echo "start monut $IPP"
                echo .
                echo "$IPP <<===???===>> $intra_ip"
                if [ "$IPP" == "$intra_ip" ];then
                    #内网环境下自动去挂载nfs共享目录,如不使用nfs,也可直接用webdav,2选1:
                    #nfs
                    #设置net_mount_point地址:
                    #net_mount_point="$IPP:$nfs_net_dir"
                    #sudo mount -t nfs $net_mount_point $mnt_net_mount_point
                    #webdav,5005为http 5006对应https端口
                    net_mount_point="http://$IPP:$web_dav_port"
                    echo -y | sudo mount -t davfs $net_mount_point $mnt_net_mount_point
                else
                    #外网环境通过域名挂载,5005为http 5006对应https端口
                    net_mount_point="http://$IPP:$web_dav_port"
                    echo -y | sudo mount -t davfs $net_mount_point $mnt_net_mount_point
                fi
                echo "checking........."
                sleep 3
                df -Th|grep $net_mount_point
                if [ "$?" != "0" ];then
                    echo "mount $net_mount_point..........fail" >>/opt/mount_auto_boot/mount_auto_boot.log
                    continue
                else
                    echo "mount_count:$mount_count"
                    echo "mount $net_mount_point..........done" >>/opt/mount_auto_boot/mount_auto_boot.log
                    df -Th|grep $net_mount_point >>/opt/mount_auto_boot/mount_auto_boot.log
                    echo "mount_count:$mount_count" >>/opt/mount_auto_boot/mount_auto_boot.log
                    break
                fi
            fi
        else
            echo "ping $IP1 ERROR"
            mount_count=$[$mount_count+1]
            sleep 5 #设置多长时间去PING一次
            continue
        fi
    else
        echo "mount_count:$mount_count"
        echo "mount $net_mount_point..........done" >>/opt/mount_auto_boot/mount_auto_boot.log
        df -Th|grep $net_mount_point >>/opt/mount_auto_boot/mount_auto_boot.log
        echo "mount_count:$mount_count" >>/opt/mount_auto_boot/mount_auto_boot.log
        break
    fi
done
exit 0

开机自启文件

使用Deepin启动器自启应用的机制,创建能够唤起自动挂载脚本的应用文件,以此来实现开机自启,具体操作如下:

touch ~/.config/autostart/webdav.desktop
vi ~/.config/autostart/webdav.desktop

将下述内容进行复制并保存。

[Desktop Entry]
Type=Application
Exec="/home/cold/Documents/autoshell/webdav.sh"
#Icon=/home/cold/.local/share/icons/hicolor/512x512/apps/folder.png
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_IN]=Webdav
Name=Webdav
Comment[en_IN]=mount auto synology webdav server
Comment=自动挂载群晖webdav文件服务

解决挂载鉴权

上述自动挂载脚本执行需要提权,为避免中断脚本及每次输入密码,可以进行下述配置,为当前用户赋予执行挂载命令免密的权限。

使用终端执行命令:

sudo visudo

在末尾增加下述内容**,该内容表示允许当前用户无密码执行mount命令,注意需要替换cold为自己所用帐户名称。**

cold   ALL=(ALL)       NOPASSWD: /bin/mount

结束语

生命不息,折腾不止。尽情畅享webdav的便捷吧。

需要注意的一些小问题:

  1. Deepin大多自研应用还未兼容打开webdav路径下的文件,比如看图。直接使用看图打开图片文件,会造成较长时间卡顿,建议使用谷歌浏览器等三方应用;
  2. 自动挂载路径不会直接在计算机页面显示入口,需要结合文件管理器的书签功能,在右侧菜单创建快捷入口;

以上,如有其它问题发现,欢迎进一步交流沟通。

参考资料

Reply Favorite View the author
All Replies
liwl
deepin
2021-12-11 05:37
#1

使用文件管理器打开webdev路径,是不是非常卡?

我记得以前我用webdev直接挂载j坚果云,打开会很卡

Reply View the author
pzm9012
Moderator
2021-12-11 07:45
#2

感谢分享

Reply View the author
yicold
deepin product team
2021-12-11 18:43
#3
liwl

使用文件管理器打开webdev路径,是不是非常卡?

我记得以前我用webdev直接挂载j坚果云,打开会很卡

列出文件没感觉卡顿,主要是自带应用打开文件比较卡顿,换成第三方应用就好了。使用wps打开几兆的文档,几乎是秒开。

Reply View the author
ender049
deepin
2021-12-18 08:01
#4

还是喜欢用rc.local,没有权限问题

Reply View the author
风吹过的绿洲
deepin
2023-06-22 20:27
#5

没有权限问题,我还是喜欢建一个systemctl的服务,然后服务开启自启动。

╭─jay at jay-PC in /usr/lib/systemd/system 
╰─λ cat webdav-customer.service  
[Unit]
Description=Spark Store update notifier
After=apt-daily.service network.target network-online.target systemd-networkd.service NetworkManager.service connman.service


[Service]
Type=simple
RemainAfterExit=yes 
ExecStart=/opt/mount_auto_boot/mount_auto_boot.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

新建一个服务,然后再执行

╭─jay at jay-PC in /usr/lib/systemd/system 
╰─λ systemctl enable webdav-customer.service

脚本还有个问题,挂载的那行脚本需要加上 -o uid=1000,gid=1000,确保挂载后有用户编辑权限

sudo /usr/bin/mount -t davfs $webdav $mnt_webdav -o uid=1000,gid=1000 >>/opt/mount_auto_boot/mount_auto_boot.log 2>&1
Reply View the author