[toc]
s3cmd 是一個 python 實現(xiàn)的知名的 s3 客戶端工具员辩,能非常方便和人性化的手段讓你使用 s3 對象存儲重斑。
官網(wǎng)鏈接:https://s3tools.org/s3cmd
github鏈接:https://github.com/s3tools/s3cmd
安裝
在 centos 在可以直接安裝:
yum install s3cmd
配置
調(diào)用 s3cmd --configure
進(jìn)行配置银酗,配置完成之后會在主目錄生成一個 .s3cfg 文件堰酿,你 cat ~/.s3cfg
就能看到了膜毁。
s3cmd --configure
其中最關(guān)鍵的幾個配置:
access_key = 你的 ak
secret_key = 你的 sk
host_base = localhost:20000 // 你的 S3 服務(wù)器 endpoint
host_bucket = localhost:20000/%(bucket) // path 模式
其他的自行斟酌配置昭卓,配置項還挺多的,s3cmd 的功能還挺多瘟滨。
s3cmd ls # 列舉所有的桶
輸出例子:
hostname$ s3cmd ls
2020-04-10 10:47 s3://qiya-bucket-1
使用
使用非常簡單候醒,這個也是 s3cmd 相比 s3curl 這類原始工具更友好的地方:
常用方法
創(chuàng)建桶
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 項目室奏,實現(xiàn)了 s3 協(xié)議的封裝火焰,對外提供友好的命令行格式劲装。下面以一個 s3cmd ls
列舉桶的命令執(zhí)行來梳理分析胧沫。
s3cmd 安裝好之后(以下用 ubuntu 上分析舉例),s3cmd 這個可執(zhí)行文件會處于系統(tǒng) PATH 目錄下占业,s3cmd 本質(zhì)上就是一個沒有 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/
組件要素:
- 可執(zhí)行 python 文件 s3cmd 在PATH路徑下:主要是做命令行參數(shù)解析,業(yè)務(wù)邏輯的實現(xiàn)等谦疾,比如是
ls
南蹂,put
,get
念恍,等等 - S3 python 包在 python 的第三方庫的安裝目錄:這個庫實現(xiàn) S3 協(xié)議的封裝六剥,解析,發(fā)包峰伙,收包等操作
命令的 map 表:
所以 s3cmd ls
這個映射到執(zhí)行 cmd_ls
這個函數(shù)的邏輯疗疟。我們發(fā)送協(xié)議包給對象存儲服務(wù),有兩個必須的要素:
- 身份標(biāo)識(ak/sk)
- endpoint(你發(fā)給誰瞳氓?)
這兩個東西我們命令行里面沒有傳策彤,那么哪里來的?還記得配置文件 .s3cfg
把,就是寫在這個里面店诗。 每個命令進(jìn)來第一件事裹刮,就是把這個配置撈出來:
def cmd_ls(args):
# 讀取 .s3cfg 配置
cfg = Config()
# 構(gòu)造一個 s3 請求的客戶端對象
s3 = S3(cfg)
if len(args) > 0:
uri = S3Uri(args[0])
if uri.type == "s3" and uri.has_bucket():
# 發(fā)送 s3 請求到后端
subcmd_bucket_list(s3, uri, cfg.limit)
return EX_OK
# 發(fā)送 s3 請求到后端
subcmd_all_buckets_list(s3)
return EX_OK
subcmd_all_buckets_list 主要做兩個邏輯:
- 構(gòu)造一個 s3 請求對象
- 然后把 http 請求發(fā)出去
(Pdb) bt
-> rc = main()
-> rc = cmd_func(args)
-> subcmd_all_buckets_list(s3)
-> response = s3.list_all_buckets()
# 構(gòu)造請求
-> request = self.create_request("LIST_ALL_BUCKETS")
# 發(fā)包走
-> response = self.send_request(request)
request 方法如下:
邏輯很簡單,那么構(gòu)造的 request 有什么特別的呢庞瘸?最關(guān)鍵的是簽名捧弃,當(dāng)前 s3 支持兩種簽名:v2,v4 的簽名擦囊。v4 簽名較為嚴(yán)格塔橡,是 AWS 當(dāng)前推薦的一種簽名,甚至要對 body 進(jìn)行簽名霜第,提供 content-md5 葛家,v2 簽少許的一些頭部即可。
調(diào)試
作為一個程序員泌类,如果大家是第一次工具癞谒,那么會想要自己執(zhí)行一把,最好能單步調(diào)試刃榨,這里推薦兩個方法(后面我會梳理一篇關(guān)于 python 調(diào)試的分享 ):
- 使用 pdb 單步調(diào)試
- 使用 s3cmd --debug 功能調(diào)試
pdb 調(diào)試
pdb 調(diào)試是我最為推薦的一種調(diào)試方式弹砚,pdb 是 python 的標(biāo)準(zhǔn)庫,能夠讓你單步調(diào)試枢希。有兩種方式:
- 代碼侵入式:添加
pdb.set_trace()
, 那么程序跑到這個地方的時候桌吃,就會被斷點到 - 非侵入式:直接執(zhí)行命令的時候,聲明加載使用 pdb 庫
執(zhí)行命令:
python -m pdb /usr/bin/s3cmd ls
這樣你就能愉快的單步調(diào)試了苞轿,看到每一個對象和執(zhí)行步驟茅诱。這個是通用的調(diào)試方法,適用于任何 python 程序搬卒。
s3cmd --debug
這個是 s3cmd 提供的調(diào)試選項瑟俭,執(zhí)行的時候,加入了這個選項契邀,那么就能知道 s3cmd 執(zhí)行的每一個步驟了摆寄。
執(zhí)行步驟:
包頭,響應(yīng)也打印出來了:
我們看到使用v2簽名坯门,頭部簽名字段為authorization微饥。
堅持思考,方向比努力更重要古戴。微信公眾號關(guān)注我:奇伢云存儲