PP مستندات فضای ابری پارس‌پک
s3cmd 2.x · Python

s3cmd را یک بار تنظیم کنید

s3cmd برای کارهای روزمرهٔ S3 ابزار ساده‌ای است: اتصال در .s3cfg ثبت می‌شود و فایل‌ها با آدرس s3://bucket/key شناسایی می‌شوند. این راهنما ابتدا تنظیم درست برای یک سرویس غیر AWS را می‌سازد، بعد با یک فایل کوچک همهٔ مجوزهای لازم را می‌سنجد.

تنظیم یک‌بارهپنج عملیات اصلیخروجی نمونهLinux، macOS و Windows
اجرای s3cmd متصل به فضای ذخیره‌سازی ابری
یک فایل تنظیمات، پنج فرمان

فایل hello.txt روی سیستم شماست. آن را با نام tutorial/hello.txt در باکت خصوصی پارس‌پک می‌گذارید، وجودش را در فهرست چک می‌کنید، حجم و نوعش را بدون دانلود می‌خوانید، یک کپی روی دیسک خودتان می‌گیرید و در پایان از باکت برش می‌دارید.

مراحل را به‌ترتیب اجرا کنید. فرمان اول فقط اتصال را می‌سنجد؛ به همین دلیل، خطای Endpoint یا کلیدها با مشکل مسیر فایل قاطی نمی‌شود.

۱

روش نصب را براساس سیستم‌عامل انتخاب کنید

روی Linux و macOS، نصب با pipx ابزار را از Python سیستم جدا نگه می‌دارد. برای اجرای موقت هم می‌توانید از Docker استفاده کنید.

pipx انتخاب مناسبی است چون s3cmd را در محیطی جدا از Python سیستم نصب می‌کند. بستهٔ apt یا dnf هم قابل استفاده است، اما ممکن است از انتشار رسمی عقب‌تر باشد؛ پس بعد از نصب، نسخه را ببینید و مطمئن شوید تنظیم signature_v2 = False اعمال شده است.
Linux و macOS · نصب با pipx
pipx install s3cmd
s3cmd --version
macOS · نصب با Homebrew
brew install s3cmd
s3cmd --version
Windows · PowerShell با pip
py -m pip install --user s3cmd
s3cmd --version
اگر روی ویندوز بعد از نصب، s3cmd شناخته نشد، یعنی پوشهٔ Scripts پایتون در PATH نیست. مسیر نصب را با py -m pip show -f s3cmd ببینید و همان پوشه را به PATH اضافه کنید. مسیر فایل تنظیمات روی ویندوز %USERPROFILE%\.s3cfg است، نه ~/.s3cfg.
اگر اصلاً نمی‌خواهید چیزی روی سیستم نصب کنید، s3cmd را داخل یک کانتینر یک‌بارمصرف اجرا کنید. فایل تنظیمات و پوشهٔ کاری را با -v به کانتینر می‌دهید:
بدون نصب · Docker
docker run --rm -it \
  -v "$PWD":/work -w /work \
  python:3.12-slim \
  sh -c "pip install --quiet s3cmd && s3cmd --config=/work/.s3cfg ls s3://c123456"
!

حواستان باشد وقتی پوشهٔ کاری را به کانتینر می‌دهید، فایل .s3cfg با کلیدهای واقعی هم داخل همان پوشه است. آن پوشه را Commit نکنید.

۲

فایل .s3cfg را برای پارس‌پک بسازید

این فایل هم کلیدها را نگه می‌دارد و هم نحوهٔ ساخت URL و امضا را مشخص می‌کند؛ بنابراین فقط جایگزین‌کردن Access Key و Secret Key کافی نیست.

فرمان s3cmd --configure یک ویزارد تعاملی است و در پایان فایل ~/.s3cfg را می‌سازد. ولی ویزارد همهٔ گزینه‌های لازم برای یک فضای غیر-آمازون را نمی‌پرسد؛ ساده‌تر این است که فایل را مستقیم بنویسید. توجه کنید که host_base فقط نام میزبان است، بدون https:// — پروتکل جداگانه با use_https تعیین می‌شود.
~/.s3cfg
[default]
access_key = YOUR_ACCESS_KEY
secret_key = YOUR_SECRET_KEY
host_base = c123456.parspack.net
host_bucket = c123456.parspack.net
bucket_location = us-east-1
use_https = True
signature_v2 = False
مقدار host_bucket تعیین می‌کند s3cmd آدرس درخواست را چطور بسازد و مهم‌ترین سطر همین فایل است. اگر داخلش الگوی %(bucket)s نباشد — مثل نمونهٔ بالا — s3cmd نام باکت را در مسیر URL می‌گذارد (path-style)، یعنی https://c123456.parspack.net/نام-باکت/کلید. همین حالتی است که نمونهٔ rclone این مستندات هم استفاده می‌کند.
!

اگر فرمان‌ها خطای DNS یا NoSuchBucket دادند در حالی که نام باکت درست است، به احتمال زیاد باید حالت آدرس‌دهی را عوض کنید: host_bucket = %(bucket)s.c123456.parspack.net بگذارید تا s3cmd به virtual-host برگردد. یکی از این دو حالت روی هر فضای S3-سازگار جواب می‌دهد؛ اول path-style را امتحان کنید.

دو گزینهٔ دیگر که ارزش دانستن دارند: signature_v2 = False یعنی امضا با Signature V4 ساخته شود (پیش‌فرض نسخه‌های جدید، ولی نسخه‌های قدیمی V2 می‌ساختند)، و bucket_location همان Region است — برای امضا استفاده می‌شود، نه برای جغرافیا. مگر پنل چیز دیگری گفته باشد، us-east-1 بگذارید.
اگر نمی‌خواهید فایل را در ~/.s3cfg بگذارید، هر جای دیگری بسازیدش و مسیرش را به هر فرمان بدهید: s3cmd --config=./my.s3cfg .... اسکریپت نمونهٔ این صفحه، examples/s3cmd/run.sh، دقیقاً همین کار را می‌کند — یک فایل تنظیمات موقت از روی متغیرهای PARSPACK_S3_* می‌سازد و بعد از پایان کار پاکش می‌کند، پس فایل تنظیمات شخصی شما دست نمی‌خورد.
!

فایل .s3cfg کلید مخفی شما را به‌صورت متن ساده نگه می‌دارد. دسترسی‌اش را محدود کنید (chmod 600 ~/.s3cfg) و هیچ‌وقت Commit نکنید.

۳

فهرست Bucket را به‌عنوان تست اتصال بگیرید

s3cmd ls s3://c123456

این فرمان محتوای سطح بالای باکت را فهرست می‌کند و هنوز کاری با فایل شما ندارد. اگر Endpoint یا کلیدها اشتباه باشند، همین‌جا خطا می‌گیرید نه در آپلود. اگر باکت خالی است، خروجی خالی طبیعی است. برای فهرست خود باکت‌ها (نه محتوایشان) s3cmd ls را بدون آدرس بزنید.
terminal
s3cmd ls s3://c123456
خروجی نمونه
DIR s3://c123456/tutorial/
۴

آپلود: فایل را در باکت بگذارید

s3cmd put ./hello.txt s3://c123456/tutorial/hello.txt

اول فایل نمونه را بسازید، بعد آپلود کنید. دقت کنید که مقصد را با نام کامل فایل نوشته‌ایم. اگر مقصد را با / تمام کنید (یعنی s3://c123456/tutorial/)، s3cmd نام فایل محلی را زیر همان مسیر تکرار می‌کند — نتیجه همان می‌شود، ولی وقتی می‌خواهید نام داخل باکت با نام محلی فرق کند باید نام کامل را بنویسید.
terminal · ساخت فایل و آپلود
printf 'hello ParsPack\n' > hello.txt
s3cmd put ./hello.txt s3://c123456/tutorial/hello.txt
خروجی نمونه
upload: './hello.txt' -> 's3://c123456/tutorial/hello.txt' [1 of 1] 15 of 15 100% in 0s 0.12 kB/s done
!

اگر tutorial/hello.txt از قبل وجود داشته باشد، آپلود جدید بدون هیچ سؤالی رویش می‌نویسد؛ نسخهٔ جداگانه ساخته نمی‌شود.

نوع محتوابا --mime-type=text/plain مقدار Content-Type را خودتان تعیین کنید؛ وگرنه s3cmd از پسوند فایل حدس می‌زند.
پوشهٔ کاملs3cmd put --recursive ./dir/ s3://c123456/prefix/ کل یک پوشه را می‌فرستد.
فایل بزرگبالای ۱۵ مگابایت خودش Multipart می‌کند؛ آستانه را با --multipart-chunk-size-mb عوض کنید.
۵

فهرست فایل‌ها و مشخصات یک فایل

اول ببینید فایل در فهرست هست، بعد حجم و نوعش را بدون دانلود بخوانید.

فرمان ls روی یک مسیر که با / تمام می‌شود، فایل‌های همان سطح را نشان می‌دهد. اگر خروجی خالی بود، یا آپلود انجام نشده یا مسیر را اشتباه نوشته‌اید — این دو را با زدن ls روی یک سطح بالاتر از هم جدا کنید. برای دیدن همهٔ زیرمسیرها با هم --recursive اضافه کنید.
terminal · فهرست یک مسیر
s3cmd ls s3://c123456/tutorial/
خروجی نمونه
2026-08-18 10:00 15 s3://c123456/tutorial/hello.txt
برای مشخصات، info را با مسیر دقیق فایل بزنید. این فرمان یک درخواست HEAD می‌فرستد: خود فایل دانلود نمی‌شود، فقط حجم، نوع، ETag و مجوزها برمی‌گردند.
terminal · مشخصات یک فایل
s3cmd info s3://c123456/tutorial/hello.txt
خروجی نمونه
s3://c123456/tutorial/hello.txt (object): File size: 15 Last mod: Tue, 18 Aug 2026 10:00:00 GMT MIME type: text/plain Storage: STANDARD MD5 sum: 6f5902ac237024bdd0c176cb93063dc4
اسلش انتهامسیر با / یعنی «این سطح را فهرست کن»؛ بدون آن یعنی یک فایل دقیق.
MD5 برای فایل بزرگبرای فایل‌های Multipart، مقدار MD5 با هش فایل محلی برابر نیست و یک - و عدد بخش‌ها دارد.
خطای 404info روی کلیدی که وجود ندارد، خطای Key not found می‌دهد؛ خروجی خالی نمی‌دهد.
۶

دانلود: فایل را روی سیستم خودتان بنویسید

s3cmd get s3://c123456/tutorial/hello.txt ./downloads/hello.txt

برخلاف بیشتر ابزارها، s3cmd اگر فایل مقصد از قبل وجود داشته باشد رویش نمی‌نویسد و با خطا متوقف می‌شود. برای بازنویسی عمدی --force اضافه کنید. پوشهٔ مقصد باید از قبل وجود داشته باشد؛ s3cmd خودش نمی‌سازدش.
terminal
mkdir -p downloads
s3cmd get s3://c123456/tutorial/hello.txt ./downloads/hello.txt
خروجی نمونه
download: 's3://c123456/tutorial/hello.txt' -> './downloads/hello.txt' [1 of 1] 15 of 15 100% in 0s 0.30 kB/s done
۷

لینک امضاشده: فقط دانلود، آن هم با یک محدودیت

s3cmd signurl s3://c123456/tutorial/hello.txt +900

لینک امضاشده یک URL موقت است که تا زمان مشخصی بدون کلید API کار می‌کند — برای وقتی که می‌خواهید فایلی از باکت خصوصی را به کاربری بدهید بدون اینکه باکت را Public کنید. عدد بعد از + یعنی «از الان چند ثانیه»؛ می‌توانید یک timestamp مطلق هم بدهید.
terminal · لینک دانلود ۱۵ دقیقه‌ای
s3cmd signurl s3://c123456/tutorial/hello.txt +900
خروجی نمونه
http://c123456.parspack.net/c123456/tutorial/hello.txt?AWSAccessKeyId=YOUR_ACCESS_KEY&Expires=1755511800&Signature=Ab12Cd34...
!

دو نکته دربارهٔ همین یک خط: اول، AWSAccessKeyId و Signature به‌جای X-Amz-Signature — یعنی signurl همیشه با Signature V2 امضا می‌کند، حتی وقتی signature_v2 = False گذاشته‌اید. روی سرورهایی که فقط V4 را قبول می‌کنند این لینک با خطای امضا رد می‌شود. دوم، شِمای آدرس همیشه http:// است، حتی با use_https = True — این هم رفتار خود signurl است، نه اشتباه تنظیمات شما؛ روی Endpointـی مثل پارس‌پک که پورت ۸۰ باز نیست باید http:// را دستی به https:// عوض کنید (اسکریپت نمونهٔ این صفحه همین کار را خودکار انجام می‌دهد). اگر برنامه‌تان به لینک امضاشدهٔ مطمئن نیاز دارد، آن را با یکی از SDKها بسازید؛ بخش لینک امضاشده در صفحه S3 همین کار را در هشت زبان نشان می‌دهد.

لینک امضاشده برای آپلود (یعنی یک URL موقت که کاربر با متد PUT رویش فایل بفرستد) در s3cmd وجود ندارد. اگر چنین چیزی می‌خواهید، یا از mc استفاده کنید که هر دو نوع را می‌سازد، یا از SDK.
۸

حذف: نام را از باکت بردارید

s3cmd del s3://c123456/tutorial/hello.txt

del (یا هم‌معنی‌اش rm) دقیقاً همان یک کلید را حذف می‌کند. فایل روی سیستم شما دست نمی‌خورد. اگر کلید وجود نداشته باشد، s3cmd سکوت می‌کند و خطا نمی‌دهد.
terminal
s3cmd del s3://c123456/tutorial/hello.txt
خروجی نمونه
delete: 's3://c123456/tutorial/hello.txt'
!

پرچم --recursive را با احتیاط بزنید: s3cmd del --recursive s3://c123456/tutorial/ همهٔ فایل‌های زیر آن مسیر را پاک می‌کند و برگشتی ندارد. برای دیدن اینکه چه چیزی حذف می‌شود، اول همان فرمان را با --dry-run بزنید.

۹

خطا را دسته‌بندی کنید

اول فرمان فهرست Bucket را اجرا کنید. اگر آن هم خطا دارد، به جای بررسی فرمان فایل، Endpoint، روش آدرس‌دهی، Region و کلیدها را چک کنید.

برای دیدن اینکه واقعاً چه درخواستی رفته و سرور چه جوابی داده، --debug اضافه کنید. این پرچم هدرهای HTTP و رشتهٔ امضا را هم چاپ می‌کند — برای پیدا کردن مشکل امضا یا حالت آدرس‌دهی از همه مفیدتر است.
خطاعلت معمولبررسی
command not found: s3cmdنصب انجام نشده یا مسیر نصب در PATH نیستpipx list یا py -m pip show s3cmd
SignatureDoesNotMatchکلیدها اشتباه‌اند، یا نسخهٔ قدیمی s3cmd دارد V2 امضا می‌کندaccess_key، secret_key، و signature_v2 = False
NoSuchBucket یا خطای DNSنام باکت غلط است، یا حالت آدرس‌دهی اشتباه استhost_bucket را بین path-style و %(bucket)s. عوض کنید
AccessDeniedکلید به این باکت دسترسی نداردباکت را در پنل با همان کلید چک کنید
Key not foundکلید در باکت وجود ندارد یا املایش فرق دارداول s3cmd ls روی مسیر پدر
خطای مقصد در getفایل مقصد از قبل هست، یا پوشهٔ مقصد وجود ندارد--force اضافه کنید یا پوشه را با mkdir -p بسازید
Timeout / connection refusedEndpoint در دسترس نیستhost_base بدون https:// و بدون / انتها
۱۰

اجرای کامل همین سناریو

اگر خروجی هر فرمان شبیه نمونه‌های بالا بود، اتصال درست است و می‌توانید مسیرها را با فایل‌های واقعی خودتان عوض کنید.

terminal · از ابتدا تا انتها
pipx install s3cmd

cat > ~/.s3cfg <<'EOF'
[default]
access_key = YOUR_ACCESS_KEY
secret_key = YOUR_SECRET_KEY
host_base = c123456.parspack.net
host_bucket = c123456.parspack.net
bucket_location = us-east-1
use_https = True
signature_v2 = False
EOF
chmod 600 ~/.s3cfg

printf 'hello ParsPack\n' > hello.txt
mkdir -p downloads

s3cmd ls s3://c123456
s3cmd put ./hello.txt s3://c123456/tutorial/hello.txt
s3cmd ls s3://c123456/tutorial/
s3cmd info s3://c123456/tutorial/hello.txt
s3cmd get --force s3://c123456/tutorial/hello.txt ./downloads/hello.txt
s3cmd signurl s3://c123456/tutorial/hello.txt +900
s3cmd del s3://c123456/tutorial/hello.txt
اسکریپت نمونهٔ examples/s3cmd/run.sh همین کارها را با قرارداد مشترک همهٔ نمونه‌های این مستندات انجام می‌دهد: پنج متغیر PARSPACK_S3_* را از محیط می‌خواند، یک فایل تنظیمات موقت می‌سازد و بعد از پایان پاکش می‌کند.
terminal · اسکریپت نمونه
examples/s3cmd/run.sh upload ./hello.txt tutorial/hello.txt
examples/s3cmd/run.sh list tutorial/
examples/s3cmd/run.sh head tutorial/hello.txt
examples/s3cmd/run.sh download tutorial/hello.txt ./downloaded.txt
examples/s3cmd/run.sh presign-get tutorial/hello.txt 900
examples/s3cmd/run.sh delete tutorial/hello.txt
ساختار فایل‌ها
examples/
├── .env.example
└── s3cmd/
  └── run.sh      # آپلود، فهرست، مشخصات، دانلود، لینک امضاشده و حذف با s3cmd
ابزار دیگری می‌خواهید؟mc هر دو نوع لینک امضاشده را می‌سازد و AWS CLI را می‌شود بدون نصب داخل Docker اجرا کرد.