By: Sid Date: 2021/9/4
最近在自己的服务器上配置了bt离线下载,想要实现自动获取下载的文件到客户端的功能。过程中学到了很多,在此总结一下方便以后回顾。
项目地址atupload.sh · sid886/myShellScripts - 码云 - 开源中国 (gitee.com)
实现该功能使用的工具:
这个过程中我学习到的知识
# 显示所有的任务信息
> transmission-remote --auth <username>:<password> -l
> transmission-remote --auth sidpku:123456 -l
显示的信息中,比较重要的有任务的大小、完成情况、任务的名称
<X>表示必须填写,如<username>就对应着
sidpku
,连<>一起替换掉。[X]表示可选填写,可以不要。
代码中每行第一个
>
是命令提示符,不要输入到代码中。
最简单的方法就是把密码放到别的地方。然后通过读取文件来获取。
我把密码和账号文件放在自己创建的$HOME/.mypasswd/
文件夹下面,.<应用名称>.username
储存账号,.<应用名称>.passwd
储存密码。并且要修改权限使得只有自己能够读取。
> echo "<username>" > "$HOME/.mypasswd/.<applicant>.username"
> echo "<passwd>" > "$HOME/.mypasswd/.<applicant>.passwd"
> chmod 600 $HOME/.mypasswd/*
#举例
> echo sidpku > "$HOME/.mypasswd/.transmission.username"
> echo 123456 > "$HOME/.mypasswd/.transmission.passwd"
> chomod 600 $HOME/.mypasswd/*
当要使用账号和密码的时候,就通过读取文件来储存到变量中。
> USERNAME=$(cat "$HOME/.mypasswd/.transmission.username")
> PASSWD=$(cat ""$HOME/.mypasswd/.transmission.passwd")
# 以transmission-remote举例,要输入账号密码才能执行list(-l)操作
> transmission-remote --auth "$USERNAME":"$PASSWD" -l
这是最简单的做法,还可以使用openssl来对密码加密,增加保存密码文件的安全性,提高数据传输过程中的安全性。具体可以参考:How to Use Encrypted Passwords in Bash Scripts
我的需求是从transmission-remote提供的任务列表中,获取下载完成度和任务名称,以进行后续的比较。
xxxxxxxxxx
ID Done Have ETA Up Down Ratio Status Name
4 100% 4.59 GB Done 0.0 0.0 0.0 Idle <FileName1>
5 100% 6.67 GB Done 0.0 0.0 0.0 Idle <FileName2>
10 100% 78.09 MB Done 0.0 0.0 0.0 Idle <FileName3>
11 100% 6.93 GB Done 0.0 0.0 0.0 Idle <FileName4>
Sum: 18.26 GB 0.0 0.0
根据获取到的信息,我们需要去掉第一行和最后一行,然后获取最后一列数据(任务名),再进行分析。
xxxxxxxxxx
# 首先获取任务信息,使用数据重定向保存在文件torrent.list中
> transmission-remote --auth "$USERNAME":"$PASSWD" -l > torrent.list
# 去掉第一行和最后一行
> cat torrent.list | tail -n +2 | head -n -1 > temp.txt
# 最后一列数据
> cat temp.txt | gawk -F' {2,}' '{print $10}' > names.txt
参看:如何使用transmission-remote获取任务信息
此命令使用了管道命令,cat
获取到任务信息,首先用tail
去掉首行,然后用head
去掉末行,然后重定向到temp.txt
文件中保存。在命令中,当任务列表经过tail
处理后,head
处理的输入就只包含任务列表的第二行到最后一行。然后head
再将最后一行给去掉,输出只包含第二行到倒数第二行了。
tail -n +<num>
可以获取从第<num>
行到最后一行的所有内容。
head -n -<num>
可以获取去掉末尾<num>
行的文本内容。
xxxxxxxxxx
> cat temp.txt | gawk -F' {2,}' '{print $10}' > names.txt
[-F'<IFS>']
可选选项,设定分隔符为<IFS>
。
此处-F' {2,}'
是将分隔符设为2个及以上的 (空格)。{2,}
是正则表达式的写法,重复2次或以上。还可以将分隔符设为:
,如-F':'
'{print $10}'
是将第10列的数据输出到标准输出流。
虽然torrent.list中Name是第9列,但每行开头是空格导致gawk把空格识别为了第一列,Name列变成了第10列。在实际运用中要注意这个问题。
更新中...