python s3cmd 讓你遇見對象 2020/4/12 10:28

[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/

組件要素:

  1. 可執(zhí)行 python 文件 s3cmd 在PATH路徑下:主要是做命令行參數(shù)解析,業(yè)務(wù)邏輯的實現(xiàn)等谦疾,比如是 ls 南蹂,putget念恍,等等
  2. S3 python 包在 python 的第三方庫的安裝目錄:這個庫實現(xiàn) S3 協(xié)議的封裝六剥,解析,發(fā)包峰伙,收包等操作

命令的 map 表:

image.png

所以 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 主要做兩個邏輯:

  1. 構(gòu)造一個 s3 請求對象
  2. 然后把 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 方法如下:

image.png

邏輯很簡單,那么構(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)試的分享 ):

  1. 使用 pdb 單步調(diào)試
  2. 使用 s3cmd --debug 功能調(diào)試
pdb 調(diào)試

pdb 調(diào)試是我最為推薦的一種調(diào)試方式弹砚,pdb 是 python 的標(biāo)準(zhǔn)庫,能夠讓你單步調(diào)試枢希。有兩種方式:

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

執(zhí)行命令:

python -m pdb /usr/bin/s3cmd ls
image.png

這樣你就能愉快的單步調(diào)試了苞轿,看到每一個對象和執(zhí)行步驟茅诱。這個是通用的調(diào)試方法,適用于任何 python 程序搬卒。

s3cmd --debug

這個是 s3cmd 提供的調(diào)試選項瑟俭,執(zhí)行的時候,加入了這個選項契邀,那么就能知道 s3cmd 執(zhí)行的每一個步驟了摆寄。

執(zhí)行步驟:

image.png

包頭,響應(yīng)也打印出來了:

image.png

我們看到使用v2簽名坯门,頭部簽名字段為authorization微饥。


堅持思考,方向比努力更重要古戴。微信公眾號關(guān)注我:奇伢云存儲

掃碼_搜索聯(lián)合傳播樣式-白色版.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欠橘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子允瞧,更是在濱河造成了極大的恐慌简软,老刑警劉巖蛮拔,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痹升,居然都是意外死亡建炫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門疼蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛跌,“玉大人,你說我怎么就攤上這事察郁⊙苌鳎” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵皮钠,是天一觀的道長稳捆。 經(jīng)常有香客問我,道長麦轰,這世上最難降的妖魔是什么乔夯? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮款侵,結(jié)果婚禮上末荐,老公的妹妹穿的比我還像新娘。我一直安慰自己新锈,他們只是感情好甲脏,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妹笆,像睡著了一般块请。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晾浴,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天负乡,我揣著相機與錄音,去河邊找鬼脊凰。 笑死,一個胖子當(dāng)著我的面吹牛茂腥,可吹牛的內(nèi)容都是我干的狸涌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最岗,長吁一口氣:“原來是場噩夢啊……” “哼帕胆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起般渡,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤懒豹,失蹤者是張志新(化名)和其女友劉穎芙盘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脸秽,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡儒老,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了记餐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮樊。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖片酝,靈堂內(nèi)的尸體忽然破棺而出囚衔,到底是詐尸還是另有隱情,我是刑警寧澤雕沿,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布练湿,位于F島的核電站,受9級特大地震影響审轮,放射性物質(zhì)發(fā)生泄漏鞠鲜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一断国、第九天 我趴在偏房一處隱蔽的房頂上張望贤姆。 院中可真熱鬧,春花似錦稳衬、人聲如沸霞捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔑滓。三九已至投放,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕差。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涡相,地道東北人刹勃。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像埃碱,于是被迫代替她去往敵國和親猖辫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容