পাইথনে শেল কমান্ড কার্যকর করুন


65

আমি বর্তমানে অনুপ্রবেশ পরীক্ষা এবং পাইথন প্রোগ্রামিং অধ্যয়ন করছি । আমি কেবল জানতে চাই যে পাইথনে লিনাক্স কমান্ড কার্যকর করতে আমি কীভাবে যাব। আমি যে আদেশগুলি সম্পাদন করতে চাই তা হ'ল:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

যদি আমি কেবল printপাইথন ব্যবহার করি এবং এটি টার্মিনালে চালিত করি তবে এটি কি এটি সম্পাদন করার মতো হবে যে আপনি নিজে এটি টাইপ করছেন এবং টিপছেন Enter?


5
os.s systemm এটি করতে পারে।
fooot

2
এবং আমি ভেবেছিলাম bashএকটি ফুলে যাওয়া শেল ...
মাইক্রজারভ

3
মডিউলটি os.systemব্যবহারের জন্য ডক্সগুলি সুপারিশ করে subprocess
জর্দান 2 ই

আপনার কি iptables আউটপুট প্রয়োজন?
কিরা

3
এই প্রশ্নটি স্ট্যাকওভারফ্লোতে স্থানান্তরিত হওয়া উচিত।
www139

উত্তর:


106

আপনি এটির os.system()মতো ব্যবহার করতে পারেন :

import os
os.system('ls')

বা আপনার ক্ষেত্রে:

os.system('echo 1 > /proc/sys/net/ipv4/ip_forward')
os.system('iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080')

আরও ভাল, আপনি সাবপ্রসেসির কলটি ব্যবহার করতে পারেন এটি নিরাপদ, আরও শক্তিশালী এবং সম্ভবত দ্রুত:

from subprocess import call
call('echo "I like potatos"', shell=True)

বা, চালনার শেল ছাড়াই:

call(['echo', 'I like potatos'])

আপনি যদি আউটপুট ক্যাপচার করতে চান তবে এটি করার একটি উপায় এরকম:

import subprocess
cmd = ['echo', 'I like potatos']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

o, e = proc.communicate()

print('Output: ' + o.decode('ascii'))
print('Error: '  + e.decode('ascii'))
print('code: ' + str(proc.returncode))

আমি অত্যন্ত একটি সেটিং সুপারিশ timeoutমধ্যে communicate, এবং এছাড়াও ব্যতিক্রম আপনি যখন এটি কলিং পেতে পারেন ক্যাপচার। এটি একটি খুব ত্রুটি-প্রবণ কোড, সুতরাং আপনার ত্রুটি হওয়ার আশা করা উচিত এবং সেগুলি অনুযায়ী পরিচালনা করুন।

https://docs.python.org/3/library/subprocess.html


23
সংস্করণ ২.6 থেকে os.system অবচিত করা হয়েছে। সাবপ্রসেসটি সঠিকভাবে ব্যবহার করার জন্য মডিউল।
বাইনারিস্বেস্ট্রেট

@ বাইনারিসউবস্ট্রেট, অবহিত হিসাবে যেমন সমর্থিত নয় বা উপলব্ধ নেই? আমি সম্প্রতি মেশিনে ২.7 (পছন্দ অনুযায়ী নয়) নিয়ে os.systemকাজ করছি এবং এখনও কাজ করছি।
ওপেনওয়াক

1
এছাড়াও, যদি subprocess.callপ্রস্তাবিত হিসাবে ব্যবহার করা হয় তবে আপনাকে অবশ্যই উল্লেখ করার প্রয়োজন হতে পারে shell=True... এখানে দেখুন
ওপেনওনক

পাইথন ৩.৪ দিয়ে শেল = সত্যটি বর্ণনা করতে হবে অন্যথায় কল কমান্ড কাজ করবে না। ডিফল্টরূপে কল শেল = ট্রু সেট না হয়ে স্ট্রিং দ্বারা নির্দিষ্ট একটি ফাইল খোলার চেষ্টা করবে। এটি দেখে মনে হচ্ছে যে পাইথনে run.৩ কলটি রান দিয়ে প্রতিস্থাপিত হয়েছে
ডিএলএইচ

জেনেরিক পসিক্স কোডটি সম্ভবত পরিবেশ পরিবর্তনশীল decode()থেকে চরসেটের সাথে কল করা উচিত LC_CTYPE
মিক্কো রেন্টালাইনেন

29

প্রথম কমান্ড সহজভাবে একটি ফাইল লিখতে। আপনি শেল কমান্ড হিসাবে এটি কার্যকর করবেন না কারণ শেলের pythonসাহায্য ছাড়াই ফাইলগুলিতে পড়তে এবং লিখতে পারেন:

with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
    f.write("1")

iptablesকমান্ড কিছু বাহ্যিকভাবে চালানো চান হতে পারে। এটি করার সর্বোত্তম উপায় হ'ল সাবপ্রসেস মডিউলটি ব্যবহার করা ।

import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
                       'PREROUTING', '-p', 'tcp', 
                       '--destination-port', '80',
                       '-j', 'REDIRECT', '--to-port', '8080'])

নোট করুন যে এই পদ্ধতিতে শেলও ব্যবহার করা হয় না, যা অপ্রয়োজনীয় ওভারহেড।


13

দ্রুততম উপায়:

import os
os.system("your command here")

এটি সবচেয়ে নমনীয় পদ্ধতি নয়; যদি আপনার প্রক্রিয়াটির উপরে "একবারে এটি চালানো, সমাপ্তি, এবং এটি বেরিয়ে না আসা পর্যন্ত অবরুদ্ধ করা" এর চেয়ে বেশি নিয়ন্ত্রণের প্রয়োজন হয় তবে তার subprocessপরিবর্তে আপনার মডিউলটি ব্যবহার করা উচিত ।


8

একটি সাধারণ নিয়ম হিসাবে, আপনি যখনই সম্ভব অজগর বাঁধাই ব্যবহার করতে চান (অন্যান্য সুবিধার মধ্যে আরও ভাল ব্যতিক্রম ধরা catch)

জন্য echoকমান্ড, এটা সর্বজন বিদিত পাইথন ব্যবহার করতে যেমন @ jordanm এর উত্তরে প্রস্তাব ফাইলে লিখতে ভালো।

জন্য iptablesকমান্ড, হয়তো python-iptables( PyPi পৃষ্ঠা , বিবরণ এবং ডক সঙ্গে GitHub পৃষ্ঠা ) প্রদান করবে আপনার যা প্রয়োজন (আমি আপনার নির্দিষ্ট কমান্ড পরীক্ষা করা হয়নি)।

এটি আপনাকে একটি বাহ্যিক স্তরের উপর নির্ভর করবে, সুতরাং আপনাকে সুবিধাগুলি ওজন করতে হবে। সাবপ্রোসেস ব্যবহার করে কাজ করে তবে আপনি যদি আউটপুটটি ব্যবহার করতে চান তবে আপনাকে নিজেরাই পার্স করতে হবে এবং ভবিষ্যতের iptablesসংস্করণগুলিতে আউটপুট পরিবর্তনগুলি মোকাবেলা করতে হবে ।


আরেকটি বিষয় লক্ষণীয় যে subprocessকলগুলির সাথে ইউনিট পরীক্ষার কোডটি কম কার্যকর। হ্যাঁ, আপনি কলগুলি উপহাস করতে পারেন, তবে পরীক্ষাগুলি বহিরাগত কলগুলির ফলাফল সম্পর্কে অনুমান করা উচিত।
জর্দান 2 ই

আপনার উত্তর আরও পরামর্শ মত। ওপি বিশেষত জিজ্ঞাসা করেছে যে সে কীভাবে অজগর থেকে একটি লিনাক্স সিস্টেম কমান্ড চালাতে পারে।
কাপাড

@ কেপ্যাড হ্যাঁ, তবে তিনি কেন এটি করতে চেয়েছিলেন তাও তিনি নির্দিষ্ট করেছেন এবং আমি একটি বিকল্প প্রস্তাব করেছি।
জেরুম

2

আপনার শেলের একটি অজগর সংস্করণ। সাবধান, আমি এটি পরীক্ষা করিনি।

from subprocess import run

def bash(command):
        run(command.split())

>>> bash('find / -name null')
/dev/null
/sys/fs/selinux/null
/sys/devices/virtual/mem/null
/sys/class/mem/null
/usr/lib/kbd/consoletrans/null

0

আপনি যদি এসএসএইচের পরে অন্য কোনও সিস্টেমে এই কমান্ডটি কার্যকর করতে চান তবে আপনাকে প্যারামিকো নামের মডিউলটি ব্যবহার করতে হতে পারে। এটি সত্যিই দরকারী।

কমান্ডের প্রয়োগ যদি স্থানীয় মেশিন থেকে করতে হয় তবে ওএস মডিউল ফাংশন সহায়ক হবে।

হোমপেজ: https://www.paramiko.org/

বিকাশ: https://github.com/paramiko/paramiko

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.