找對象那麼難?python s3cmd 幫你解決


s3cmd 是一個 python 實現的知名的 s3 客戶端工具,能非常方便和人性化的手段讓你使用 s3 對象存儲。

官網鏈接:https://s3tools.org/s3cmd
github鏈接:https://github.com/s3tools/s3cmd

安裝

在 centos 在可以直接安裝:

yum install s3cmd

配置

調用 s3cmd --configure 進行配置,配置完成之後會在主目錄生成一個 .s3cfg 文件,你 cat ~/.s3cfg 就能看到了。

s3cmd --configure

其中最關鍵的幾個配置:

access_key = 你的 ak
secret_key = 你的 sk
host_base = localhost:20000         // 你的 S3 服務器 endpoint
host_bucket = localhost:20000/%(bucket)  // path 模式

其他的自行斟酌配置,配置項還挺多的,s3cmd 的功能還挺多。

s3cmd ls  # 列舉所有的桶

輸出例子:

hostname$ s3cmd ls 
2020-04-10 10:47  s3://qiya-bucket-1

使用

使用非常簡單,這個也是 s3cmd 相比 s3curl 這類原始工具更友好的地方:

常用方法

創建桶

s3cmd mb s3://mybucket

mb 就是 makebucket的意思;

示例:

root@ubuntu:~# s3cmd mb s3://qiya-bucket 
Bucket 's3://qiya-bucket/' created

列舉桶

列舉所有桶

s3cmd ls

示例:

root@ubuntu:~# s3cmd ls
2020-04-12 03:26  s3://qiya-bucket

上傳對象

把一個對象上傳到桶裏

s3cmd put some-file.xml s3://mybucket/somefile.xml

示例

root@ubuntu:~/temp# s3cmd put ./somefile.xml s3://qiya-bucket/somefile.xml
upload: './somefile.xml' -> 's3://qiya-bucket/somefile.xml'  [1 of 1]
 1967 of 1967   100% in    0s     6.85 kB/s  done
 
 root@ubuntu:~/temp# md5sum somefile.xml 
610ba3d5d83b67a687f09f0968c6b2cb  somefile.xml

下載對象

把一個對象下載下來

s3cmd get s3://mybucket/somefile.xml some-file-2.xml

示例:

root@ubuntu:~/temp# s3cmd get  s3://qiya-bucket/somefile.xml somefile.xml.2
download: 's3://qiya-bucket/somefile.xml' -> 'somefile.xml.2'  [1 of 1]
 1967 of 1967   100% in    0s    21.87 kB/s  done

root@ubuntu:~/temp# md5sum somefile.xml
610ba3d5d83b67a687f09f0968c6b2cb  somefile.xml

列舉對象

列舉桶裏的對象

s3cmd ls s3://mybucket

Python 代碼封裝

s3cmd 是一個純 python 項目,實現了 s3 協議的封裝,對外提供友好的命令行格式。下面以一個 s3cmd ls 列舉桶的命令執行來梳理分析。

s3cmd 安裝好之後(以下用 ubuntu 上分析舉例),s3cmd 這個可執行文件會處於系統 PATH 目錄下,s3cmd 本質上就是一個沒有 py 後綴的 python 文件。

root@ubuntu:~/temp# which s3cmd 
/usr/bin/s3cmd
root@ubuntu:~/temp# ll /usr/lib/python2.7/dist-packages/|grep -i s3
drwxr-xr-x  2 root root   4096 Feb 11 20:12 S3/
drwxr-xr-x  2 root root   4096 Feb 11 20:12 s3cmd-1.6.1.egg-info/

組件要素:

  1. 可執行 python 文件 s3cmd 在PATH路徑下:主要是做命令行參數解析,業務邏輯的實現等,比如是 lsputget,等等
  2. S3 python 包在 python 的第三方庫的安裝目錄:這個庫實現 S3 協議的封裝,解析,發包,收包等操作

命令的 map 表:
在這裏插入圖片描述
所以 s3cmd ls 這個映射到執行 cmd_ls 這個函數的邏輯。我們發送協議包給對象存儲服務,有兩個必須的要素:

  • 身份標識(ak/sk)
  • endpoint(你發給誰?)

這兩個東西我們命令行裏面沒有傳,那麼哪裏來的?還記得配置文件 .s3cfg 把,就是寫在這個裏面。 每個命令進來第一件事,就是把這個配置撈出來:

def cmd_ls(args):
    # 讀取 .s3cfg 配置
    cfg = Config()
    # 構造一個 s3 請求的客戶端對象
    s3 = S3(cfg)
    if len(args) > 0:
        uri = S3Uri(args[0])
        if uri.type == "s3" and uri.has_bucket():
            # 發送 s3 請求到後端
            subcmd_bucket_list(s3, uri, cfg.limit)
            return EX_OK
    # 發送 s3 請求到後端
    subcmd_all_buckets_list(s3)
    return EX_OK

subcmd_all_buckets_list 主要做兩個邏輯:

  1. 構造一個 s3 請求對象
  2. 然後把 http 請求發出去
(Pdb) bt
-> rc = main()
    -> rc = cmd_func(args)
        -> subcmd_all_buckets_list(s3)
            -> response = s3.list_all_buckets()
                # 構造請求
                -> request = self.create_request("LIST_ALL_BUCKETS")
                # 發包走
                -> response = self.send_request(request)

request 方法如下:
在這裏插入圖片描述
邏輯很簡單,那麼構造的 request 有什麼特別的呢?最關鍵的是簽名,當前 s3 支持兩種簽名:v2,v4 的簽名。v4 簽名較爲嚴格,是 AWS 當前推薦的一種簽名,甚至要對 body 進行簽名,提供 content-md5 ,v2 籤少許的一些頭部即可。

調試

作爲一個程序員,如果大家是第一次工具,那麼會想要自己執行一把,最好能單步調試,這裏推薦兩個方法(後面我會梳理一篇關於 python 調試的分享 ):

  1. 使用 pdb 單步調試
  2. 使用 s3cmd --debug 功能調試
pdb 調試

pdb 調試是我最爲推薦的一種調試方式,pdb 是 python 的標準庫,能夠讓你單步調試。有兩種方式:

  1. 代碼侵入式:添加 pdb.set_trace() , 那麼程序跑到這個地方的時候,就會被斷點到
  2. 非侵入式:直接執行命令的時候,聲明加載使用 pdb 庫

執行命令:

python -m pdb /usr/bin/s3cmd ls

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VDm5Nnoy-1587483276272)(evernotecid://EA6E7D5C-909C-487C-8DC8-4FCCDA32E1B8/appyinxiangcom/11768343/ENResource/p7313)]
這樣你就能愉快的單步調試了,看到每一個對象和執行步驟。這個是通用的調試方法,適用於任何 python 程序。

s3cmd --debug

這個是 s3cmd 提供的調試選項,執行的時候,加入了這個選項,那麼就能知道 s3cmd 執行的每一個步驟了。

執行步驟:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-63qIcc6j-1587483276277)(evernotecid://EA6E7D5C-909C-487C-8DC8-4FCCDA32E1B8/appyinxiangcom/11768343/ENResource/p7314)]

包頭,響應也打印出來了:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GsUEAXf2-1587483276284)(evernotecid://EA6E7D5C-909C-487C-8DC8-4FCCDA32E1B8/appyinxiangcom/11768343/ENResource/p7315)]

我們看到使用v2簽名,頭部簽名字段爲authorization。


堅持思考,方向比努力更重要。關注我:奇伢雲存儲
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章