bash_history: বিপজ্জনক আদেশগুলি মন্তব্য করুন: `#`


16

ব্যাশ ইতিহাসে "বিপজ্জনক" কমান্ডগুলি লগ করা রোধ করতে, আমি আমার .bashrcফাইলে নিম্নলিখিত লাইনটি যুক্ত করেছি :

HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'

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

history | grep Sep-28

আমি যা করতে চাই তা হ'ল "বিপজ্জনক" কমান্ডগুলিকেও লগ করা উচিত, তবে #লাইনের শুরুতে একটি রেখে দেওয়া, যাতে যদি আমি ইতিহাস থেকে ভুল করে কমান্ডটি কার্যকর করতে পারি তবে কোনও ক্ষতি হবে না।

এটি সম্ভব হলে আমার কোনও ধারণা নেই।

আপডেট এবং স্পষ্টকরণ:

এটি আমার জন্য সমস্যা হবার মূল কারণ হ'ল আমি সাধারণত বেশ কয়েকটি টার্মিনাল থেকে আমার মেশিনের সাথে সংযুক্ত থাকি এবং একটি টার্মিনালে চালিত কোনও কমান্ড তত্ক্ষণাত অন্যান্য টার্মিনালের ইতিহাসে পড়ে read এটি দ্বারা অর্জন করা হয়

PROMPT_COMMAND="history -a; history -c; history -r"

আসুন কল্পনা করুন আমার দুটি টার্মিনাল খোলা আছে। একটিতে আমার কিছু cat /dev/foo > file.outপ্রক্রিয়া চলছে। দ্বিতীয়টিতে, আমি অগ্রগতিটি পরীক্ষা করে দেখছি ls -lAhF। আমি lsটিপে Upএবং ENTER(এটি ইতিহাসের শেষ আদেশ) দ্বারা পুনরাবৃত্তি করতে থাকি । প্রথম কমান্ড শেষ হওয়ার সাথে সাথে ইতিহাস থেকে শেষ কমান্ড আর থাকবে না ls, তবে cat /dev/foo > file.out। আমি যদি সাবধান না হয়ে থাকি তবে আমি আবার বিড়াল শুরু করব এবং ফাইলআউট ওভাররাইট করব।

আমি যেটি অর্জন করতে চাই তা হ'ল বিড়ালের কমান্ডটি একটি এর আগে থাকবে #, যাতে এটি কার্যকর হয় না। তবে, আমি এখনও এটি ইতিহাসে দেখতে পাচ্ছি এবং এটিকে মন্তব্য না করে (যদি এটি দীর্ঘ নির্দেশ হয়) পুনরায় ব্যবহার করতে পারি।


আপনার কমান্ডটি ম্যানুয়ালি পুনরাবৃত্তি করার পরিবর্তে আপনি ব্যবহার করতে পারেন watch ls -lAhFবা while sleep 1; do ls -lAhf; done; ফাইলের আকার দেখার পরিবর্তে, আপনি pv /dev/foo > file.out( ivarch.com/program/pv.shtml ) ব্যবহার করতে পারেন ।
ডেলটাব

উত্তর:


9

আপনি যেমন কিছু করতে পারেন:

fixhist() {
   local cmd histnum
   cmd=$(HISTTIMEFORMAT=/ history 1)
   histnum=$((${cmd%%[*/]*}))
   cmd=${cmd#*/} # remove the histnum
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       history -s "#$cmd"    # add back with a #
   esac
}
PROMPT_COMMAND=fixhist

ধারণা করা হচ্ছে যে প্রতিটি প্রম্পট আগে, আমরা গত ইতিহাস এন্ট্রি (পরীক্ষা history 1) এবং যদি এটা এক বিপজ্জনক বেশী, আমরা তা (মুছতে history -d) এবং পুনরায় জুড়তে একটি সঙ্গে #সঙ্গে history -s

(স্পষ্টতই, আপনাকে আপনার HISTIGNOREসেটিংস অপসারণ করতে হবে )।

যে যদিও একটি অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া এটি গন্ধে পরিবর্তন হয় ইতিহাস সময়rm, mv... কমান্ড।

এটি ঠিক করার জন্য, একটি বিকল্প হতে পারে:

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       HISTFILE=/dev/stdin history -r <<EOF
#$time
#$cmd
EOF
   esac
}
PROMPT_COMMAND=fixhist

এবার আমরা শেষ ইতিহাসের সময়টি রেকর্ড করেছি এবং ইতিহাসের রেখাটি যুক্ত করতে আমরা history -rএকটি অস্থায়ী ফাইল (এখানে নথিটি) ব্যবহার করি যা টাইমস্ট্যাম্প অন্তর্ভুক্ত করে।

আপনি চান যে fixhistআপনার আগে এটি সম্পাদিত হবে history -a; history -c; history -r। দুর্ভাগ্যক্রমে, এর বর্তমান সংস্করণটিতে bashএকটি ত্রুটি রয়েছে history -aযা আমরা যুক্ত করেছি এমন অতিরিক্ত লাইনটি সংরক্ষণ করে না। চারপাশের কাজ এটি পরিবর্তে লিখতে হয়:

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (rm\ *|mv\ *|...)
       history -d "$histnum" # delete
       history -a
       [ -f "$HISTFILE" ] && printf '#%s\n' "$time" "$cmd" >> "$HISTFILE";;
     (*)
       history -a
   esac
   history -c
   history -r
}
PROMPT_COMMAND=fixhist

এটি হিটফিলকে মন্তব্য করার পরিবর্তে মন্তব্য করা কমান্ডটি যুক্ত করা history -a


আপনি কি দয়া করে ব্যাখ্যা করতে পারেন cmd=${cmd#*[0-9] }? আর ঠিক কোথায় আমি কি কারণ থাকতে fixhistআমার মধ্যে PROMPT_COMMAND? এই মুহুর্তে, এটি ইতিমধ্যে রয়েছেPROMPT_COMMAND="history -a; history -c; history -r"
মার্টিন ভেজিটার

এর ভূমিকা কী HISTTIMEFORMAT=/? আমি ইতিমধ্যে সেট করেছি export HISTTIMEFORMAT="%b-%d %H:%M "। যাইহোক, আমি যখন আপনার কোডটি আমার মধ্যে যুক্ত করি তখন $HOME/.bashrcকিছুই হয় না।
মার্টিন ভেজিটার

HISTTIMEFORMAT=/যেখানে কেবলমাত্র সেন্টিমিটার উত্তোলন করা সহজ historyan এমন আউটপুট পাওয়ার জন্য কেবলমাত্র 123 /rm xতার এই অনুরোধ। সেই প্রসঙ্গে bashযেখানে $HISTCMDবোগাস ছিল তার কয়েকটি সংস্করণে একটি সমস্যা ছিল, নতুন সংস্করণটি চেষ্টা করুন।
স্টাফেন চেজেলাস

এখনও কাজ করে না। আমি ভাবছি, কোডটিতে #কোডটি মন্তব্য হিসাবে কাজ করে না .bashrc?
মার্টিন ভেজিটার

1
@ মার্টিনভেগটার, হ্যাঁ, পরিবর্তিত ইতিহাস প্রবেশের জন্য, ইতিহাস নম্বর পরে bashএকটি সন্নিবেশ করান *যা প্রত্যাশিত ছিল না। এখনই ঠিক করা উচিত।
স্টাফেন চেজেলাস

11

আমি আপনার প্রশ্নের সঠিক উত্তর দিতে যাচ্ছি না, তবে সম্ভবত আপনাকে আপনার সমস্যার বিকল্প সমাধান দেব।

যদি আমি সঠিকভাবে বুঝতে পারি যে আপনি টাইপ করে যে ভুলগুলি করতে পারেন সে সম্পর্কে উদ্বিগ্ন, যেমন, !rmযদি rmইতিহাসের পূর্ববর্তী কমান্ডটি আপনি রাখতে চান এমন কিছু অপসারণ করে।

এই ক্ষেত্রে, একটি দুর্দান্ত বাশ বিকল্প histverify। যদি আপনি shopt -s histverifyএবং যদি আপনি ঠুং ঠুং শব্দ দিয়ে একটি কমান্ড প্রত্যাহার করেন তবে !এটি অবিলম্বে কার্যকর হবে না, তবে পঠন লাইনে লোড হবে যাতে আপনি এটি সম্পাদন করার সিদ্ধান্ত নিতে পারেন বা না এবং এটি আপনাকে সম্পাদনা করার সম্ভাবনাও দেয়।

এটি চেষ্টা করুন:

  • ছাড়া histverify:

    $ touch some_foo
    $ rm some_foo
    $ touch some_foo
    $ !rm
    rm some_foo
    $ # oooops in fact I'd've like to keep it this time
  • সহ histverify:

    $ shopt -s histverify
    $ touch some_foo
    $ rm some_foo
    $ touch some_foo
    $ !rm
    $ rm some_foo <cursor here>

    এক্ষেত্রে আপনার লাইনটির শেষে কার্সার থাকবে, এটি আবার চালু করতে - বা না - বা সম্পাদনা করার জন্য প্রস্তুত।

আপনি যদি এই বিকল্পটি পছন্দ করেন তবে এটি আপনার এ দিন .bashrc:

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