کتابخانه paramiko در پایتون
Paramiko یک کتابخانهی قدرتمند و محبوب برای کار با پروتکل SSH در پایتون است. این کتابخانه امکان برقراری ارتباط امن با سرورها، اجرای دستورات راه دور، انتقال فایل (SFTP)، و انجام عملیات پیشرفتهتر مانند باز کردن کانالهای سفارشی را فراهم میکند. Paramiko برای اسکریپتنویسی اتوماسیون، مدیریت سرورها و ابزارهای DevOps بسیار مفید است.
ویژگیهای کلیدی
- اجرای دستورات راه دور (exec_command)
- انتقال فایل از طریق SFTP
- احراز هویت با نامکاربری/رمز یا کلید خصوصی (RSA/ED25519)
- مدیریت host key و اعتبارسنجی کلید سرور
- دسترسی به سشنهای خام (Transport، Channel) برای کاربردهای پیشرفته
نصب و آمادهسازی
pip install paramikoبا این دستور، paramiko و وابستگیهای لازم نصب میشوند. پس از نصب میتوانید با import paramiko شروع کنید.
مثال پایه: اجرای دستور راه دور
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys() # بارگذاری known_hosts محلی
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # برای آزمایش؛ تولید امن نیست
client.connect('example.com', username='user', key_filename='/path/to/key')
stdin, stdout, stderr = client.exec_command('uname -a')
print(stdout.read().decode())
client.close()این کد یک شیء SSHClient ایجاد میکند، host keys محلی را بارگذاری میکند و در صورت نبودن کلیدِ میزبان، به صورت خودکار آن را اضافه میکند (نکته: AutoAddPolicy برای محیطهای تولید ریسک امنیتی دارد). سپس به سرور متصل شده و فرمانی را اجرا میکند و خروجی را چاپ میکند.
انتقال فایل با SFTP
import paramiko
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('example.com', username='user', password='secret')
sftp = ssh.open_sftp()
sftp.get('/remote/path/file.txt', 'local_file.txt') # دانلود
sftp.put('local_upload.txt', '/remote/path/local_upload.txt') # آپلود
sftp.close()
ssh.close()در این مثال یک اتصال SFTP باز میشود که متدهای get و put برای انتقال فایل بهکار میروند. پس از پایان کار حتماً sftp.close() و ssh.close() فراخوانی شود تا منابع آزاد شوند.
استفاده از کلید خصوصی و agent
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.RejectPolicy())
# استفاده از فایل کلید خصوصی
client.connect('example.com', username='user', key_filename='/home/user/.ssh/id_rsa', timeout=10)
# یا استفاده از SSH Agent
agent = paramiko.Agent()
keys = agent.get_keys()
if len(keys) > 0:
client.connect('example.com', username='user', pkey=keys[0])
client.close()در این قطعه کد نشان داده شده چگونه از فایل کلید خصوصی یا SSH Agent استفاده کنیم. توجه داشته باشید که در اینجا سیاست RejectPolicy برای جلوگیری از پذیرش خودکار کلید میزبان استفاده شده که امنیت بیشتری فراهم میکند.
اجرای دستورات با PTY (برای sudo)
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('example.com', username='user', password='password')
stdin, stdout, stderr = client.exec_command('sudo apt update', get_pty=True)
stdin.write('your_passwordn')
stdin.flush()
print(stdout.read().decode())
client.close()زمانی که فرمان نیاز به TTY دارد (مثلاً sudo)، باید پارامتر get_pty=True را ست کنید. سپس میتوانید رمز عبور را از طریق stdin ارسال کنید. این روش برای خودکارسازی دستوراتی که به TTY نیاز دارند مفید است.
مقایسه سریع: exec_command vs SFTP vs Transport
| قابلیت | exec_command | SFTP | Transport/Channel |
|---|---|---|---|
| اجرای فرمان | خوب | خیر | بستگی دارد (shell دستی) |
| انتقال فایل | محدود | مناسب | پیچیده |
| کنترل دقیق بایت/کانال | ندارد | ندارد | بله |
نکات امنیتی و بهترین شیوهها
- در محیط تولید هرگز از AutoAddPolicy استفاده نکنید؛ از load_system_host_keys() و مقایسه دستی fingerprint استفاده کنید.
- ترجیحاً از احراز هویت با کلید عمومی (Key-based) استفاده کنید و کلیدها را با passphrase محافظت نمایید.
- برای اتصالهای زیاد از مدیریت اتصال (re-use Transport) و pool کردن کانکشنها استفاده کنید تا overhead ایجاد نشود.
- time out مناسب و keepalive تعریف کنید تا اتصالهای معلق پایان یابند.
- سطح لاگینگ paramiko را در محیط توسعه بالا برده و در تولید فقط خطاها را ثبت کنید.
اشکالزدایی و لاگینگ
import logging
logging.basicConfig(level=logging.DEBUG)
paramiko_logger = logging.getLogger("paramiko")
paramiko_logger.setLevel(logging.DEBUG)با فعالسازی لاگینگ میتوانید خطاها و پیامهای داخلی paramiko را ببینید که برای عیبیابی اتصال و احراز هویت مفید است. در محیط تولید سطح لاگ را به INFO یا WARNING کاهش دهید.
موارد کاربرد و نکات پیشرفته
- اتوماسیون بکاپ و همگامسازی فایلها با SFTP
- اجرای دستورات مدیریتی روی دهها سرور در اسکریپتهای orchestration
- استفاده در ابزارهای CI/CD برای استقرار کد روی سرور
- در مواقعی که نیاز به عملکرد بالا یا non-blocking دارید، بررسی کتابخانههایی مانند asyncssh را مدنظر قرار دهید؛ paramiko بیشتر synchronous است.
خلاصه و جمعبندی
Paramiko یک ابزار استاندارد و قابل اعتماد برای کار با SSH در پایتون است که طیف وسیعی از نیازهای اتوماسیون و مدیریت سرور را پوشش میدهد. با رعایت نکات امنیتی، استفاده صحیح از کلیدها و مدیریت host keyها، Paramiko میتواند هستهی راهکارهای امن و خودکار شما در مدیریت سرورها باشد.
آیا این مطلب برای شما مفید بود ؟




