সিস্টেম অ্যাডমিনস, যারা লিনাক্স কম্পিউটার সবচেয়ে নিকট থেকে রান এবং ম্যানেজ করে, উনাদের কাছে সরাসরি অ্যাক্সেস থাকে সেই টুলসের যা আমাদের আরও এফিশিয়েন্টলি কাজ করতে সাহায্য করে। আপনি এই টুলসকে তাদের সর্বোচ্চ সুবিধার জন্য ব্যবহার করতে পারেন আপনার জীবন সহজ করতে, এই আর্টিকেল সিরিজ অটোমেশনের রূপে ব্যাশ শেল স্ক্রিপ্ট ব্যবহার করার কৌশল অন্বেষণ করে। এতে কভার করা হয়েছে:
- ব্যাশ শেল স্ক্রিপ্ট দিয়ে অটোমেশনের সুবিধা
- কেন শেল স্ক্রিপ্ট ব্যবহার করা সিস্টেম অ্যাডমিনের জন্য কম্পাইলড ভাষা যেমন C বা C++ চেয়ে बेटার চয়েস
- নতুন স্ক্রিপ্টের জন্য রিকোয়ারমেন্টের একটি সেট তৈরি করা
- কমান্ড-লাইন ইন্টারফেস (সিএলআই) প্রোগ্রাম থেকে সহজ ব্যাশ শেল স্ক্রিপ্ট তৈরি করা
- স্ক্রিপ্ট রান কর रहे ইউজার আইডি (UID) ব্যবহার করে সিকিউরিটি এনহ্যান্স করা
- লজিক্যাল কম্পারিজন টুলস ব্যবহার করে কমান্ড-লাইন প্রোগ্রাম এবং স্ক্রিপ্টের জন্য এক্সিকিউশন ফ্লো কন্ট্রোল প্রদান করা
- স্ক্রিপ্ট ফাংশনালিটি কন্ট্রোল করার জন্য কমান্ড-লাইন অপশন ব্যবহার করা
- ব্যাশ ফাংশন তৈরি করা যেগুলো একটি স্ক্রিপ্টের এক বা একাধিক লোকেশন থেকে কল করা যায়
- কেন এবং কীভাবে আপনার কোড ওপেন সোর্স হিসেবে লাইসেন্স করা উচিত
- একটি সহজ টেস্ট প্ল্যান তৈরি এবং ইমপ্লিমেন্ট করা
আমি আগে ব্যাশ কমান্ড এবং সিনট্যাক্স এবং কমান্ড লাইনে ব্যাশ প্রোগ্রাম তৈরি করার বিষয়ে একটি সিরিজ আর্টিকেল লিখেছিলাম, যেটি আপনি এই আর্টিকেলের শেষে রেফারেন্স সেকশনে পাবেন। কিন্তু এই চারটি আর্টিকেলের সিরিজ স্ক্রিপ্ট তৈরি করার বিষয়ে (এবং কিছু কৌশল যা আমি উপকারী মনে করি) ততটুকুই খুব ব্যাশ কমান্ড এবং সিনট্যাক্সের বিষয়ে।
কেন আমি শেল স্ক্রিপ্ট ব্যবহার করি
The Linux Philosophy for Sysadmins-এর অধ্যায় ৯-এ আমি লিখেছি:
"এক সিস্টেম অ্যাডমিন সবচেয়ে প্রোডাক্টিভ হন চিন্তা করার সময়—মৌজুदा সমস্যা কীভাবে সমাধান করবেন এবং ভবিষ্যতের সমস্যা কীভাবে এড়িয়ে যাবেন সেটি চিন্তা করুন; লিনাক্স কম্পিউটার মনিটর করার বিষয়ে চিন্তা করুন যাতে সেই ভবিষ্যতের সমস্যাগুলো পূর্বাভাস দেয় এমন ক্লুগুলো খুঁজে বের করা যায়; চিন্তা করুন কীভাবে আপনার জব আরও এফিশিয়েন্ট করা যায়; চিন্তা করুন কীভাবে সেই সকল টাস্ক অটোমেট করা যায় যেগুলো করা উচিত যেন সেগুলো প্রতিদিন হোক বা বছরে একবার।
"সিস্টেম অ্যাডমিনগুলি তারপর সবচেয়ে প্রোডাক্টিভ হন শেল প্রোগ্রাম তৈরি করার সময় যেগুলো সোলিউশন অটোমেট করে যেগুলো তারা কonceive করেছে অপ্রোডাক্টিভ দেখানোর সময়। আমাদের কাছে যত বেশি অটোমেশন থাকে, আপনাদের কাছে রিয়েল সমস্যা ফিক্স করার জন্য তত বেশি সময় থাকে যখন সেগুলো ঘটে এবং আরও বেশি অটোমেট করার বিষয়ে চিন্তা করার জন্য।"
এই প্রথম আর্টিকেল এক্সপ্লোর করে কেন শেল স্ক্রিপ্ট সিস্টেম অ্যাডমিনের জন্য একটি গুরুত্বপূর্ণ টুল এবং খুব সহজ একটি ব্যাশ স্ক্রিপ্ট তৈরির বেসিক্স।
কেন অটোমেট করবেন?
আপনি কি কখনো কমান্ড লাইনে একটি লম্বা এবং জটিল টাস্ক পারফর্ম করেছেন এবং চিন্তা করেছেন, "ভালো হয়ে গেলো। এখন আমাকে কখনোই এটা নিয়ে চিন্তা করতে হবে না!"? আমি—প্রায়শই। আমি চূড়ান্তে বুঝতে পারলাম যে কম্পিউটারে যা কিছুই আমাকে করতে হয় (চাড়া আমার বা একটি এমপ্লয়ার বা কনসাল্টিং কাস্টমারের принадлежа) ভবিষ্যতে কখনো আবার করতে হবে।
বেশ ভালো, আমি সবসময় মনে করি আমি মনে রাখব কীভাবে আমি টাস্কটি করেছি। কিন্তু, অনেক সময়, পরের বার যথেষ্ট দূরে ভবিষ্যতে হয় যে আমি ভুলে যাই আমি কখনো এটা করেছি, যেন কীভাবে করেছি সেটি তো দূরে। আমি কিছু টাস্কের জন্য প্রয়োজনীয় স্টেপগুলো কাগজের টুকরোতে লিখে রাখতে শুরু করলাম, তারপর চিন্তা করলাম, "আমি কত মূর্খ!" তাই আমি সেসব খোঁচা আমার কম্পিউটারের একটি সিম্পল নোটপ্যাড অ্যাপ্লিকেশনে ট্রান্সফার করলাম, যতক্ষণ এক দিন আমি আবার চিন্তা করলাম, "আমি কত মূর্খ!" আমি যদি এই ডেটা আমার কম্পিউটারে স্টোর করতে চাই, আমি মনে হয় একটি শেল স্ক্রিপ্ট তৈরি করব এবং এটিকে একটি স্ট্যান্ডার্ড লোকেশনে স্টোর করব, যেন /usr/local/bin বা ~/bin, যাতে আমি শুধু শেল প্রোগ্রামের নাম টাইপ করলেই সেটি সব টাস্ক করবে যেগুলো আমি ম্যানুয়ালি করতে হতাম।
আমার জন্য, অটোমেশন এখনো মানে যে আমাকে মনে রাখতে হয় না বা রিক্রিয়েট করতে হয় না কীভাবে আমি টাস্কটি পারফর্ম করেছিলাম আবার করতে। জিনিসগুলো মনে রাখতে এবং সকল কমান্ড টাইপ ইন করতে সময় লাগে। এটি বড় টাস্কের জন্য যেগুলো লম্বা কমান্ডের বড় সংখ্যা টাইপ করতে হয় সেগুলোর জন্য একটি সিগনিফিক্যান্ট টাইম সিংক হতে পারে। শেল স্ক্রিপ্ট তৈরি করে টাস্ক অটোমেট করলে রুটিন টাস্ক পারফর্ম করতে প্রয়োজনীয় টাইপিং কমে।
শেল স্ক্রিপ্ট
শেল প্রোগ্রাম—যাকে স্ক্রিপ্টও বলা হয়—লিখা আমার টাইম লিভারেজ করার সেরা স্ট্র্যাটেজি। একবার আমি একটি শেল প্রোগ্রাম লিখলে, আমি এটিকে যেনাবার রান করতে পারি। আমি আমার শেল স্ক্রিপ্টগুলো আপডেটও করতে পারি লিনাক্সের এক রিলিজ থেকে অন্য রিলিজে পরিবর্তন কম্পেনসেট করার জন্য, নতুন হার্ডওয়্যার এবং সফটওয়্যার ইনস্টল করা, স্ক্রিপ্টের সাথে যা আমি চাই বা যা প্রয়োজন সেটি পরিবর্তন করা, নতুন ফাংশন যোগ করা, যা দরকার নেই সেসব ফাংশন রিমুভ করা, এবং আমার স্ক্রিপ্টের নট-সো-র্যার বাগ ফিক্স করা। এই ধরনের পরিবর্তনগুলো যেকোনো টাইপের কোডের মেইনটেনেন্স সাইক্লের অংশ।
কীবোর্ডের মাধ্যমে একটি টার্মিনাল সেশনে শেল কমান্ড লিখে এবং এক্সিকিউট করে করা যেকোনো টাস্ক অটোমেট করা যাবে এবং করা উচিত। সিস্টেম অ্যাডমিনরা আমাদের যে সকল কাজ করতে বলা হয় বা আমরা ডিসাইড করি করতে হবে সেগুলো অটোমেট করা উচিত। অনেক সময়, অটোমেশন আপফ্রন্ট করলে আমার প্রথম বারের জন্যও সময় বাঁচায়।
একটি ব্যাশ স্ক্রিপ্টে কয়েকটি কমান্ড থেকে শুরু করে অনেক হাজার কমান্ড থাকতে পারে। আমি এক বা দুটি কমান্ডের ব্যাশ স্ক্রিপ্ট লিখেছি, এবং ২,৭০০ লাইনেরও বেশি একটি স্ক্রিপ্ট লিখেছি, যার অর্ধেকেরও বেশি কমেন্ট।
শুরু করা
এখানে একটি শেল স্ক্রিপ্ট এবং কীভাবে সেটি তৈরি করতে হয় তার একটি তুচ্ছ উদাহরণ। আমার আগের সিরিজে ব্যাশ কমান্ড-লাইন প্রোগ্রামিং-এ, আমি প্রায় সকল প্রোগ্রামিং বইয়ের উদাহরণ ব্যবহার করেছিলাম: "Hello world." কমান্ড লাইন থেকে, এটা এরকম দেখে:
[student@testvm1 ~]$ echo "Hello world"
Hello world
ডেফিনিশন অনুযায়ী, একটি প্রোগ্রাম বা শেল স্ক্রিপ্ট হল কম্পিউটার এক্সিকিউট করার জন্য ইনস্ট্রাকশনের একটি সিকোয়েন্স। কিন্তু প্রতিবার কমান্ড লাইনে সেগুলো টাইপ ইন করা খুব monotonous, বিশেষ করে যখন প্রোগ্রামগুলো লম্বা এবং কমপ্লেক্স। সেগুলো একটি ফাইলে স্টোর করা যেটি একটি একক কমান্ড দিয়ে এক্সিকিউট করা যায় সময় বাঁচায় এবং এরর 크립 ইন করার সম্ভাবনা কমায়।
আমি রিকমেন্ড করি নিচের উদাহরণগুলো একটি নন-রুট ইউজার হিসেবে একটি টেস্ট সিস্টেম বা ভার্চুয়াল মেশিন (VM)-এ ট্রাই করার জন্য। যদিও উদাহরণগুলো হาร์মলেস, মিস্টেক হয়, এবং সেফ থাকা সবসময় বুদ্ধিমানের কাজ।
প্রথম টাস্ক হল আপনার প্রোগ্রাম ধারণ করার একটি ফাইল তৈরি করা। touch কমান্ড ব্যবহার করে খালি ফাইল, hello, তৈরি করুন, তারপর এক্সিকিউটেবল বানান:
[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello
এখন, আপনার প্রিয় এডিটর ব্যবহার করে ফাইলে নিচের লাইনটি যোগ করুন:
echo "Hello world"
ফাইলটি সেভ করুন এবং কমান্ড লাইন থেকে রান করুন। আপনি এই সিরিজের স্ক্রিপ্টগুলো এক্সিকিউট করার জন্য একটি আলাদা শেল সেশন ব্যবহার করতে পারেন:
[student@testvm1 ~]$ ./hello
Hello world!
এটি সবচেয়ে সহজ ব্যাশ প্রোগ্রাম যা আপনি কখনো তৈরি করতে পারেন—একটি ফাইলে একটি একক স্টেটমেন্ট। এই এক্সারসাইজের জন্য, আপনার কমপ্লিট শেল স্ক্রিপ্ট এই সিম্পল ব্যাশ স্টেটমেন্টের চারদিকে বিল্ড হবে। প্রোগ্রামের ফাংশন এই উদ্দেশ্যে ইররিলেভ্যান্ট, এবং এই সিম্পল স্টেটমেন্ট আপনাকে একটি প্রোগ্রাম স্ট্রাকচার—অন্যান্য প্রোগ্রামের জন্য একটি টেমপ্লেট—বিল্ড করতে দেয় একটি কমপ্লেক্স ফাংশনাল প্রোগ্রামের লজিক নিয়ে চিন্তা না করে। আপনি বেসিক প্রোগ্রাম স্ট্রাকচার এবং আপনার টেমপ্লেট তৈরি করার উপর ফোকাস করতে পারেন খুব সহজে, এবং আপনি টেমপ্লেটটিই তৈরি এবং টেস্ট করতে পারেন বরং একটি কমপ্লেক্স ফাংশনাল প্রোগ্রাম।
শেব্যাং
একক স্টেটমেন্ট ঠিকঠাক কাজ করে যতক্ষণ আপনি ব্যাশ বা স্ক্রিপ্টে ব্যবহৃত কমান্ডের সাথে কম্প্যাটিবল একটি শেল ব্যবহার করেন। যদি স্ক্রিপ্টে কোনো শেল স্পেসিফাইড না থাকে, ডিফল্ট শেল ব্যবহার হবে স্ক্রিপ্ট কমান্ড এক্সিকিউট করার জন্য।
পরবর্তী টাস্ক হল নিশ্চিত করা যে স্ক্রিপ্টটি ব্যাশ শেল ব্যবহার করবে রান হওয়ার জন্য, এমনকি যদি অন্য শেল ডিফল্ট হয়। এটি শেব্যাং লাইন দিয়ে সম্পন্ন হয়। শেব্যাং হল #! ক্যারেক্টারের জন্য গیکی উপায় যা স্পষ্টভাবে স্পেসিফাই করে স্ক্রিপ্ট রান করার সময় কোন শেল ব্যবহার করতে হবে। এই কেসে, সেটি ব্যাশ, কিন্তু এটি অন্য যেকোনো শেল হতে পারে। যদি স্পেসিফাইড শেল ইনস্টলড না থাকে, স্ক্রিপ্টটি রান করবে না।
শেব্যাং লাইনটি স্ক্রিপ্টের প্রথম লাইন হিসেবে যোগ করুন, এখন সেটি এরকম দেখে:
#!/usr/bin/bash
echo "Hello world!"
স্ক্রিপ্টটি আবার রান করুন—ফলাফলে কোনো পার্থক্য দেখতে পাবেন না। আপনার যদি অন্যান্য শেল ইনস্টলড থাকে (যেন ksh, csh, tcsh, zsh, ইত্যাদি), একটি শুরু করুন এবং স্ক্রিপ্টটি আবার রান করুন।
স্ক্রিপ্ট বনাম কম্পাইলড প্রোগ্রাম
সবকিছু অটোমেট করার জন্য প্রোগ্রাম লিখার সময়, সিস্টেম অ্যাডমিনরা সবসময় শেল স্ক্রিপ্ট ব্যবহার করা উচিত। কারণ শেল স্ক্রিপ্ট ASCII টেক্সট ফরম্যাটে স্টোর থাকে, সেগুলো মানুষের দিয়ে ঠিক কম্পিউটারের মত সহজে ভিউ এবং মডিফাই করা যায়। আপনি একটি শেল প্রোগ্রাম এক্সামিন করতে পারেন এবং ঠিক কী করছে সেটি দেখতে পারেন এবং সিনট্যাক্স বা লজিকে কোনো ওভিয়াস এরর আছে কিনা সেটি দেখতে পারেন। এটি open হওয়ার কী মানে সেটির একটি শক্তিশালী উদাহরণ।
আমি কিছু ডেভেলপার জানি যারা শেল স্ক্রিপ্টকে "true" প্রোগ্রামিং থেকে কম মনে করে। শেল স্ক্রিপ্ট এবং যারা সেগুলো লিখে তাদের এই মার্জিনালাইজেশন হয়তো এই ধারণায় ভিত্তি করে যে একমাত্র "true" প্রোগ্রামিং ভাষা হলো যেটি সোর্স কোড থেকে কম্পাইল হয় এক্সিকিউটেবল কোড প্রডিউস করতে। আমি এক্সপেরিয়েন্স থেকে বলতে পারি এটি ক্যাটাগরিক্যালি অনসত্য।
আমি অনেক ভাষা ব্যবহার করেছি, যার মধ্যে BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (এবং এর কিছু ভ্যারিয়েশন, ইনক্লুডিং Object REXX), অনেক শেল ভাষা (ইনক্লুডিং কর্ন, csh এবং ব্যাশ), এবং এমনকি কিছু অ্যাসেম্বلی ভাষা। যে কম্পিউটার ভাষা কখনো ডিভাইস করা হয়েছে, সেগুলোর এক উদ্দেশ্য: মানুষকে কম্পিউটারকে কী করবে সেটি বলতে দাও। আপনি যখন একটি প্রোগ্রাম লিখেন, ভাষা যেকোনো হোক, আপনি কম্পিউটারকে নির্দিষ্ট কাজগুলো নির্দিষ্ট সিকোয়েন্সে করার ইনস্ট্রাকশন দিচ্ছেন।
স্ক্রিপ্ট কম্পাইলড ভাষার চেয়ে অনেক দ্রুত লিখা এবং টেস্ট করা যায়। প্রোগ্রাম সাধারণত দ্রুত লিখতে হয় পরিস্থিতি বা পয়েন্টি-হেয়ার্ড বস দ্বারা আরোপিত টাইম কনস্ট্রেইন্ট মিট করার জন্য। অধিকাংশ স্ক্রিপ্ট যা সিস্টেম অ্যাডমিন লিখে সেগুলো একটি সমস্যা ফিক্স করার জন্য, একটি সমস্যার পরિણাম পরিষ্কার করার জন্য, বা একটি প্রোগ্রাম ডেলিভার করার জন্য যা অবশ্যই অপারেশনাল হতে হবে অনেক আগে কম্পাইলড প্রোগ্রাম লিখা এবং টেস্ট করা সম্ভব হয়ে।
প্রোগ্রাম দ্রুত লিখতে হলে শেল প্রোগ্রামিং দরকার কারণ এটি কাস্টমারের চাহিদা—চাড়া তা আপনি কেউ অন্য হোক—দ্রুত রেসপন্স দিতে সক্ষম করে। যদি লজিক বা কোডে বাগ থাকে, সেগুলো প্রায় অবিলম্বে কোরেক্ট এবং রি-টেস্ট করা যায়। যদি আসল রিকোয়ারমেন্ট সেট ফ্লড বা ইনকমপ্লিট থাকে, শেল স্ক্রিপ্ট খুব দ্রুত পরিবর্তন করা যায় নতুন রিকোয়ারমেন্ট মিট করতে। জেনারেলি, সিস্টেম অ্যাডমিনের জবে ডেভেলপমেন্ট স্পিডের প্রয়োজন প্রোগ্রাম কতটুকু দ্রুত রান করবে বা সিস্টেম রিসোর্স যেমন RAM কতটুকু কম ব্যবহার করবে সেটির চেয়ে অপ্রাধান্য পায়।
সিস্টেম অ্যাডমিনরা যা করি সেগুলোর অধিকাংশ কীভাবে করবেন সেটি ফিগার আউট করতে বেশি সময় লাগে এক্সিকিউট করার চেয়ে। তাই, হয়তো সবকিছু করার জন্য শেল স্ক্রিপ্ট তৈরি করা কাউন্টারপ্রোডাক্টিভ মনে হয়। স্ক্রিপ্ট লিখে এবং সেগুলো টুলস বানাতে কিছু সময় লাগে যেগুলো রিপ্রডিউসিবল রেজাল্ট প্রডিউস করে এবং যতবার দরকার ততবার ব্যবহার করা যায়। টাইম সেভিংস আসে প্রতিবার আপনি স্ক্রিপ্টটি রান করতে পারেন ছাড়া কীভাবে টাস্কটি করবেন সেটি আবার ফিগার আউট করলে।
চূড়ান্ত চিন্তা
এই আর্টিকেলটি শেল স্ক্রিপ্ট তৈরি করার দিক থেকে আরও दूर যেনি, কিন্তু এটি একটি খুব ছোট একটি তৈরি করল। এটিও এক্সপ্লোর করল শেল স্ক্রিপ্ট তৈরির কারণগুলো এবং কেন সেগুলো সিস্টেম অ্যাডমিনের জন্য সবচেয়ে এফিশিয়েন্ট অপশন (কম্পাইলড প্রোগ্রামের চেয়ে)।
পরবর্তী আর্টিকেলে, আপনি একটি ব্যাশ স্ক্রিপ্ট টেমপ্লেট তৈরি করা শুরু করবেন যা অন্যান্য ব্যাশ স্ক্রিপ্টের জন্য একটি শুরুর বিন্দু হিসেবে ব্যবহার করা যাবে। টেমপ্লেটটি অবশেষে একটি Help ফ্যাসিলিটি, একটি GNU লাইসেন্সিং স্টেটমেন্ট, অনেক সহজ ফাংশন, এবং সেসব অপশন এবং অন্যান্য যা এই টেমপ্লেটের ওপর ভিত্তি করে তৈরি হওয়া স্ক্রিপ্টগুলোর জন্য দরকার হতে পারে সেগুলো ডিল করার কিছু লজিক ধারণ করবে।
রিসোর্স
- How to program with Bash: Syntax and tools
- How to program with Bash: Logical operators and shell expansions
- How to program with Bash: Loops
এই আর্টিকেল সিরিজটি আংশিকভাবে ডেভিড বথের তিন-খণ্ডের লিনাক্স সেলফ-স্টাডি কোর্স, Using and Administering Linux—Zero to SysAdmin-এর ভলিউম ২, অধ্যায় ১০-র ওপর ভিত্তি করে।