说明:我们从VPS
上传文件到OneDrive
网盘的方法很多,包括Rclone
挂载,OneIndex
程序的上传功能,不过2
个在上传的时候都还是有点BUG
,前者会出现丢文件的情况,后者也会出现上传失败,都不是很理想,这里博主再介绍个OneDrive
上传脚本,几乎不会出现上传问题,很好用,由萌咖大佬制作,并将其适用于Aria2
的自动上传,这里说下具体操作。
提示
【2019.11.28】
该版本不再维护和更新,请移植Go版的上传工具,更高效和快速,地址:https://www.moerats.com/archives/1006/
更新
【2018.12.16】
应一些同学需求,新增上传到指定文件夹的方法。
【2018.11.19】
OneDrive上传脚本BUG已被萌咖大佬修复,修复了空格处理不当,导致部分带空格的文件夹上传失败,从而影响Aria2上传脚本。
【2018.10.30】
修复Aria2上传脚本BUG,包括修复了不能上传文件夹功能,修复了不能正确上传文件名中包含空格的项目。
【2018.10.29】
优化OneDrive网盘脚本。优化认证步骤。
独家分享萌咖大佬的Aria2自动上传脚本,判断更加细节,支持单文件、文件夹里的单文件、文件夹里的多文件及文件夹上传。超过15G文件停止上传(onedrive限制)。
说明
【2018.11.19】
#目前脚本修复的差不多了,博主测试各种带空格的文件夹自动上传都没问题。
#如果依然出现有些文件上传不了?
出现这种情况的话,大概是文件虽然下载完成了,但一直卡在做种阶段,导致参数传不到自动上传脚本,从而文件夹也上传不了。
解决方法:在配置文件里加入seed-time=0参数(意思是停止做种),再重启Aria2即可。
方法
Github地址:https://github.com/0oVicero0/OneDrive
脚本特性:脚本支持文件夹上传,支持获取文件的匿名直链,且只适用于OneDrive
非个人版。
1、安装脚本
安装curl
,用于访问API
:
#Ubuntu和Debian系统
apt-get install -y curl
#Centos系统
yum install curl -y
运行命令安装脚本:
#为了方便小白,本脚本内置萌咖大佬永久有效的应用参数,可以直接使用,如果你不放心可以自己获取参数,不过可能会遇到很多坑,建议直接使用脚本默认的参数
wget --no-check-certificate -qO- "https://raw.githubusercontent.com/0oVicero0/OneDrive/master/OneDrive.sh" |bash
本脚本需要三个参数Client ID
、Secret
、Reply URL
,均需要在/usr/local/etc/OneDrive/onedrive.cfg
文件里修改,参数获取看下面,当然你也可以不用管,直接进行步骤3
。
2、获取参数
先访问Microsoft Azure Management Portal,然后点击左侧菜单栏中的Azure Active Directorg
,选择应用注册,再点击页面上方的新应用程序注册。
输入名称如:OneDrive for Linux
,应用程序类型选择Web应用/API
,填入登陆URL
:https://login.microsoftonline.com/,再点击创建。
然后点击刚刚创建的应用程序,复制应用程序ID
,即脚本需要的Client ID
参数,再点击左上角的设置。
然后进行如下修改:
#点击右边的回复URL,将其修改为:https://onedrive.live.com/about/business/,即脚本所需要的Reply URL参数。
#点击所需权限,点击Windows Azure Active Directory确认是否已选中Sign in and user profile,如果没有则选中并点击完成。
#点击上方的添加,点击选择API,选中Office 365 SharePoint Online,并点击选择。在选择权限中选中Read user files 和Read and write user files,并点击选择。点击完成按钮,并关掉此小窗口。
#点击密钥,填入密钥描述,如:OneDrive,选择年限1年,点击保存,再复制密匙,即脚本所需要的Secret参数。
不过这里说下密匙(Secret
参数)填写的一个坑,由唯一度博主填平。就是当我们获取到带+
号的密匙时候,我们需要使用编码符号,把+
改成%2B
,然后再填入脚本里,不然最后会出现Something went wrong, here is the API response
的错误,导致验证失败。
3、运行账号认证程序
运行命令onedrive -a
,将返回的网址复制到浏览器打开,再登陆你的OneDrive for Business
账号,登陆成功后复制地址栏中的地址(复制包括localhost
的所有链接地址),粘贴到SSH
客户端里,敲回车键即可。
如果返回以下字段:It seems like we have a refresh token, so we are ready to go
,那就恭喜你,设置成功!
提示:如果你遇到bash: onedrive: command not found错误,则需要找到/usr/local/etc/OneDrive文件夹,修改onedrive和onedrive-d脚本,在第二行都加上export PATH=/usr/local/bin:$PATH代码,再保存就行了。
使用
1、使用命令
onedrive --help
#####################################################################
Usage: onedrive [OPTIONS] file1 [file2...]
onedrive-d folder
Options:
-d, --debug Enable debug mode
-a, --authorize Run authorization process
-f, --folder Upload files into this remote folder
-c, --creat Creat remote folder."
Directory names are separated with a slash, e.g.
rootFolder/subFolder
Do NOT use a trailing slash!
-h, --help Show this help
-r, --rename Rename the files during upload
For each file you specify you MUST also specify
the remote filename as the subsequent parameter
Be especially careful with globbing!
-s, --silent Silent mode for use in crontab scripts.
Return only exit code.
-ls,--list Show the itmes in this directory.
-l, --link Show the file share link.
#####################################################################
2、命令示范
如果我们要上传/root
文件夹里面的moerats.txt
,使用命令:
#此命令默认上传到OneDrive根目录
onedrive '/root/moerats.txt'
#如果上传到指定文件夹,就需要加-f参数
onedrive -f RATS '/root/moerats.txt' #上传到OneDrive根目录的RATS文件夹
onedrive -f RATS/RATS '/root/moerats.txt' #上传到OneDrive根目录RATS文件夹里的RATS文件夹
如果我们要将/root
文件夹及里面的文件夹和文件一起上传,使用命令:
#此命令默认上传到OneDrive根目录
onedrive-d '/root'
#如果上传到指定文件夹,就需要加-f参数
onedrive-d -f RATS '/root' #上传到OneDrive根目录的RATS文件夹
onedrive-d -f RATS/RATS '/root' #上传到OneDrive根目录RATS文件夹里的RATS文件夹
如果我们想直接查看OneDrive
网盘目录的文件,使用命令:
#此命令只查看根目录文件
onedrive -l
#如果我们要查看根目录root文件夹里的文件
onedrive -l /root
Aria2自动上传
上传方法参考:使用Aira2下载文件后自动上传到Google Drive网盘。
上传代码如下:
#!/bin/bash
GID="$1";
FileNum="$2";
File="$3";
MaxSize="15728640"
RemoteDIR=""; #上传到Onedrive的路径,默认为根目录,如果要上传到指定目录,方法看文章最后面。
LocalDIR="/home/www/download/"; #Aria2下载目录,记得最后面加上/
if [[ -z $(echo "$FileNum" |grep -o '[0-9]*' |head -n1) ]]; then FileNum='0'; fi
if [[ "$FileNum" -le '0' ]]; then exit 0; fi
if [[ "$#" != '3' ]]; then exit 0; fi
function LoadFile(){
IFS_BAK=$IFS
IFS=$'\n'
if [[ ! -d "$LocalDIR" ]]; then return; fi
if [[ -e "$File" ]]; then
if [[ $(dirname "$File") == $(readlink -f $LocalDIR) ]]; then
ONEDRIVE="onedrive";
else
ONEDRIVE="onedrive-d";
fi
FileLoad="${File/#$LocalDIR}"
while true
do
if [[ "$FileLoad" == '/' ]]; then return; fi
echo "$FileLoad" |grep -q '/';
if [[ "$?" == "0" ]]; then
FileLoad=$(dirname "$FileLoad");
else
break;
fi;
done;
if [[ "$FileLoad" == "$LocalDIR" ]]; then return; fi
if [[ -n "$RemoteDIR" ]]; then
Option=" -f $RemoteDIR";
else
Option="";
fi
EXEC="$(command -v $ONEDRIVE)";
if [[ -z "$EXEC" ]]; then return; fi
cd "$LocalDIR";
if [[ -e "$FileLoad" ]]; then
ItemSize=$(du -s "$FileLoad" |cut -f1 |grep -o '[0-9]*' |head -n1)
if [[ -z "$ItemSize" ]]; then return; fi
if [[ "$ItemSize" -ge "$MaxSize" ]]; then
echo -ne "\033[33m$File \033[0mtoo large to spik.\n";
return;
fi
eval "${EXEC}${Option}" \'"${FileLoad}"\';
if [[ $? == '0' ]]; then
rm -rf "$FileLoad";
fi
fi
fi
IFS=$IFS_BAK
}
LoadFile;
如果你想上传到指定的文件夹,修改如下:
#上传到Onedrive里的RATS目录,参数改为:RemoteDIR="RATS";
#上传到Onedrive里的RATS目录里的RATS目录,参数改为:RemoteDIR="RATS/RATS";
如果你觉得上传速度较慢,可以编辑/usr/local/etc/OneDrive/onedrive.cfg
,修改threads
线程数,默认2
。
#这里提供个快速修改线程数的命令,这里默认修改为5,建议别太高!
sed -i "s#max_upload_threads=2#max_upload_threads=5#g" '/usr/local/etc/OneDrive/onedrive.cfg'
可以更换绑定的Onedrive账号吗?装了
这个我倒没试过,按理说可以换,你直接删掉/usr/local/etc/OneDrive文件夹。然后安装脚本再绑定吧。
我测试是重新OneDrive-a一次就行,就绑定新的了
如果只是要上传OD什么方法最好?我系统debian9
目前来说,我觉得这个最好,rclone会掉文件,还有其它上传或多或少总会有点小问题。
不想上传完自动删除的话,直接注释掉rm -rf那一行可以吗
试了一下,要注释掉
rm -rf "$FileLoad";if [[ $? == '0' ]]; then
fi
整个块
你很聪明。
hhh,还有如果用filerun之类的程序管理服务器本地的文件的话,建议把这句改成chmod -R 777 "$FileLoad";否则php没有权限删除root用户运行的aria2创建的文件,这样改还有一个好处,上传完成之前filerun没有权限删除文件,避免出错,当然直接改整个下载目录的权限也OK。另外aria2必须要用root权限运行,我之前为了让php管理文件,是用www用户运行的aria2,结果脚本调用onedrive的时候会出错...这坑跳的.
其他和脚本无关的坑
lnmp脚本安装的php需要改nginx配置才能跨目录访问服务器文件
oneindex好安装个xx,查了好多教程都说把文件上传就完,文档又没有,我还是参照https://github.com/WangNingkai/OLAINDEX的文档改了php配置才能运行的
还有就是CentOS7不要用逗比的aria2脚本,会直接没法运行,自己yum装一个手动配置吧
码这么多字辛苦了,应该有人会看到,感觉你踩了不少的坑。
多谢博主和萌咖大佬
我以前就是遇到问题就去翻评论,要是有人和我踩一个坑就知道怎么办了
多看评论可以避免踩很多坑,以后希望大佬多在我教程下提些建议,可以让更白的小白避免踩坑。
你才是大佬,我是小小白
话说我昨天下了一个20g的资源,今天下了一个90g的资源,这两个都没有上传
就是整个文件夹虽然大,但文件多,每个都没有超过15g的
我看了下出现了
12/01 22:00:22 [NOTICE] Your share ratio was 0.6, uploaded/downloaded=56GiB/98GiB
/home/downloads/漫威宇宙10周年纪念2008-20181080P特效中英双字/BT@烧包-一个致力于分享精品影视的种子网站.url too large to spik.
这是最后几行
是不是判断文件大小的时候有什么问题啊
还有就是大佬知道手动上传文件夹的命令怎么用吗
上传文件夹c,c下面有一个c.txt
onedrive -f c
然后错误信息是
Please specify at least one file to upload
onedrive命令直接上传一个文件倒是没问题
是不是我写错了
判断的是下载的整个文件夹的,所以貌似你超过了15G,不过你可以去掉大小判断;后面的问题你加个路径看看,比如c/,或者/../c。
原来是onedrive-d floder
我的天这和文档写的不一样啊
还有命令是onedrive-d,中间没有空格...
一时间嗦不出话
没有空格,以我示范的教程为准,如果你不明白的话看看脚本文件就清楚了。
嗯嗯,试了一下已经成功了
多谢大佬
哦哦,那我直接在那个大小限制的数字后面加个0吧,删代码还怕出问题
但是那个命令我都试了,还是提示
Please specify at least one file to upload
我一会去萌咖大佬博客底下找找看
手动上传,只能上传一点
/usr/local/bin/onedrive-d: eval: line 45: syntax error near unexpected token )' /usr/local/bin/onedrive-d: eval: line 45: /usr/local/etc/OneDrive/onedrive -f 'downloads/24/apps/baidu_shurufa/1/Alan Walker - Faded' '07 Faded (Tiesto's Deep House Remix).flac''
这个问题还是建议换系统吧。
那怎么删除?不想换系统
rm -rf /usr/local/etc/OneDrive
[root@izwz9a7gtmwgnxzoj6j3h7z admin]# wget --no-check-certificate -qO- "https://raw.githubusercontent.com/0oVicero0/OneDrive/master/OneDrive.sh" |bash
[root@izwz9a7gtmwgnxzoj6j3h7z admin]# onedrive -abash: onedrive: command not found
大佬 我这是什么原因呢 能帮帮我吗
我猜你是遇到楼下所说的问题了,你找到/usr/local/etc/OneDrive文件夹,修改onedrive和onedrive-d脚本,在第二行都加上export PATH=/usr/local/bin:$PATH代码,再保存就行了。
[admin@izwz9a7gtmwgnxzoj6j3h7z ~]$ onedrive -a
Please open the following URL in your browser and follow the steps until you see a blank page:
https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=ea2b36f6-b8ad-40be-bc0f-e5e4a4a7d4fa&redirect_uri=http://localhost/onedrive-login
When ready, please enter the value of the code parameter (from the URL you have been redirected) and press return
*3wvdXdIAA
/usr/local/etc/OneDrive/json-parser: line 188: cannot create temp file for here-document: No space left on device
Something went wrong, here is the API response:
*"}
你的评论太长,给你缩短了,你使用df -h看看,硬盘是不是爆满了。
[admin@izwz9a7gtmwgnxzoj6j3h7z data]$ onedrive-d '444.txt'
It does not seem to be authorized.
Please open the following URL in your browser and follow the steps until you see a blank page:
/usr/local/etc/OneDrive/onedrive-base: line 272: /usr/local/etc/OneDrive/.refresh_token.2607: Permission denied
rm: cannot remove ‘/usr/local/etc/OneDrive/.refresh_token.2607’: No such file or directory
It seems like we have a refresh token, so we are ready to go.
大佬 都走了一遍 如何现在在上传文件 显示这个 文件也没上传
这个貌似是权限不够,该问题还没遇到过,所以我也不是很清楚。
我设置了aria2的文件夹里的文件会被自动删除 但是没有上传到onedrive上(我现在也不知道它们跑哪里去了)
如果切换成root的话[admin@izwz9a7gtmwgnxzoj6j3h7z data]$ sudo su root
[root@izwz9a7gtmwgnxzoj6j3h7z data]# onedrive-d '444.txt'
bash: onedrive-d: command not found
[root@izwz9a7gtmwgnxzoj6j3h7z data]#
又显示这个了 我也用root用户去
找到/usr/local/etc/OneDrive文件夹,修改onedrive和onedrive-d脚本,在第二行都加上export PATH=/usr/local/bin:$PATH代码 再添加了这个
但是
[root@izwz9a7gtmwgnxzoj6j3h7z data]# onedrive-d '444.txt'
bash: onedrive-d: command not found
也是这样的的不行的话我重装系统再来一遍把
换debian 9系统
我试试哈 谢谢大佬
评论好多,我就没翻了,建议在脚本中最后加一条命令:export PATH=/usr/local/bin:$PATH 因为我发现好像有部分VPS中没有把/usr/local/bin加入到PATH目录中,而这个脚本就是在这个目录运行的
这问题貌似在CentOS系统会出现,我在后面说明下,然后让人手动添加吧。
大佬 你好 请问如何修改上传到onedrive的位置?我看教程中是上传到根目录,并没有说明如何到指定文件夹,这个可以实现吗?谢谢!
可以,但上传的文件夹命名规则必须安装微软的要求来,所以说很蛋疼,你要是真想折腾,我就告诉你。
对了大佬 是否可以完成上传后实现自动删除功能?要不VPS存储吃不消啊。。。
Aria2上传脚本可以自动删除。
麻烦大佬告知一下!谢谢!
修改/usr/local/etc/OneDrive/onedrive.cfg配置文件,修改export api_root_folder参数,root是根目录,如果上传到文档目录,就改成export api_root_folder="special/documents",特殊文件夹名称参考这个https://docs.microsoft.com/zh-cn/onedrive/developer/rest-api/api/drive_get_specialfolder。
抱歉。。疏忽了。。找到了!
大佬,请问这个参数export api_root_folder是需要新建吗?没找到呢
博主,请问世纪互联版的该如何操作呢
没用过世纪互联的,暂不清楚。
API的方法稳还是第二种?第二种是要用rclone挂载吧
这个最稳。
原来是一个整体方案啊,我太笨了。我用这个方法确实特殊的字符也能上传了,但速度只有2-3m/s,重启试了一次也一样,换成oneindex上传就可以飙到35m/s,这是被限制了?
可以改onedrive.cfg配置文件,调整线程数,参数是threads,默认2线程。
请问max-overall-upload-limit的参数会影响Aria2上传文件到onedrive时的速度吗?
影响不大,主要看你的服务器性能。想要快可以编辑/usr/local/etc/OneDrive/onedrive.cfg,修改threads线程数,默认2。