শেল কমান্ডের আউটপুটটি কেবল সাফল্যেই লুকিয়ে রাখবেন?


12

শেল কমান্ডের আউটপুট আড়াল করার মধ্যে সাধারণত স্টডার এবং স্টডআউট পুনর্নির্দেশ জড়িত। ডিফল্টরূপে আউটপুটটি আড়াল করে তবে ত্রুটিতে সমস্ত জমা হওয়া আউটপুট ফেলে দেয় এমন কোনও বিল্টিন সুবিধা বা কমান্ড রয়েছে? আমি এটিকে রিমোট sshকমান্ডের মোড়ক হিসাবে চালাতে চাই । এখন আমি সেগুলি পুনঃনির্দেশ ব্যবহার করছি তবে কী কারণে তারা ব্যর্থ হয়েছে সে সম্পর্কে আমি কোনও ধারণা পাই না এবং তারা কেবল খুব ভার্জোজ।

সম্পাদনা: শেষ পর্যন্ত আমি @ বেলমিনের উত্তরের উপর ভিত্তি করে নীচের টেম্পলেটটি তৈরি করেছি যা আমি স্ক্রিপ্ট থেকে পূর্ববর্তী সমস্ত কমান্ড সংগ্রহ করতে, বর্তমান প্রক্রিয়া শনাক্তকারী ব্যবহার করে, স্বয়ংক্রিয়ভাবে লগটি সরিয়ে ফেলতে এবং একটি ব্যর্থতার সাথে ত্রুটিযুক্ত লাল ত্রুটি যুক্ত করেছি বার্তা যখন কিছু ভুল হয়ে যায়। এই টেমপ্লেটে প্রাথমিক silentমোড়কগুলি সফল হবে, তারপরে তৃতীয় আদেশটি ব্যর্থ হবে কারণ ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান রয়েছে:

#!/bin/sh

set -e

SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT

function report_and_exit {
    cat "${SILENT_LOG}";
    echo "\033[91mError running command.\033[39m"
    exit 1;
}

function silent {
    $* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}

silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2

2
আপনি যদি কেবল স্টডআউটকে পুনর্নির্দেশ করেন তবে স্ট্ডার এখনও প্রদর্শিত হবে; এটি কি আপনার পক্ষে যথেষ্ট, নাকি কোনও ত্রুটি থাকলে আপনি স্টাডাউটটিও দেখতে চান?
ক্রোমি

আমি উভয়ই দেখতে চাই তবে কেবল যদি কিছু ভুল হয়ে যায় তবে অন্যথায় আমি কিছু দেখতে চাই না।
গ্রেজগোর্জ অ্যাডাম হানকিউইচজ

2
আমি যা করি তা হ'ল লগফাইলে স্টডআউট এবং স্টার্ডার প্রিন্ট করা যাতে এটি স্ক্রিনটিকে বিশৃঙ্খলা না করে। আমি স্ট্রডারটি স্ক্রিনেও প্রিন্ট করি, তাই যদি ত্রুটি থাকে এবং আমি এটি দেখতে পারি। আমার যদি বিশদ প্রয়োজন হয় তবে আমি লগফাইলে যাচাই করতে পারি, যা প্রোগ্রাম আউটপুট এবং প্রসঙ্গে প্রোগ্রামের ত্রুটিগুলি অন্তর্ভুক্ত করে। এইভাবে, আমি উভয়ই দেখতে পাচ্ছি তবে কিছু ভুল হলেই '। এটা কি সাহায্য করে? দেখুন stackoverflow.com/questions/2871233/...
স্টিফান Lasiewski

1
স্ট্যাডার এবং স্টাডাউটকে দুটি পৃথক পুনঃনির্দেশের সাহায্যে পুনর্নির্দেশ করা নিরাপদ? আমি ভেবেছিলাম আমাদের সর্বদা ব্যবহার করা উচিত 2>&1, এরকম কিছু:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
psmith

উত্তর:


3

আমি এইভাবে একটি বাশ ফাংশন সেটআপ করব :

function suppress { /bin/rm --force /tmp/suppress.out 2> /dev/null; ${1+"$@"} > /tmp/suppress.out 2>&1 || cat /tmp/suppress.out; /bin/rm /tmp/suppress.out; }

তারপরে, আপনি কেবল কমান্ডটি চালাতে পারেন:

suppress foo -a bar

যে আক্রমণকারী আপনার সিস্টেমে অ-রুট অ্যাক্সেস রয়েছে, সে rm এবং কমান্ড কলের মধ্যে একটি সিমিলিঙ্ক তৈরি করার চেষ্টা করতে পারে, যা /etc/passswdঅন্য কোনও সমালোচনামূলক ফাইলকে নির্দেশ করবে এবং সামগ্রীগুলি ওভাররাইট করা হবে।
মিটার

1
বিটিডাব্লু, উপরের পুনঃনির্দেশগুলির ক্রমটি হওয়া উচিত: $* > /tmp/surpress.out 2>&1এটি স্ট্যাডারকে সত্যই ক্যাপচার করে।
মিতার

2
$*স্বেচ্ছাসেবক ইনপুট হ্যান্ডেল করার জন্য সেরা নয়। বিশেষত যখন এটিতে স্পেস বা পতাকা থাকে। সর্বাধিক পোর্টেবল হয় ${1+"$@"}অনুযায়ী stackoverflow.com/questions/743454/...
balrok

উভয় মতামত প্রতি সংশোধিত। ধন্যবাদ --- ভাল তথ্য।
বেলমিন ফার্নান্দেজ


7

এই উদ্দেশ্যে স্ক্রিপ্ট লিখতে যথেষ্ট সহজ হওয়া উচিত।

এটি সম্পূর্ণরূপে অনির্ধারিত স্ক্রিপ্টের মতো।

OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
    cat $OUTPUT
    exit 1
fi
rm $OUTPUT

অন্যদিকে কমান্ডগুলির জন্য আমি একটি স্ক্রিপ্টের অংশ হিসাবে চালিত করি আমি সাধারণত সমস্ত আউটপুট মুদ্রণের চেয়ে আরও ভাল কিছু চাই। আমি প্রায়শই যা দেখি তা অজানাতে সীমাবদ্ধ রাখি। এক দশক আগে আমি যে কিছু পড়েছিলাম তার থেকে আমি এখানে রূপ নিয়েছি script

#!/bin/bash

the_command 2>&1 | awk '
BEGIN \
{
  # Initialize our error-detection flag.
  ErrorDetected = 0
}
# Following are regex that will simply skip all lines
# which are good and we never want to see
/ Added UserList source/ || \
/ Added User/ || \
/ init domainlist / || \
/ init iplist / || \
/ init urllist / || \
/ loading dbfile / || \
/^$/ {next} # Uninteresting message.  Skip it.

# Following are lines that we good and we always want to see
/ INFO: ready for requests / \
{
  print "  " $0 # Expected message we want to see.
  next
}

# any remaining lines are unexpected, and probably error messages.  These will be printed out and highlighted.
{
  print "->" $0 # Unexpected message.  Print it
  ErrorDetected=1
}

END \
{
  if (ErrorDetected == 1) {
    print "Unexpected messages (\"->\") detected in execution."
    exit 2
  }
}
'
exit $?

5

আমি মনে করি না এটি করার একটি পরিষ্কার উপায় আছে, আমি কেবল ভাবতে পারি

  • কমান্ডের আউটপুট ক্যাপচার করুন।
  • কমান্ডের রিটার্ন মানটি পরীক্ষা করুন এবং যদি এটি ব্যর্থ হয়
    • ক্যাপচার আউটপুট প্রদর্শন করুন।

এটি কার্যকর করা একটি আকর্ষণীয় প্রকল্প হতে পারে তবে সম্ভবত প্রশ্নোত্তর ছাড়িয়ে।


একটি ফাংশন সঙ্গে doable করা উচিত। এইচএম, আমাকে একবার চেষ্টা করে দেখুন
বেলমিন ফার্নান্দেজ

1

কিছু সংক্ষেপে যাচ্ছে tehcommand &>/tmp/$$ || cat /tmp/$$

আপনি কতটা ব্যবহারযোগ্যতা / টাইপিং / প্রয়োজন চান তা নির্ভর করে। (উদাহরণস্বরূপ এটি পাইপ হিসাবে ব্যবহার করা বা তর্ক দ্বারা আদেশটি পাস করা)

@ জোরডাচে শর্ট স্ক্রিপ্টটি মূলত এটির জন্য একটি প্রোটো-মোড়ক যা আরও দৃ rob়তা দেয়, সামঞ্জস্য হ্যান্ডেল দেয় ইত্যাদি etc


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