S3tools / S3cmd 郵件清單:
S3cmd 需要 Python 2.6 或更高版本。從 S3cmd 版本 2 開始,也支援 Python 3+。
請參閱安裝說明。
S3cmd ( s3cmd
) 是一個免費的命令列工具和用戶端,用於上傳、檢索和管理 Amazon S3 以及使用 S3 協定的其他雲端儲存服務提供者(例如 Google Cloud Storage 或 DreamHost DreamObjects)中的資料。它最適合熟悉命令列程式的高級用戶。它也是批次腳本和從 cron 觸發的自動備份到 S3 的理想選擇。
S3cmd是用Python寫的。它是一個根據 GNU 公共許可證 v2 (GPLv2) 提供的開源項目,並且免費供商業和私人使用。您只需向亞馬遜支付使用其儲存空間的費用。
自2008 年首次發布以來,S3cmd 中添加了許多功能和選項...我們最近統計了超過60 個命令列選項,包括分段上傳、加密、增量備份、s3 同步、ACL 和元數據管理、S3儲存桶大小、儲存桶策略等等!
Amazon S3 提供可透過 Internet 存取的託管儲存服務,任何人都可以儲存任意數量的資料並在以後再次檢索。
S3 是亞馬遜營運的付費服務。在將任何內容儲存到 S3 之前,您必須註冊一個「AWS」帳戶(其中 AWS = Amazon Web Services)以獲得一對識別碼:存取金鑰和秘密金鑰。您需要將這些金鑰提供給 S3cmd。將它們視為您的 S3 帳戶的使用者名稱和密碼。
截至撰寫本文時,使用 S3 的成本為(以美元為單位):
每月使用的儲存空間每 GB 0.023 USD
加
每 GB 0.00 美元 - 上傳的所有數據
加
每GB 0.000 美元- 每月下載前1GB 數據每GB 0.090 美元- 每月最多下載10 TB 數據每GB 0.085 美元- 下載接下來40 TB 數據每GB 0.070 美元- 下載接下來100 TB 數據/ 每月0.050 美元每GB - 下載資料/月超過 150 TB
加
每 1,000 個 PUT、COPY 或 LIST 請求 0.005 USD 每 10,000 個 GET 和所有其他請求 0.004 USD
例如,如果您在1 月1 日上傳了在新西蘭度假時拍攝的2GB JPEG 照片,則在1 月底,您將因使用每月2GB 儲存空間而被收取0.05 美元的費用,為上傳2GB 資料收取0.0 美元的費用,並收取0.05 美元的費用。完整備份您珍貴的假期照片的費用略高於 0.06 美元。
二月你別碰它。您的資料仍在 S3 伺服器上,因此您為這 2 GB 支付 0.06 美元,但任何傳輸都不會收取一分錢。備份的持續成本為 0.05 美元。還不錯。
3 月份,您允許匿名讀取您的一些圖片,並且您的朋友下載了其中 1500MB 的圖片。由於文件歸您所有,因此您需要承擔由此產生的費用。這意味著到 3 月底,您將需要支付 0.05 美元的儲存費用以及 0.045 美元的朋友產生的下載流量費用。
沒有最低每月合約或安裝費。你所使用的就是你所支付的。一開始我的帳單大約是 0.03 美元,甚至是零。
簡而言之,這就是 Amazon S3 的定價模式。有關更多詳細信息,請查看 Amazon S3 主頁。
不用說,所有這些錢都是亞馬遜自己收取的,使用 S3cmd 顯然是不需要付費的:-)
儲存在 S3 中的檔案稱為“物件”,其名稱正式稱為“密鑰”。由於這有時會讓使用者感到困惑,因此我們經常將物件稱為「檔案」或「遠端檔案」。每個物件都屬於一個「桶」。
為了描述 S3 儲存中的對象,我們發明了一種類似 URI 的模式,其形式如下:
s3://BUCKET
或者
s3://BUCKET/OBJECT
儲存桶有點像目錄或資料夾,但有一些限制:
最好使用與 DNS 相容的儲存桶名稱。例如,這意味著您不應使用大寫字元。雖然 DNS 合規性並不是嚴格要求的,但下面描述的某些功能不適用於與 DNS 不相容的命名儲存桶。更進一步的是使用完全限定域名 (FQDN) - 這具有更多好處。
請尋找本文後面的“虛擬主機”,以了解有關 FQDN 命名儲存桶的更多詳細資訊。
與儲存桶不同,物件名稱幾乎沒有限制。這些可以是長度最多為 1024 位元組的任何 UTF-8 字串。有趣的是,物件名稱可以包含正斜線字元 (/),因此my/funny/picture.jpg
是有效的物件名稱。請注意,沒有名為my
和funny
的目錄或儲存桶 - 它實際上是一個名為my/funny/picture.jpg
的單一物件名稱,並且 S3 根本不關心它看起來像目錄結構。
例如,此類影像的完整 URI 可能是:
s3://my-bucket/my/funny/picture.jpg
儲存在 S3 中的檔案可以是私有的,也可以是公共的。私人文件只能由上傳它們的使用者讀取,而公共文件則可以由任何人讀取。此外,可以使用 HTTP 協定存取公共文件,而不僅僅是使用s3cmd
或類似工具。
文件的 ACL(存取控制清單)可以在上傳時使用--acl-public
或--acl-private
選項以及s3cmd put
或s3cmd sync
命令進行設定(見下文)。
或者,可以使用s3cmd setacl --acl-public
(或--acl-private
)指令來變更現有遠端檔案的 ACL。
前往 https://aws.amazon.com/s3,點擊右側欄中的「註冊 Web 服務」按鈕並完成註冊。您必須提供您的信用卡詳細信息,以便 Amazon 向您收取 S3 使用費。最後您應該擁有存取密鑰和密鑰。
如果您設定單獨的 IAM 用戶,則該用戶的存取金鑰必須至少具有以下權限才能執行任何操作:
其他範例策略可以在 https://docs.aws.amazon.com/AmazonS3/latest/dev/example-policies-s3.html 找到
s3cmd --configure
系統會要求您提供兩個密鑰 - 從確認電子郵件或亞馬遜帳戶頁面複製並貼上它們。複製時要小心!它們區分大小寫,並且必須準確輸入,否則您將不斷收到有關無效簽名或類似錯誤的錯誤。
請記得在金鑰中新增 s3:ListAllMyBuckets 權限,否則您在測試存取時將收到 AccessDenied 錯誤。
s3cmd ls
以列出所有儲存桶。由於您剛開始使用 S3,目前您還沒有擁有任何儲存桶。所以輸出將為空。
s3cmd mb s3://my-new-bucket-name
建立一個儲存桶如上所述,儲存桶名稱在 S3 的所有使用者中必須是唯一的。這意味著“test”或“asdf”等簡單名稱已被佔用,您必須編寫一些更新穎的名稱。為了示範盡可能多的功能,讓我們建立一個以 FQDN 命名的儲存桶s3://public.s3tools.org
:
$ s3cmd mb s3://public.s3tools.org
Bucket 's3://public.s3tools.org' created
s3cmd ls
再次列出您的儲存桶現在您應該看到新建立的儲存桶:
$ s3cmd ls
2009-01-28 12:34 s3://public.s3tools.org
$ s3cmd ls s3://public.s3tools.org
$
確實是空的。
$ s3cmd put some-file.xml s3://public.s3tools.org/somefile.xml
some-file.xml -> s3://public.s3tools.org/somefile.xml [1 of 1]
123456 of 123456 100% in 2s 51.75 kB/s done
將兩目錄樹上傳到儲存桶的虛擬「目錄」:
$ s3cmd put --recursive dir1 dir2 s3://public.s3tools.org/somewhere/
File 'dir1/file1-1.txt' stored as 's3://public.s3tools.org/somewhere/dir1/file1-1.txt' [1 of 5]
File 'dir1/file1-2.txt' stored as 's3://public.s3tools.org/somewhere/dir1/file1-2.txt' [2 of 5]
File 'dir1/file1-3.log' stored as 's3://public.s3tools.org/somewhere/dir1/file1-3.log' [3 of 5]
File 'dir2/file2-1.bin' stored as 's3://public.s3tools.org/somewhere/dir2/file2-1.bin' [4 of 5]
File 'dir2/file2-2.txt' stored as 's3://public.s3tools.org/somewhere/dir2/file2-2.txt' [5 of 5]
正如您所看到的,我們不必創建/somewhere
'目錄'。事實上,它只是一個檔案名稱前綴,而不是一個真正的目錄,並且不需要事先以任何方式建立。
除了使用put
和--recursive
選項之外,您還可以使用sync
命令:
$ s3cmd sync dir1 dir2 s3://public.s3tools.org/somewhere/
$ s3cmd ls s3://public.s3tools.org
DIR s3://public.s3tools.org/somewhere/
2009-02-10 05:10 123456 s3://public.s3tools.org/somefile.xml
使用 --recursive (或 -r)列出所有遠端檔案:
$ s3cmd ls --recursive s3://public.s3tools.org
2009-02-10 05:10 123456 s3://public.s3tools.org/somefile.xml
2009-02-10 05:13 18 s3://public.s3tools.org/somewhere/dir1/file1-1.txt
2009-02-10 05:13 8 s3://public.s3tools.org/somewhere/dir1/file1-2.txt
2009-02-10 05:13 16 s3://public.s3tools.org/somewhere/dir1/file1-3.log
2009-02-10 05:13 11 s3://public.s3tools.org/somewhere/dir2/file2-1.bin
2009-02-10 05:13 8 s3://public.s3tools.org/somewhere/dir2/file2-2.txt
$ s3cmd get s3://public.s3tools.org/somefile.xml some-file-2.xml
s3://public.s3tools.org/somefile.xml -> some-file-2.xml [1 of 1]
123456 of 123456 100% in 3s 35.75 kB/s done
$ md5sum some-file.xml some-file-2.xml
39bcb6992e461b269b95b3bda303addf some-file.xml
39bcb6992e461b269b95b3bda303addf some-file-2.xml
原始文件的校驗和與檢索到的文件之一相符。看起來有效:-)
若要從 S3 檢索整個“目錄樹”,請使用遞歸 get:
$ s3cmd get --recursive s3://public.s3tools.org/somewhere
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt saved as './somewhere/dir1/file1-1.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt saved as './somewhere/dir1/file1-2.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-3.log saved as './somewhere/dir1/file1-3.log'
File s3://public.s3tools.org/somewhere/dir2/file2-1.bin saved as './somewhere/dir2/file2-1.bin'
File s3://public.s3tools.org/somewhere/dir2/file2-2.txt saved as './somewhere/dir2/file2-2.txt'
由於未指定目標目錄, s3cmd
將目錄結構保存在目前工作目錄(“.”)中。
兩者之間有一個重要的區別:
get s3://public.s3tools.org/somewhere
和
get s3://public.s3tools.org/somewhere/
(注意末端的斜槓)
s3cmd
總是使用最後一個路徑部分,即最後一個斜杠之後的單字來命名檔案。
在s3://.../somewhere
的情況下,最後一個路徑部分是“somewhere”,因此遞歸 get 將本地文件命名為“somewhere/dir1”、“somewhere/dir2”等。
另一方面,在s3://.../somewhere/
中,最後一個路徑部分是空的,s3cmd 將只創建沒有 'somewhere/' 前綴的 'dir1' 和 'dir2':
$ s3cmd get --recursive s3://public.s3tools.org/somewhere/ ~/
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt saved as '~/dir1/file1-1.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt saved as '~/dir1/file1-2.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-3.log saved as '~/dir1/file1-3.log'
File s3://public.s3tools.org/somewhere/dir2/file2-1.bin saved as '~/dir2/file2-1.bin'
看?它是~/dir1
而不是上一個範例中的~/somewhere/dir1
。
刪除 s3://public.s3tools.org/somewhere/ 下的所有內容
$ s3cmd del --recursive s3://public.s3tools.org/somewhere/
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt deleted
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt deleted
...
現在嘗試刪除儲存桶:
$ s3cmd rb s3://public.s3tools.org
ERROR: S3 error: 409 (BucketNotEmpty): The bucket you tried to delete is not empty
哎呀,我們忘了s3://public.s3tools.org/somefile.xml
。無論如何,我們可以強制移除儲存桶:
$ s3cmd rb --force s3://public.s3tools.org/
WARNING: Bucket is not empty. Removing all the objects from it first. This may take some time...
File s3://public.s3tools.org/somefile.xml deleted
Bucket 's3://public.s3tools.org/' removed
基本用法如上一節所述簡單。
您可以使用-v
選項增加詳細程度,如果您真的很想知道程式在其引擎蓋下做什麼,請使用-d
運行它以查看所有“調試”輸出。
使用--configure
設定後,所有可用選項都會寫入~/.s3cfg
檔案中。它是一個文字文件,可以在您最喜歡的文字編輯器中進行修改。
即使物件失敗,傳輸命令(put、get、cp、mv 和sync)也會繼續傳輸。如果發生故障,則會將故障輸出到 stderr,且退出狀態將為 EX_PARTIAL (2)。如果指定了選項--stop-on-error
,或設定選項 stop_on_error 為 true,則傳輸停止並傳回適當的錯誤代碼。
有關更多信息,請參閱 S3cmd / S3tools 主頁。
版權所有 (C) 2007-2023 TGRMN Software (https://www.tgrmn.com)、Sodria SAS (https://www.sodria.com/) 和貢獻者
該程式是免費軟體;您可以根據自由軟體基金會發布的 GNU 通用公共授權的條款重新分發和/或修改它;許可證的版本 2,或(由您選擇)任何更高版本。
分發此程序的目的是希望它有用,但不提供任何保證;甚至沒有適銷性或特定用途適用性的默示保證。有關更多詳細信息,請參閱 GNU 通用公共許可證。