একটি কমান্ডের আউটপুট লুকানো হচ্ছে


31

আমার একটি স্ক্রিপ্ট রয়েছে যেখানে এটি কোনও প্যাকেজ ইনস্টল রয়েছে কিনা তা পরীক্ষা করে এবং 8080 বন্দরটি কোনও বিশেষ প্রক্রিয়া দ্বারা ব্যবহৃত হচ্ছে কিনা তা যাচাই করে। বাশ নিয়ে আমি মোটেও অভিজ্ঞ নই, তাই আমি এরকম কিছু করেছি:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

যাইহোক, যখন স্ক্রিপ্টটি কার্যকর করা হয় আমি টার্মিনালে dpkg -s net-toolsএবং netstat -tlpn | grep 8080 | grep javaআউটপুট উভয়ই পাই , এবং আমি তা চাই না, আমি কীভাবে আউটপুটটি আড়াল করব এবং এর ফলাফলের সাথে কীভাবে আটকে থাকব if?

এছাড়াও, আমি যা করছি তার করার কি আরও কি মার্জিত উপায় আছে? এবং কী প্রক্রিয়াটি 8080 বন্দরটি ব্যবহার করছে (এটি ব্যবহার করা হচ্ছে কেবল তা নয়) যদি আরও কোন উপায় জানার উপায় থাকে তবে তা কি?

উত্তর:


53

কোনো কমান্ড সাধারণত আউটপুট লুকানোর জন্য stdoutএবং stderrআপনাকে পুনঃনির্দেশিত করা হয় /dev/null

command > /dev/null 2>&1

ব্যাখ্যা:

1 command > /dev/null.: আউটপুট command(স্টাডাউট) থেকে /dev/null
2 এ 2>&1পুনঃনির্দেশ stderrকরে : এতে পুনর্নির্দেশ করে stdout, ত্রুটিগুলি (যদি থাকে) তেও যায়/dev/null

বিঃদ্রঃ

&>/dev/null: stdoutএবং উভয়ই পুনঃনির্দেশ stderrকরে /dev/null। এর বিকল্প হিসাবে এটি ব্যবহার করতে পারেন/dev/null 2>&1

নিরবgrep : grep -q "string"স্ট্যান্ডার্ডটি আউটপুটে কিছু না করে নীরবে বা নিঃশব্দে মেলে match এটি আউটপুট আড়াল করতেও ব্যবহার করা যেতে পারে।

আপনার ক্ষেত্রে, আপনি এটি ব্যবহার করতে পারেন,

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

এখানে কন্ডিশনগুলি আগের মতো যাচাই করা হবে তবে কোনও আউটপুট আসবে না।

মন্তব্যে জবাব দিন :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: এটি grep javaদ্বিতীয় পাইপের পরে উত্থাপিত আউটপুটটিকে পুনর্নির্দেশ করছে । কিন্তু আপনি যে বার্তা থেকে পাচ্ছেন netstat -tlpn। সমাধানটি দ্বিতীয় ifহিসাবে ব্যবহৃত হয়,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

1
আপনি উল্লেখ করতে পারেন grep -q, এবং &> ...প্রতিশব্দ হিসাবে নতুন ব্যাশ> ... 2>&1
স্টিল্ড্রাইভার

আপনাকে ধন্যবাদ, যে স্ক্রিপ্ট enhaced। তবে আমি এখনও একটি বার্তা পেয়েছি যে কিছু প্রক্রিয়া প্রদর্শিত হবে না যেহেতু এটি রুট হিসাবে চালানো হচ্ছে না। এর সাথেই ঘটে netstat। আমিও যে কোনও উপায়ে লুকিয়ে থাকতে পারি?
দাদাবাবা

1

lsof -i :<portnumnber> আপনি যা চান তার রেখা বরাবর কিছু করতে সক্ষম হওয়া উচিত।


দুঃখিত আমি পোস্টটিতে আসল প্রশ্নটি যুক্ত করতে ভুলে গেছি, এটি পরীক্ষা করে দেখুন দয়া করে আপনার উত্তরটি কেবল "মাধ্যমিক" প্রশ্নের জন্য
দাদাবা

কমান্ডের আউটপুট থেকে প্রক্রিয়া নাম / পিআইডি বের করতে পারার উপায় কি আছে?
দাদাবাবা

একই জিনিসটি করার আরেকটি উপায় fuser -n tcp 8080, যার আউটপুট পার্স করা সহজ হতে পারে easier
fkraiem

0

আউটপুটটি ফ্লাশ করার সময় /dev/nullসম্ভবত সবচেয়ে সহজ উপায়, কখনও কখনও /dev/nullফাইলের অনুমতি সেট থাকে যাতে নন-রুট সেখানে আউটপুটটি ফ্লাশ করতে না পারে। সুতরাং, এটি করার আর একটি অ-রুট উপায় হ'ল

command | grep -m 1 -o "abc" | grep -o "123"

এই ডাবল- grepসেটআপটি এর সাথে মিলে যাওয়া লাইনগুলি খুঁজে পায় abcএবং যেহেতু -oসেট করা হয় কেবলমাত্র abcমুদ্রিত হয় এবং কেবল একবার কারণে -m 1। তারপরে আউটপুট যা খালি হয় বা abcগ্রেপের কাছে প্রেরণ করা হয় কেবল স্ট্রিংয়ের অংশগুলি মেলে 123এবং শেষ কমান্ডটি কেবল abcখালি স্ট্রিংকেই ফিরে আসে। আশা করি এইটি কাজ করবে!

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