分类: 技术

  • Rclone 使用教程

    Rclone是一个命令行程序,用于管理云存储上的文件。他打包了各大供应商云存储的接口提供统一的访问界面。rclone支持40多种云存储产品,包括对象存储、企业和消费者文件存储、服务以及标准传输协议。Rclone符合unix POSIX规范,支持于常见的shell工具,比如rsync、cp、 mv、mount、ls、ncdu、tree、rm 和cat等交互,Rclone使用我们耳闻能熟的语法,支持shell管道,支持—dry-run保护,同时为了保护数据的可靠性,Rclone可保留时间戳和始终进行文件验证校验和。Rclone多种文件传输协议,支持SFTP,HTTP,WebDAV,FTP和DLNA。Rclone是一个成熟的开源软件,最初受rsync的启发并采用Golang编写。其文档和社区也都非常好,提供广泛和友好的使用用例。

    设置

    命令 说明
    rclone config 添加、删除、管理网盘等操作
    rclone config file 显示配置文件的路径
    rclone config show 显示配置文件信息
    root@SunPma:~# rclone config
    Current remotes:
    
    Name                 Type
    ====                 ====
    DB                 dropbox
    GD                 drive
    
    e) Edit existing remote
    n) New remote
    d) Delete remote
    r) Rename remote
    c) Copy remote
    s) Set configuration password
    q) Quit config
    e/n/d/r/c/s/q>

    语法

    # 本地到网盘
    rclone [功能选项] <本地路径> <配置名称:路径> [参数] [参数]
    
    # 网盘到本地
    rclone [功能选项] <配置名称:路径> <本地路径> [参数] [参数]
    
    # 网盘到网盘
    rclone [功能选项] <配置名称:路径> <配置名称:路径> [参数] [参数]
    
    # [参数]为可选项

    示例

    # 复制到网盘,并显示实时传输进度,设置并行上传数为8
    
    rclone copy -P /home/SunPma GD:/home/SunPma --transfers=8
    
    # 如果需要服务端对服务端的传输可加以下参数(不消耗本地流量)
    
    rclone copy 配置名称:网盘路径 配置名称:网盘路径 --drive-server-side-across-configs

    功能

    命令 说明
    rclone copy 复制
    rclone move 移动,如果要在移动后删除空源目录,加上 –delete-empty-src-dirs 参数
    rclone sync 同步:将源目录同步到目标目录,只更改目标目录
    rclone size 查看网盘文件占用大小
    rclone delete 删除路径下的文件内容
    rclone purge 删除路径及其所有文件内容
    rclone mkdir 创建目录
    rclone rmdir 删除目录
    rclone rmdirs 删除指定环境下的空目录。如果加上 –leave-root 参数,则不会删除根目录
    rclone check 检查源和目的地址数据是否匹配
    rclone ls 列出指定路径下的所有的文件以及文件大小和路径
    rclone lsl 比上面多一个显示上传时间
    rclone lsd 列出指定路径下的目录
    rclone lsf 列出指定路径下的目录和文件

    参数

    命令 说明
    -n = –dry-run 测试运行,查看Rclon在实际运行中会进行哪些操作
    -P = –progress 显示实时传输进度,500mS刷新一次,否则默认1分钟刷新一次
    –cache-chunk-size 5M 块的大小,默认5M越大上传越快,占用内存越多,太大可能会导致进程中断
    –onedrive-chunk-size 100M 提高OneDrive上传速度适用于G口宽带服务器(默认为320KB)
    –drive-chunk-size 64M 提高Google Drive上传速度适用于G口宽带服务器(默认为8M)
    –cache-chunk-total-size SizeSuffix 块可以在本地磁盘上占用的总大小,默认10G
    –transfers=N 并行文件数,默认为4
    –config string 指定配置文件路径,string为配置文件路径
    –ignore-errors 跳过错误
    –size-only 根据文件大小校验,不校验hash
    –drive-server-side-across-configs 服务端对服务端传输

    日志

    有4个级别的日志记录:ERROR NOTICE INFO DEBUG
    默认情况下Rclon将生成ERROR NOTICE日志

    命令 说明
    -q rclone将仅生成ERROR消息
    -v rclone将生成ERROR NOTICE INFO 消息
    -vv rclone 将生成ERROR NOTICE INFO DEBUG 消息
    –log-level LEVEL 标志控制日志级别

    输出日志到文件
    使用--log-file=FILE选项rclone会将Error Info Debug消息以及标准错误重定向到FILE
    这里的FILE是你指定的日志文件路径

    过滤

    命令 说明
    –exclude 排除文件或目录
    –include 包含文件或目录
    –filter 文件过滤规则,相当于上面两个选项的其它使用方式。包含规则以+开头,排除规则以-开头

    文件类型过滤
    例如--exclude "*.bak" --filter "- *.bak"排除所有bak文件
    例如--include "*.{png,jpg}" --filter "+ *.{png,jpg}"包含所有pngjpg文件,排除其他文件
    例如--delete-excluded删除排除的文件。需配合过滤参数使用,否则无效
    目录过滤
    目录过滤需要在目录名称后面加上/否则会被当做文件进行匹配
    /开头只会匹配根目录(指定目录下),否则匹配所目录,这同样适用于文件
    --exclude ".git/"排除所有目录下的.git目录
    --exclude "/.git/"只排除根目录下的.git目录
    --exclude "{Video,Software}/"排除所有目录下的VideoSoftware目录
    --exclude "/{Video,Software}/"只排除根目录下的VideoSoftware目录
    --include "/{Video,Software}/**"仅包含根目录下的VideoSoftware目录的所有内容
    大小过滤
    默认大小单位为kBytes但可以使用k MG后缀
    --min-size过滤小于指定大小的文件。比如--min-size 50表示不会传输小于50k的文件。
    --max-size过滤大于指定大小的文件。比如--max-size 1G表示不会传输大于1G的文件。
    实际使用中发现大小过滤两个选项不能同时使用
    过滤规则文件
    --filter-from <规则文件>从文件添加包含/排除规则
    比如--filter-from filter-file.txt
    过滤规则文件示例:

    - secret*.jpg
    + *.jpg
    + *.png
    + file2.avi
    - /dir/Trash/**
    + /dir/**
    - *

    环境变量

    rclone中的每个选项都可以通过环境变量设置。环境变量的名称可以通过长选项名称进行转换,删除--前缀,更改-_大写并添加前缀RCLONE_环境变量的优先级会低于命令行选项,即通过命令行追加相应的选项时会覆盖环境变量设定的值。
    比如设置最小上传大小--min-size 50使用环境变量是RCLONE_MIN_SIZE=50当环境变量设置后,在命令行中使用--min-size 100那么此时环境变量的值就会被覆盖
    常用环境变量

    命令 说明
    RCLONE_CONFIG 自定义配置文件路径
    RCLONE_CONFIG_PASS 若 rclone 进行了加密设置,把此环境变量设置为密码,可自动解密配置文件
    RCLONE_RETRIES 上传失败重试次数,默认 3 次
    RCLONE_RETRIES_SLEEP 上传失败重试等待时间,默认禁用,单位s、m、h分别代表秒、分钟、小时
    CLONE_TRANSFERS 并行上传文件数
    RCLONE_CACHE_CHUNK_SIZE 块的大小,默认5M
    RCLONE_CACHE_CHUNK_TOTAL_SIZE 块可以在本地磁盘上占用的总大小,默认10G
    RCLONE_IGNORE_ERRORS=true 跳过错误

     #rclone

  • Linux程序前台后台切换

    1、在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行

    root@Ubuntu$ ./tcpserv01 &

    2、如果程序正在前台运行,可以使用 Ctrl+z 选项把程序暂停,然后用 bg %[number] 命令把这个程序放到后台运行,摁Ctrl+z,然后在最后一行加上bg %number

    3、对于所有运行的程序,我们可以用jobs –l 指令查看

    [kettle@4 data-integration]$ jobs -l

    4、也可以用 fg %[number] 指令把一个程序掉到前台

    cat@Ubuntu:~/unp/unpv13e/tcpcliserv$ fg %1
    ./tcpserv01

    5、也可以直接终止后台运行的程序,使用 kill 命令

    cat@Ubuntu:~/unp/unpv13e/tcpcliserv$ kill %1

    二、fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令

    一、&
    加在一个命令的最后,可以把这个命令放到后台执行,如
    watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本

    二、ctrl + z
    可以将一个正在前台执行的命令放到后台,并且处于暂停状态。


    三、jobs
    查看当前有多少在后台运行的命令
    jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。


    四、fg
    将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。


    五、bg
    将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。


    六、kill
    法子1:通过jobs命令查看job号(假设为num),然后执行kill %num
    法子2:通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid
    前台进程的终止:Ctrl+c


    七、nohup
    如果让程序始终在后台执行,即使关闭当前的终端也执行(之前的&做不到),这时候需要nohup。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。关闭中断后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

    ps -aux | grep “test.sh” #a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分

    八、查看nohup.out的日志

    linux 下:

    tail -fn 50 nohup.out
  • 一键安装PHP swoole 环境

     curl -sS https://gitee.com/houlijiang/common/raw/master/php-install.sh | sh -

    卸载:

    完全卸载删除PHP

    查看全部的PHP软件包,命令:rpm -qa|grep php
    实例如下:

    [root\@xxx\~]
    # rpm -qa|grep php
    php-cli-5.4.16-46.el7.x86\_64
    php-common-5.4.16-46.el7.x86\_64
    php-5.4.16-46.el7.x86\_64
    

    找到PHP的软件包后,我们使用命令:rpm -e 软件包名的方式一个个删除即可完全删除。

    注意:由于某些PHP软件包被其他PHP软件包所依赖,删除顺序不同,回到值无法删除,例如上面的实例中 php-cli-5.4.16-46.el7.x86_64 被其他的PHP软件包所需要,如果先执行命令:rpm -e php-cli-5.4.16-46.el7.x86_64会删除不了,所以执行删除顺序为:

    rpm -e php-5.4.16-46.el7.x86_64
    rpm -e php-cli-5.4.16-46.el7.x86_64
    rmp -e php-common-5.4.16-46.el7.x86_64

    删除完毕后,可以使用命令php -v检查下是否还会返回版本信息,如果没有提示,说明已经删除了。

    综上,先使用命令rpm -qa|grep php检查全部的PHP软件包,然后再使用命令rpm -e 软件包名删除PHP软件包。

  • liunx 配置固定ip

    #在/etc/sysconfig/network-scripts/ifcfg-网卡名 文件中配置
    #例
    [root@zbx-server /]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=static
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=eth0
    UUID=47c875bd-32d2-4a6a-b66a-4bbbf491a5cf
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=172.17.18.223
    GATEWAY=172.17.19.254
    NETMASK=255.255.254.0
    DNS1=172.16.0.102
    DNS2=172.16.0.201
    
    systemc restart network   #重启网
  • MySQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为

    SELECT c.CustomerId,CompanyName FROM Customers c
    WHERE EXISTS(
    SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 

    这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? 

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
    EXISTS 指定一个子查询,检测 行 的存在。

    语法: EXISTS subquery
    参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
    结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

    例表A:TableIn 例表B:TableEx
    tableA tableB


    (一). 在子查询中使用 NULL 仍然返回结果集
    select * from TableIn where exists(select null)
    等同于: select * from TableIn
    tableA 
    (二). 比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。
    select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
    select * from TableIn where ANAME in(select BNAME from TableEx)
    008
    (三). 比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。
    select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
    select * from TableIn where ANAME=ANY(select BNAME from TableEx)
    008
    NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

    结论:
      EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

    一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

    例如:

    1.  查询id为5的数据:  (数据存在)

    copycode
        SELECT *
        FROM class AS c1
        WHERE EXISTS(SELECT
                   class_id
                 FROM class AS c2
                 WHERE c1.class_id = 
    5);
    copycode

      如果exists里面返回的结果行数大于1,则返回true,则外面的查询数据可以返回。

    1196212-20180318224033032-740838109

     2.  查询id为10的数据:  (数据不存在)

    copycode
        SELECT *
        FROM class AS c1
        WHERE EXISTS(SELECT
                   class_id
                 FROM class AS c2
                 WHERE c1.class_id = 
    10);
    copycode

       因为exsits始终返回的是false,所以外层查询始终无效,也就不会产生数据。

     

      

      分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
      WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。
      分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

    在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。
    INSERT INTO TableIn (ANAME,ASEX) 
    SELECT top 1 ‘张三’, ‘男’ FROM TableIn
    WHERE not exists (select * from TableIn where TableIn.AID = 7)

    EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,但要看实际情况具体使用:
    IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

    in、not in、exists和not exists的区别:

    先谈谈in和exists的区别:
    exists:存在,后面一般都是子查询,当子查询返回行数时,exists返回true。

    select * from class where exists (select'x"form stu where stu.cid=class.cid)


    当in和exists在查询效率上比较时,in查询的效率快于exists的查询效率
    exists(xxxxx)后面的子查询被称做相关子查询, 他是不返回列表的值的.
    只是返回一个ture或false的结果(这也是为什么子查询里是select ‘x’的原因 当然也可以
    select任何东西) 也就是它只在乎括号里的数据能不能查找出来,是否存在这样的记录。

    其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果存在,返回ture则输 出,反之返回false则不输出,再根据主查询中的每一行去子查询里去查询.

    执行顺序如下:
    1.首先执行一次外部查询
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当
    前行的值。

    3.使用子查询的结果来确定外部查询的结果集。
    如果外部查询返回100行,SQL   就将执行101次查询,一次执行外部查询,然后为外部查询返回
    的每一行执行一次子查询。

    in:包含

    查询和所有女生年龄相同的男生

    select * from stu where sex=’男’ and age in(select age from stu where sex=’女’)


    in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.


    not in和not exists的区别:
    not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,
    例如:查询那些班级中没有学生的,
    select * from class where cid not in(select distinct cid from stu)
    当表中cid存在null值,not in 不对空值进行处理
    解决:select * from class

    where cid not in

    (select distinct cid from stu where cid is not null)


    not in的执行顺序是:是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。并没有用到索引。
    not exists:如果主查询表中记录少,子查询表中记录多,并有索引。
    例如:查询那些班级中没有学生的,
    select * from class2

    where not exists

    (select * from stu1 where stu1.cid =class2.cid)


    not exists的执行顺序是:在表中查询,是根据索引查询的,如果存在就返回true,如果不存在就返回false,不会每条记录都去查询。
    之所以要多用not exists,而不用not in,也就是not exists查询的效率远远高与not in查询的效率。

     实例:

    exists,not exists的使用方法示例,需要的朋友可以参考下。

    学生表:create table student
    (
     id number(8) primary key,
     name varchar2(10),deptment number(8)
    )
    选课表:create table select_course
    (
      ID         NUMBER(8) primary key,
      STUDENT_ID NUMBER(8) foreign key (COURSE_ID) references course(ID),
      COURSE_ID  NUMBER(8) foreign key (STUDENT_ID) references student(ID)
    )
    课程表:create table COURSE
    (
      ID     NUMBER(8) not null,
      C_NAME VARCHAR2(20),
      C_NO   VARCHAR2(10)
    )
    student表的数据:
            ID NAME            DEPTMENT_ID
    ---------- --------------- -----------
             1 echo                   1000
             2 spring                 2000
             3 smith                  1000
             4 liter                  2000
    course表的数据:
            ID C_NAME               C_NO
    ---------- -------------------- --------
             1 数据库               data1
             2 数学                 month1
             3 英语                 english1
    select_course表的数据:
            ID STUDENT_ID  COURSE_ID
    ---------- ---------- ----------
             1    1         1
             2    1         2
             3    1         3
             4    2         1
             5    2         2
             6    3         2
    1.查询选修了所有课程的学生id、name:(即这一个学生没有一门课程他没有选的。)
    分析:如果有一门课没有选,则此时(1)select * from select_course sc where sc.student_id=ts.id 
    and sc.course_id=c.id存在null,
    这说明(2)select * from course c 的查询结果中确实有记录不存在(1查询中),查询结果返回没有选的课程,
    此时select * from t_student ts 后的not exists 判断结果为false,不执行查询。
    SQL> select * from t_student ts where not exists
     (select * from course c where not exists
       (select * from select_course sc where sc.student_id=ts.id and sc.course_id=c.id));       
            ID NAME            DEPTMENT_ID
    ---------- --------------- -----------
             1 echo                   1000
    2.查询没有选择所有课程的学生,即没有全选的学生。(存在这样的一个学生,他至少有一门课没有选),
    分析:只要有一个门没有选,即select * from select_course sc where student_id=t_student.id and course_id
    =course.id 有一条为空,即not exists null 为true,此时select * from course有查询结果(id为子查询中的course.id ),
    因此select id,name from t_student 将执行查询(id为子查询中t_student.id )。
    SQL> select id,name from t_student where exists
     (select * from course where not exists
         (select * from select_course sc where student_id=t_student.id and course_id=course.id));
            ID NAME
    ---------- ---------------
             2 spring
             3 smith
             4 liter
    3.查询一门课也没有选的学生。(不存这样的一个学生,他至少选修一门课程),
    分析:如果他选修了一门select * from course结果集不为空,not exists 判断结果为false;
    select id,name from t_student 不执行查询。
    SQL> select id,name from t_student where not exists
     (select * from course where exists
         (select * from select_course sc where student_id=t_student.id and course_id=course.id));
            ID NAME
    ---------- ---------------
             4 liter
    4.查询至少选修了一门课程的学生。
    SQL> select id,name from t_student where exists
     (select * from course where  exists
         (select * from select_course sc where student_id=t_student.id and course_id=course.id));
            ID NAME
    ---------- ---------------
             1 echo
             2 spring
             3 smith


    补充:in 走不走索引还是要视情况而定

    in在某些情况下会走、某些情况下不会走索引。  有些情况下Mysql会判断不走索引更快,会进行全表扫描,比如数据量只有几条的时候;在数据量大的时候in会走索引
    测试如下:
    (1) 查看索引
    show index from user;
    1196212-20210226102338424-173474452

     (2)   数据量只有两条的时候测试: 这时候没有走索引,走的全表扫描

    1196212-20210226102355054-669707660

     (3) 数据量大的时候进行的测试(数据量到达千条以上)

    1196212-20210226102420204-1575624160

      测试二: 子查询测试

    1196212-20210226102435261-1596447844
  • mysql查询按照指定字段的指定顺序进行排序

    之前我们已经了解的mysql按照中文进行排序的实现方法了:https://www.wj0511.com/site/detail.html?id=420

    那么如何按照指定字段的指定顺序进行排序呢?

    例如有一个用户表user,有id,username,status字段,status的字段值有1,2,3,4四种情况,如何将用户表中的数据按照status字段的2,4,1,3顺序进行排序呢?

    这时候需要使用到FIELD或者FIND_IN_SET方法,如:

    SELECT * FROM user ORDER BY FIELD(status,2,4,1,3)

    SELECT * FROM user ORDER BY FIND_IN_SET(status,'2,4,1,3') 

    如上两种方法就可以实现按照指定字段的指定顺序进行排序了

    在Yii框架中实现如下

    User::find()  
        ->orderBy([  
            new \yii\db\Expression('FIELD (status,2,4,1,3'),  
        ])  
        ->all()
  • aliyundrive-webdav

    aliyundrive-webdav

     

    GitHub Actions
    PyPI
    Docker Image
    aliyundrive-webdav
    Crates.io

    1f680.svg_ Help me to become a full-time open-source developer by sponsoring me on GitHub

    阿里云盘 WebDAV 服务,主要使用场景为配合支持 WebDAV 协议的客户端 App 如 InfusenPlayer 等实现在电视上直接观看云盘视频内容, 支持客户端 App 直接从阿里云盘获取文件播放而不经过运行本应用的服务器中转, 支持上传文件,但受限于 WebDAV 协议不支持文件秒传。

    请注意:V2 版本基于阿里云盘开放平台接口实现,不再支持阿里云盘 Web 和 App 版本获取的 refresh token。 由于本项目作者不再使用梅林固件,V2 版本不再免费支持 Koolshare 梅林固件系统,如有需要请考虑付费支持

    如果项目对你有帮助,请考虑捐赠支持项目持续维护。 也可以考虑加入aliyundrive-webdav 知识星球获取咨询和技术支持服务。

    Note

    本项目作者没有上传需求, 故上传文件功能测试不全面且没有持续迭代计划.

    安装

     

    可以从 GitHub Releases 页面下载预先构建的二进制包, 也可以使用 pip 从 PyPI 下载:

    pip install aliyundrive-webdav

    如果系统支持 Snapcraft 比如 Ubuntu、Debian 等,也可以使用 snap 安装:

    sudo snap install aliyundrive-webdav

    OpenWrt 路由器

     

    GitHub Releases 中有预编译的 ipk 文件, 目前提供了 aarch64/arm/mipsel/x86_64/i686 等架构的版本,可以下载后使用 opkg 安装,以 nanopi r4s 为例:

    wget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.3/aliyundrive-webdav_2.3.3-1_aarch64_generic.ipk
    wget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.3/luci-app-aliyundrive-webdav_2.3.3_all.ipk
    wget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.3/luci-i18n-aliyundrive-webdav-zh-cn_2.3.3-1_all.ipk
    opkg install aliyundrive-webdav_2.3.3-1_aarch64_generic.ipk
    opkg install luci-app-aliyundrive-webdav_2.3.3_all.ipk
    opkg install luci-i18n-aliyundrive-webdav-zh-cn_2.3.3-1_all.ipk

    其它 CPU 架构的路由器可在 GitHub Releases 页面中查找对应的架构的主程序 ipk 文件下载安装, 常见 OpenWrt 路由器 CPU 架构如下表(欢迎补充):

    路由器 CPU 架构
    nanopi r4s aarch64_generic
    小米 AX3600 aarch64_cortex-a53
    斐讯 N1 盒子 aarch64_cortex-a53
    Newifi D2 mipsel_24kc
    Pogoplug arm_mpcore

    Tips: 不清楚 CPU 架构类型可通过运行 opkg print-architecture 命令查询。

    OpenWrt 配置界面

    Docker 运行

     

    docker run -d --name=aliyundrive-webdav --restart=unless-stopped -p 8080:8080 \
      -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \
      -e REFRESH_TOKEN='your refresh token' \
      -e WEBDAV_AUTH_USER=admin \
      -e WEBDAV_AUTH_PASSWORD=admin \
      messense/aliyundrive-webdav

    其中,REFRESH_TOKEN 环境变量为你的阿里云盘 refresh_tokenWEBDAV_AUTH_USER 和 WEBDAV_AUTH_PASSWORD 为连接 WebDAV 服务的用户名和密码。

    QNAP 威联通 NAS

     

    QNAP 插件

     

    qnap-aliyunpan-webdav by @iranee.

    ContainerStation (Docker)

     

    管理员登陆 NAS 后安装 ContainerStation 并启动服务,在 Management (管理) 标签中 Create Application (新建应用),配置如下

    version: '3.3'
    services:
      aliyundrive-webdav:
        container_name: aliyundrive-webdav
        restart: unless-stopped
        ports:
          - '8080:8080'
        environment:
          - 'REFRESH_TOKEN=mytoken...'
        image: messense/aliyundrive-webdav

    其中 REFRESH_TOKEN 文档最下面说明;:8080 网盘访问映射端口,可以按需改为其他的。

    点击 Create (创建)后启动,访问 http://nas地址:8080/ 即可看到你网盘的自动生成索引网页文件。

    参考文档

    rclone

     

    为了避免重复上传文件,使用 rclone 时推荐使用 Nextcloud WebDAV 模式,可以支持 sha1 checksums. 另外需要配合 --no-update-modtime 参数,否则 rclone 为了更新文件修改时间还是会强制重新上传。

    举个例子:

    rclone --no-update-modtime copy abc.pdf aliyundrive-nc://docs/

    获取 refresh token

     

    扫码获取 refresh token

    命令行用法

     

    $ aliyundrive-webdav --help
    WebDAV server for AliyunDrive
    
    Usage: aliyundrive-webdav [OPTIONS]
           aliyundrive-webdav <COMMAND>
    
    Commands:
      qr    Scan QRCode
      help  Print this message or the help of the given subcommand(s)
    
    Options:
          --host <HOST>
              Listen host
    
              

    [env: HOST=]

    [default: 0.0.0.0]

    -p, –port <PORT> Listen port

    [env: PORT=]

    [default: 8080]

    –client-id <CLIENT_ID> Aliyun drive client_id

    [env: CLIENT_ID=]

    –client-secret <CLIENT_SECRET> Aliyun drive client_secret

    [env: CLIENT_SECRET=]

    –drive-type <DRIVE_TYPE> Aliyun drive type

    [env: DRIVE_TYPE=]

    Possible values: – resource: Resource drive – backup: Backup drive – default: Default drive -r, –refresh-token <REFRESH_TOKEN> Aliyun drive refresh token

    [env: REFRESH_TOKEN=]

    -U, –auth-user <AUTH_USER> WebDAV authentication username

    [env: WEBDAV_AUTH_USER=]

    -W, –auth-password <AUTH_PASSWORD> WebDAV authentication password

    [env: WEBDAV_AUTH_PASSWORD=]

    -I, –auto-index Automatically generate index.html -S, –read-buffer-size <READ_BUFFER_SIZE> Read/download buffer size in bytes, defaults to 10MB

    [default: 10485760]

    –upload-buffer-size <UPLOAD_BUFFER_SIZE> Upload buffer size in bytes, defaults to 16MB

    [default: 16777216]

    –cache-size <CACHE_SIZE> Directory entries cache size

    [default: 1000]

    –cache-ttl <CACHE_TTL> Directory entries cache expiration time in seconds

    [default: 600]

    –root <ROOT> Root directory path

    [env: WEBDAV_ROOT=]

    [default: /]

    -w, –workdir <WORKDIR> Working directory, refresh_token will be stored in there if specified –no-trash Delete file permanently instead of trashing it –read-only Enable read only mode –tls-cert <TLS_CERT> TLS certificate file path

    [env: TLS_CERT=]

    –tls-key <TLS_KEY> TLS private key file path

    [env: TLS_KEY=]

    –strip-prefix <STRIP_PREFIX> Prefix to be stripped off when handling request

    [env: WEBDAV_STRIP_PREFIX=]

    –debug Enable debug log –no-self-upgrade Disable self auto upgrade –skip-upload-same-size Skip uploading same size file –prefer-http-download Prefer downloading using HTTP protocol –redirect Enable 302 redirect when possible -h, –help Print help (see a summary with ‘-h’) -V, –version Print version

    [env: HOST=]

    [default: 0.0.0.0]

    -p, –port Listen port

    [env: PORT=]

    [default: 8080]

    –client-id Aliyun drive client_id

    [env: CLIENT_ID=]

    –client-secret Aliyun drive client_secret

    [env: CLIENT_SECRET=]

    –drive-type Aliyun drive type

    [env: DRIVE_TYPE=]

    Possible values: – resource: Resource drive – backup: Backup drive – default: Default drive -r, –refresh-token Aliyun drive refresh token

    [env: REFRESH_TOKEN=]

    -U, –auth-user WebDAV authentication username

    [env: WEBDAV_AUTH_USER=]

    -W, –auth-password WebDAV authentication password

    [env: WEBDAV_AUTH_PASSWORD=]

    -I, –auto-index Automatically generate index.html -S, –read-buffer-size Read/download buffer size in bytes, defaults to 10MB

    [default: 10485760]

    –upload-buffer-size Upload buffer size in bytes, defaults to 16MB

    [default: 16777216]

    –cache-size Directory entries cache size

    [default: 1000]

    –cache-ttl Directory entries cache expiration time in seconds

    [default: 600]

    –root Root directory path

    [env: WEBDAV_ROOT=]

    [default: /]

    -w, –workdir Working directory, refresh_token will be stored in there if specified –no-trash Delete file permanently instead of trashing it –read-only Enable read only mode –tls-cert TLS certificate file path

    [env: TLS_CERT=]

    –tls-key TLS private key file path

    [env: TLS_KEY=]

    –strip-prefix Prefix to be stripped off when handling request

    [env: WEBDAV_STRIP_PREFIX=]

    –debug Enable debug log –no-self-upgrade Disable self auto upgrade –skip-upload-same-size Skip uploading same size file –prefer-http-download Prefer downloading using HTTP protocol –redirect Enable 302 redirect when possible -h, –help Print help (see a summary with ‘-h’) -V, –version Print version” tabindex=”0″ role=”button” style=”box-sizing: border-box; position: relative; display: flex !important; padding: 0px !important; font-size: 14px; font-weight: var(–base-text-weight-medium, 500); line-height: 20px; white-space: nowrap; vertical-align: middle; cursor: pointer; user-select: none; border: 0px; border-radius: 6px; appearance: none; color: var(–fgColor-accent, var(–color-accent-fg)); background-color: transparent; box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color, box-shadow, border-color; justify-content: center !important; align-items: center !important; margin: var(–base-size-8, 8px) !important; width: var(–control-small-size, 28px); height: var(–control-small-size, 28px);”>

    Note

    注意:TLS/HTTPS 暂不支持 MIPS 架构。

    Note

    注意:启用 --skip-upload-same-size 选项虽然能加速上传但可能会导致修改过的同样大小的文件不会被上传

    License

     

    This work is released under the MIT license. A copy of the license is provided in the LICENSE file.

  • centos端口不通

    检测网络:iptables -S -t nat

     iptables -P  FORWARD  ACCEPT

    开机自启:

    vim   /etc/rc.local 
    iptables -P FORWARD   ACCEPT