1. 程式人生 > >linux百度雲工具baidu pcs

linux百度雲工具baidu pcs

C/C++寫的一個百度網盤工具,可以在linux終端中使用。 這是通過分析網盤網站得到的直接介面,不需要建立應用。

  • 支援多執行緒下載和下載時斷點續傳。
  • 支援快速上傳和多執行緒分片上傳。
  • 支援執行緒限速。具體檢視'pcs set'和'pcs context'命令的說明。
  • 支援AES-CBC-128, AES-CBC-192, AES-CBC-256加密。

編譯 (Debian):

程式依賴於 libcurl。

1. 安裝依賴

apt-get install build-essential libcurl4-openssl-dev libssl-dev

2. 獲取原始碼

git clone https://github.com/GangZhuo/BaiduPCS.git

3. 編譯原始碼

cd BaiduPCS
make clean
make
make install #將安裝到/usr/local/bin下

4. 手動安裝到其他目錄,例如 /usr/bin 下

cp ./bin/pcs /usr/bin/

命令列表:

如果出現中文亂碼,請檢查作業系統的當前編碼是否為UTF-8。
命令中涉及到的網盤檔案路徑,可以是絕對路徑,也可以是相對於當前工作目錄的相對路徑。
例:
    /data/data.txt 即是網盤絕對路徑,表示網盤根目錄下的data目錄中的data.txt檔案。
    data.txt 即是相對路徑,表示當前工作目錄下的data.txt檔案。
    當前工作目錄可通過 'pcs pwd' 命令來檢視,當前工作目錄可通過 'pcs cd'命令切換。
    可通過 'pcs help' 檢視支援的子命令;可在子命令後加 '-h' 檢視子命令幫助,
    也可呼叫類似於 'pcs help <command>' 的命令來檢視子命令的幫助。
    例如:
        pcs move -h。
        pcs help move 此命令等價於上一行的命令

直接顯示網盤中文字檔案內容

pcs cat <file>

示例:
  pcs cat note.txt
  pcs cat /my/todo.txt

切換工作目錄

pcs cd <dir>

示例:
  pcs cd pcs
  pcs cd /backup/20140618

複製網盤檔案或目錄

pcs copy <old path> <new path>

示例:
  pcs copy data.txt data_20140118.txt

比較異同

pcs compare [-cderu] <local path> <remote path>

比較本地檔案和遠端檔案、本地目錄和遠端目錄的異同。
預設選項是'-cdu',即打印出需要上傳的檔案、
需要下載的檔案和無法確定上傳下載的檔案。

比較規則:
  只通過時間來進行比較。
  I)  如果本地和遠端都是檔案:
        a) 本地最後修改時間大於網盤檔案上傳時間,則認為需要上傳;
        b) 本地最後修改時間小於網盤檔案上傳時間,則認為需要下載;
           (此處注意:當一個檔案上傳到網盤後,其網盤時間肯定比本地最後修改時間大。
             如果此時執行比較的話,則會認為該檔案需要從網盤下載。
             下載則沒有此問題,因為一個檔案下載後,程式會使用
             網盤時間來更新本地檔案的最後修改時間。)
  II)  本地存在,網盤不存在,則認為需要上傳
  III) 本地不存在,網盤存在,則認為需要下載
  IV)  如果一端是檔案,另一端是目錄,則認為無法確認是上傳還是下載。

選項:
  -c  只打印出無法確定上傳或下載的項。
      一般是因為本地是檔案,遠端是目錄,或本地是目錄遠端是檔案
  -d  只打印出需要下載的檔案或目錄
  -e  只打印相同的檔案或目錄
  -r  遞迴比較其子目錄
  -u  只打印出需要上傳的檔案或目錄

示例:
   pcs compare music music
   pcs compare -r ~/music music

顯示當前上下文

pcs context

上下文包括:
    當前使用的Cookie檔案、驗證碼圖片儲存路徑、
    當前的工作目錄、列出目錄時分頁大小、列出目錄時的排序欄位、
    列出目錄時的排序方向、啟用的加密方法、加密金鑰、是否啟用加密

程式開啟時會自動讀取上下文檔案;結束時,會自動儲存上下文到檔案。
可通過'PCS_CONTEXT'環境變數指定上下文檔案路徑。程式判斷規則是:
   1) 如果通過'--context'選項指定了上下文檔案,則使用它;
   2) 如果未通過'--context'指定,但是指定了環境變數'PCS_CONTEXT'則使用它;
   3) 如果也未指定環境變數'PCS_CONTEXT'則使用'~/.pcs/pcs.context'

上下文為JSON格式的檔案:

{
    "cookiefile":           "/home/gang/.pcs/default.cookie", /*指定Cookie檔案*/
    "captchafile":          "/home/gang/.pcs/captcha.gif",    /*指定驗證碼圖片儲存路徑*/
    "workdir":              "/",                              /*指定當前的網盤工作目錄*/
    "list_page_size":       20,                               /*指定列出目錄時分頁大小*/
    "list_sort_name":       "name",                           /*指定列出目錄時排序欄位*/
    "list_sort_direction":  "asc",                            /*指定列出目錄時的排序方向*/
    "secure_method":        "aes-cbc-128",                    /*指定上傳時的加密方式*/
    "secure_key":           "12345678",                       /*指定上傳時的加密金鑰,*/
                                                              /*下載時如檢測到檔案被加密,也使用此金鑰解密*/
    "secure_enable":        true,                              /*指定是否啟用加密解密*/
                                                              /*如果設定為false,*/
                                                              /*下載時即使檢查到檔案加密,也不會解密*/
    "timeout_retry":        true,                             /*當執行'synch'和'compare'命令時,
                                                                因為頻繁呼叫api去獲取目錄下檔名稱
                                                                將導致一些api呼叫超時,此選項用於控制超時時
                                                                是否重試。*/
    "max_thread":           5,                                /*下載時允許的最大執行緒數*/
    "max_speed_per_thread": 0                                 /*設定的是單個執行緒的最大下載速度。0表示不限速。
                                                                單位為KiB。例,如果設定為100,共有5執行緒,
                                                                則總的最大下載速度將在500KiB/s上下浮動。*/
    "max_upload_speed_per_thread": 0                          /*設定的是單個執行緒的最大上傳速度。0表示不限速。
                                                                單位為KiB。例,如果設定為100,共有5執行緒,
                                                                則總的最大上傳速度將在500KiB/s上下浮動。*/
}

下載檔案

pcs download [-f] <remote file> <local file>
pcs d [-f] <remote file> <local file>

只能下載檔案,如果需要下載目錄,請使用 'pcs synch -d <local dir> <remote dir>'。

選項:
  -f   如果本地檔案存在的話,強制替換

示例:
  pcs download /backup/data.20140118.tar.gz ~/download/data.20140118.tar.gz

直接儲存文字到網盤中

pcs echo [-a] <remote file> <text>

選項:
  -a  指定把文字新增到檔案末尾,而不是完全替換

示例:
  pcs echo data.txt "The text that saved by pcs."

編碼/解碼本地檔案

pcs encode [-def] <src> <dst>

選項:
  -d  使用上下文中的金鑰來解密<src>檔案並輸出結果到<dst>中。
      程式會讀取<src>檔案並檢測其加密方法。
  -e  使用上下文中的金鑰和加密方法來加密<src>檔案並輸出結果到<dst>中。
  -f  強制覆蓋<dst>檔案。

示例:
  pcs encode -e data.txt data-sec.txt
  pcs encode -d data-sec.txt data-plain.txt
  pcs encode -h

檢視幫助

pcs help [command name]

檢視幫助。

示例:
   pcs help
   pcs help compare
   pcs help -h

列出網盤根目錄下的檔案或目錄

pcs list [dir]
pcs ls [dir]

輸出格式為:
    * 第一列指示是否是目錄,如果是目錄則輸出 d,否則輸出 -
    * 第二列是檔案或目錄的最後修改時間
    * 第三列是檔案路徑

示例:
   pcs list
   pcs list /music
   pcs list -h

列出目錄時會自動分頁顯示,如果需要修改分頁大小的話,
使用'pcs set --list_page_size=20'來修改,把list_page_size設定為0,則關閉分頁。

登入網盤

pcs login [--username=<username>] [--password=<password>]

登入可能需要輸入驗證碼。目前的處理辦法是把驗證碼圖片寫入到本地檔案,使用者開啟檔案識別驗證碼。
可通過 'pcs set --captcha_file=<path> 來指定驗證碼儲存路徑,
例如:'pcs set --captcha_file=/var/www/xxx.com/captch.gif'將檔案儲存到網站目錄下。
可通過 'pcs context' 檢視當前的執行上下文。執行上下文包括驗證碼圖片儲存路徑等其他資訊。

示例:
  pcs login -h 可檢視login命令的使用方法
  pcs login    會提示輸入使用者名稱和密碼
  pcs login --username=gang 指定使用者名稱登入
  pcs login --username=gang --password=123456 指定使用者名稱和密碼登入

退出網盤

pcs logout

顯示網盤檔案或目錄的元資料

pcs meta <file>

示例:
   pcs meta
   pcs meta note.txt

建立目錄

pcs mkdir <dir>

示例:
  pcs mkdir subdir
  pcs mkdir /music/china

移動網盤檔案或目錄

pcs move <src> <dst>
pcs mv <src> <dst>

示例:
  pcs move /data_20140118.txt /subdir/data.txt
  pcs move music /my/music

顯示當前網盤的工作目錄

pcs pwd

示例:
  pcs pwd

顯示網盤配額

pcs quota [-e]

選項:
  -e   列印精確的網盤配額

示例:
   pcs quota
   pcs quota -e

刪除檔案或目錄

pcs remove <path>
pcs rm <path>

示例:
  pcs remove /subdir/data_20140118.txt

重新命名網盤檔案或目錄

pcs rename <src> <new name>
pcs ren <src> <new name>

注意:<new name>是新的檔名字,而不是檔案路徑。如果需要移動檔案到另一個目錄,請使用 'pcs move'。

示例:
  pcs rename /data.txt data_20140118.txt

設定上下文

pcs set [--captcha_file=<path>] [--cookie_file=<path>] ...

選項:
--captcha_file=<file path>         設定驗證碼圖片儲存路徑
--cookie_file=<file path>          設定cookie檔案路徑
--list_page_size=<page size>       設定列出目錄時分頁大小
--list_sort_direction=[asc|desc]   設定列出目錄時排序方向
--list_sort_name=[name|time|size]  設定列出目錄時排序欄位
--secure_enable=[true|false]       設定上傳下載時是否啟用加密
--secure_key=<key string>          設定加密解密金鑰
--secure_method=[plaintext|aes-cbc-128|aes-cbc-192|aes-cbc-256] 設定加密方式
--timeout_retry=[true|false]       設定執行synch和compare時,獲取目錄下檔案超時時,是否允許重試
--max_thread=<num>                 設定下載時允許的最大執行緒數
--max_speed_per_thread=<num>       設定單執行緒的最大下載速度。單位為KiB。詳細檢視'pcs context'命令中對上下文檔案的說明
--max_upload_speed_per_thread=<num>設定單執行緒的最大上傳速度。單位為KiB。詳細檢視'pcs context'命令中對上下文檔案的說明

示例:
  pcs set -h
  pcs set --cookie_file="/tmp/pcs.cookie"
  pcs set --captcha_file="/tmp/vc.git"
  pcs set --list_page_size=20 --list_sort_name=name --list_sort_direction=desc
  pcs set --secure_enable=true --secure_key=123456 --secure_method=aes-cbc-256

搜尋檔案

pcs search [-r] [dir] <key>

示例:
   pcs search note.txt          在當前工作目錄搜尋 note.txt
   pcs search /music desc.mp3   在/music目錄搜尋 desc.mp3
   pcs search -r note.txt       在當前工作目錄遞迴搜尋 note.txt
   pcs search -r /music desc.mp3 在/music目錄遞迴搜尋 desc.mp3

同步目錄

pcs synch [-cdenru] <local path> <remote path>
pcs s [-cdenru] <local path> <remote path>

同步本地檔案和遠端檔案、本地目錄和遠端目錄。
預設選項是'-cdu',即上傳需要上傳的檔案、下載需要下載的檔案和列印無法確定上傳下載的檔案。

比較規則:(同'compare'一樣)
  只通過時間來進行比較。
  I)  如果本地和遠端都是檔案:
        a) 本地最後修改時間大於網盤檔案上傳時間,則認為需要上傳;
        b) 本地最後修改時間小於網盤檔案上傳時間,則認為需要下載;
           (此處注意:當一個檔案上傳到網盤後,其網盤時間肯定比本地最後修改時間大。
             如果此時執行比較的話,則會認為該檔案需要從網盤下載。
             下載則沒有此問題,因為一個檔案下載後,程式會使用
             網盤時間來更新本地檔案的最後修改時間。)
  II)  本地存在,網盤不存在,則認為需要上傳
  III) 本地不存在,網盤存在,則認為需要下載
  IV)  如果一端是檔案,另一端是目錄,則認為無法確認是上傳還是下載。

選項:
  -c  只打印出無法確定上傳或下載的項。
      一般是因為本地是檔案,遠端是目錄,或本地是目錄遠端是檔案
  -d  只下載需要下載的檔案或目錄
  -e  只打印相同的檔案或目錄
  -n  只是列印,而不真正的執行上傳和下載,等價於'compare'
  -r  遞迴比較其子目錄
  -u  只上傳需要上傳的檔案或目錄

示例:
   pcs synch music music
   pcs synch -r ~/music music
   pcs synch -u music music     只上傳需要上傳的檔案,等價於備份
   pcs synch -d music music     只下載需要下載的檔案,等價於還原
   pcs synch -du music music    上傳需要上傳的檔案,並且下載需要下載的檔案,等價於同步

注意:推薦每次都帶上'-c'選項,可以打印出不知道如何處理的檔案或目錄,防止漏上傳或下載。

上傳檔案

pcs upload [-f] <local file> <remote file>
pcs u [-f] <local file> <remote file>

只能上傳檔案,如果需要上傳目錄,請使用 'pcs synch' 命令。

示例:
   pcs upload ~/data.tar.gz /backup/data.20140118.tar.gz

顯示程式版本

pcs version

示例:
   pcs version

顯示當前登入使用者

pcs who

示例:
   pcs who

注意:

  • 1. 程式碼比較亂,以後空的時候重構。
  • 2. 啟用加密後,分片上傳邏輯未仔細測試。

問題:

  • 1. 上傳大檔案時,程式會計算檔案的MD5值,此過程耗時較久。
  • 2. 下載大檔案時,程式會在磁碟上預分配檔案空間,此過程耗時較久。
  • 3. 上傳大檔案後,通過 'pcs meta'獲取到的md5值與本地檔案計算出的md5不匹配,這個應是百度網盤的bug。(測試時,把上傳的檔案下載到本地後,對比md5值是匹配的)