বাশ ইতিহাস ফাইল থেকে একটি নির্দিষ্ট লাইন সরান


144

আমি কীভাবে একটি নির্দিষ্ট লাইনটি historyডাটাবেস থেকে সরাতে পারি ?

উত্তর:


108

আপনাকে লগ আউট করতে হবে এবং ফিরে যেতে হবে বা চালাতে হবে history -aযাতে বর্তমান ইতিহাস ডিস্কের প্রতি প্রতিশ্রুতিবদ্ধ হয়।

তারপরে কেবল ফাইলটি সম্পাদনা করুন ~/.bash_history


19
যদি HISTFILE পরিবেশের পরিবর্তনশীল সেট করা থাকে তবে ইতিহাস ফাইলটি ~ / .bash_history নয় বরং $ IST HISTFILE}}
করলোস

20
শেলটি থেকে বেরিয়ে আসার পরে ইতিহাস ফাইলটিতে এন্ট্রি লেখা হয়। সুতরাং, আপনি মুছে ফেলতে চান এমন একটি কমান্ড প্রবেশ করার পরে, আপনাকে হয় লগ আউট এবং ফিরে প্রবেশ করতে হবে, বা বর্তমান শেল সেশন থেকে এগুলি সরাতে 'ইতিহাস -d xxxx' ব্যবহার করতে হবে।
ক্ষতিকারক

3
তবে আপনি কীভাবে ইতিহাসের ফাইল সম্পাদনার রেকর্ডটি মুছবেন?
মরিচ

5
@ চিলেনুট: আপনার কমান্ডটি (যেমন vim ~/.bash_history) একটি স্থান দিয়ে শুরু করুন ; একটি স্পেস দিয়ে শুরু হওয়া কমান্ডগুলি সাধারণত লগ হয় না (দেখুন $HISTCONTROL)।
cirus

আমি মনে করি না যে আমার বিতরণে
কেসটি স্থগিত

149

আপনি দুটি পদক্ষেপে কমান্ডলাইনটি ব্যবহার করে ইতিহাস ফাইল থেকে অপসারণ করতে পারবেন:

  1. টাইপিং history -d <line_number>মেমরিতে ইতিহাস থেকে একটি নির্দিষ্ট লাইন মুছে দেয়।
  2. টাইপিং ফাইলটিতে history -wবর্তমানের ইন-মেমোরি ইতিহাস লেখায় ~/.bash_history

দুটি পদক্ষেপ একসাথে মেমরির ইতিহাস এবং .bash_history ফাইল থেকে স্থায়ীভাবে লাইনটি সরিয়ে দেয় ।


7
কিভাবে history -wইতিহাস থেকে শেষ মুছবেন ?
KrIsHnA

@ ক্রিএসএনএএনএ ম্যানুয়ালি। / .বাশ_হিসটরি সম্পাদনা করুন
আলেকজান্ডার মাইশভ

5
অথবা এটি যুক্ত হতে আটকাতে তার আগে একটি স্থান যুক্ত করুন, যেমন @ টাওয়ের উত্তরে
মার্ক

জন্য <line_number>মাত্র history | grep [unwanted_content]সব লাইন সম্বলিত জানতে-- [unwanted_content](পাসওয়ার্ড মতো)।
এভিএল

আপনি একাধিক (নির্দিষ্ট) লাইনগুলি (আইডি দ্বারা) কীভাবে মুছবেন?
প্যাথ্রোস

39

করতে প্রতিরোধ প্রথম স্থানে ইতিহাস যোগ করা হচ্ছে থেকে একটি কমান্ড, নিশ্চিত করুন পরিবেশ পরিবর্তনশীল যে HISTCONTROLতার কোলন পৃথক মান মধ্যে মান রয়েছে ignorespace, উদাহরণ (যোগ উদাঃ করার .bashrc):

$ export HISTCONTROL=ignorespace

এটি ইতিহাসে শীর্ষস্থানীয় স্থান সহ কোনও কমান্ডকে আটকাবে। তারপরে আপনি চালিয়ে ইতিহাস পুরোপুরি সাফ করতে পারেন

$  history -c -w
  ^-- additional space character

32

প্রথমত, আপনি যে কমান্ডটি জারি করতে চলেছেন সেটি যদি সংবেদনশীল, অনিরাপদ, বা আপনার ইতিহাসকে বিশৃঙ্খলা করার দরকার নেই, তবে ইতিহাসে প্রথমে প্রবেশ করা থেকে বিরত রাখা সবচেয়ে ভাল / দ্রুততম। $HISTCONTROLএতে রয়েছে তা নিশ্চিত করুন ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

তারপরে আপনার ইতিহাসে কোনও কমান্ড চান না এমন একটি স্থান দিয়ে এগিয়ে যান:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

যদি আপনি দুর্ঘটনাক্রমে ইতিহাসে একটি অযাচিত কমান্ডটি রেখে দেন তবে আপনার ব্যাশ সেশনটি এখনও খোলা থাকে, কমান্ডটি এখনও ডিস্কটিকে স্পর্শ করেনি। ইতিহাসে পূর্ববর্তী কমান্ড মুছতে, ইস্যু করুন:

(bash)$  history -d $((HISTCMD-1))

নেতৃস্থানীয় স্থান নোট করুন; এই আদেশের প্রয়োজন ignorespace, অন্যথায় এটি কেবল নিজেকে মুছে ফেলবে!

আপনি যদি শেষ কয়েকটি আদেশটি মুছতে চান তবে সর্বশেষ এবং প্রথম ইতিহাস নম্বরটি সন্ধান করুন:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

এই ক্ষেত্রে 602 এবং 599. তারপর ইস্যু করুন:

(bash)$  for i in {602..599}; do history -d $i; done

(ছাড়া ignorespace, এটি 603..599 হবে))

আপনি যদি আপনার বর্তমান অধিবেশন থেকে কোনও ইতিহাস ডিস্কে আঘাত করতে চান না , তবে এটি ব্যবহার করে প্রস্থান করুন:

(bash)$ kill -9 $$

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

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

(bash)$  history -w

অবশ্যই ডিস্কে ইতিমধ্যে ইতিহাসের আইটেমগুলির জন্য, history -dকমান্ডগুলি জারি করে ইতিহাস সম্পাদনা করার বিকল্পটি কোনও পাঠ্য সম্পাদক দিয়ে history -wসম্পাদনা করা $HISTFILE


1
"উপরের কমান্ড দিয়ে ইতিহাস সাধিত মাত্র করবে সংযোজন অবশিষ্ট নতুন আইটেম $HISTFILE, প্রস্থানে ।" আসলে, এই ঠিক সত্য নয়। এটি কেবলমাত্র নতুন নতুন আইটেম সংযোজন করে যা মূল ইতিহাসের দৈর্ঘ্য থেকে 'আটকে যায়' out উদাহরণস্বরূপ, যদি আমি 5 টি মূল আইটেম সরিয়ে 15 টি নতুন যুক্ত করি তবে কেবল সর্বশেষ 10 টি নতুন যুক্ত করা হয়, তবে আমি 15 টি নতুন সংযোজন আশা করি। আমি মনে করি এটি একটি বাগ কারণ আমি দেখতে পাচ্ছি না যে এটি কীভাবে পছন্দসই কার্যকারিতা।
জেমস হাই হাই

1
আমার ধারণা বাশ আসল দৈর্ঘ্যের নোট নেয়। সেশন ক্লোজ করার সময় এটি সম্ভবত এমন আইটেম সংযোজন করে যার সংখ্যাটি এই মানের চেয়ে বেশি। যদি এই আইটেমটি প্রতিবার কোনও আইটেম মুছে ফেলা হয় তবে যার সংখ্যা এই মানের থেকে কম বা সমান, এটি প্রত্যাশার মতো কাজ করবে। ;-)
জেমস হাইগ

15

বিভিন্ন কৌশল:

ইতিহাসের ফাইলে সংবেদনশীল তথ্য সংরক্ষণ করা থেকে বিরত রাখুন

আপনি যদি একটি কমান্ড লাইনে কিছু পাসওয়ার্ড প্রবেশ করিয়েছেন, তবে বুঝতে পারেন যে সমস্ত কমান্ড লগড রয়েছে, আপনি হয়:

  1. ইতিহাস সংরক্ষণ না করে বর্তমান সেশন থেকে প্রস্থান করার জন্য জোর করে:

     kill -9 $$

    এটি সমস্ত বর্তমান ইতিহাস বাদ দেবে।

  2. ↑ (up arrow)সংবেদনশীল তথ্য না দেখানো পর্যন্ত খোলা বাশ সেশনে টাইপ করুন, তারপরে সংবেদনশীল তথ্য মুছে ফেলতে Ctrl+ এর মতো লাইন সম্পাদনা কীস্ট্রোকগুলি ব্যবহার করুন Wএবং তারপরে টাইপ করার আগে↓ (down arrow) কোনও নতুন খালি লাইন প্রম্প্ট না হওয়া পর্যন্ত ।Enter

ইতিহাস ফাইল থেকে সংবেদনশীল তথ্য মুছুন

আপনি যদি বুঝতে পারেন যে সংবেদনশীল তথ্য ইতিমধ্যে সঞ্চিত রয়েছে এবং আপনি এটি মুছতে চান তবে আপনার পুরো ইতিহাসটি নয়:

একটি সাধারণ sedকমান্ড কাজটি করতে পারে:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

তবে, আপনি এটি টাইপ করার সাথে সাথে আপনি মুছার চেষ্টা করছেন এমন অনুসন্ধানের প্যাটার্ন (সংবেদনশীল তথ্য) সম্বলিত আরেকটি ইতিহাসের লাইন তৈরি করুন। সুতরাং আপনি করতে পারেন:

sed -e "/$(head -n1)/d" -i .bash_history

এটি head -n1টার্মিনাল থেকে ইনপুট দিয়ে চলবে । এটি প্রদর্শিত হবে যে আপনার টার্মিনালটি স্তব্ধ হয়ে আছে (কোনও প্রম্পট হবে না); আপনি যে ফাইলটি মুছতে চান তা কেবল টাইপ করুন। কমান্ড লাইনে টাইপ না করে আপনাকে কোনও কমান্ড প্রবেশের (অংশের) কৌশল হিসাবে এই কৌশলটি ইতিহাস রেকর্ডে অন্তর্ভুক্তির জন্য অযোগ্য করে তোলে। তারপরে সংবেদনশীল তথ্য সম্বলিত সমস্ত লাইন sedঅনুসন্ধান .bash_historyএবং মুছতে আপনি যে পাঠ্যটি টাইপ করেছেন তা ব্যবহার করবে । দ্রষ্টব্য: যদি আপনার সংবেদনশীল তথ্য প্যাটার্নটিতে স্ল্যাশ (এস) থাকে তবে আপনাকে অবশ্যই তাদের ব্যাকস্ল্যাশ সহ এড়াতে হবে, sedনা হলে প্যাটার্নে উপস্থিত না এমন একটি ডিলিমিটার নির্দিষ্ট করতে এই বাক্য গঠনটি ব্যবহার করার জন্য আদেশটি পরিবর্তন করতে হবে:

sed -e "\|$(head -n1)|d" -i .bash_history

আর একটি উপায় হ'ল কেবল সংবেদনশীল তথ্য মুছে ফেলা, তবে তথ্য রয়েছে এমন কমান্ডগুলি রাখুন। এর জন্য, আপনি কেবল আপনার পছন্দের বিকল্প পাঠ্যের সাথে সংবেদনশীল তথ্য প্রতিস্থাপন করতে পারেন:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

একটি নির্দিষ্ট গাছের যে কোনও ফাইল থেকে সংবেদনশীল তথ্য মুছুন

অবশেষে, নিশ্চিত হয়ে নিন যে এটি আর একটি ভুলে যাওয়া ফাইলটিতে থাকবে না :

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

সমস্ত সম্পর্কিত ফাইল তালিকাভুক্ত করা হবে।

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

মূলযুক্ত ডিরেক্টরি ট্রিতে সমস্ত ফাইলের সংবেদনশীল তথ্যের সমস্ত উপস্থিতি প্রতিস্থাপন করবে .। দ্রষ্টব্য: যদিও এই কমান্ডটি ব্যবহার করে xargs -0, এটি তাদের নামে নতুন লাইনের সাথে ফাইলগুলি পরিচালনা করবে না।


11

আপনি যে লাইনটি মুছতে চান ↑ (up arrow)তা উপস্থিত না হওয়া অবধি টিপুন Ctrlএবং তারপরে + টিপুন U। যে লাইন অপসারণ করা উচিত।

আপনি যদি historyকমান্ডটি ব্যবহার করেন , আপনি দেখতে পাবেন যে লাইনটি একটি নক্ষত্রের সাথে প্রতিস্থাপিত হয়েছে।


2
আসলে, আমি বিশ্বাস করি যে আপনাকে অবশ্যই লাইন পর্যন্ত কার্সার করতে হবে, Ctrl + U টিপুন এবং তারপরে কার্সারটি উপরে বা নীচে অন্য লাইনে (সম্ভবত তালিকার নীচের অংশে ফাঁকা)। এছাড়াও, কঠোরভাবে বলতে গেলে, লাইনটি একটি নক্ষত্রের সাথে প্রতিস্থাপিত হয়নি। বরং, কমান্ডটি মুছে ফেলা হয়েছে, এবং ইতিহাস নম্বরটি a দিয়ে সংযুক্ত করা হয়েছে *
জি-ম্যান


4

আপনার যদি একই সাথে কয়েকটি লাইন সরিয়ে ফেলতে হয় তবে আমি সাধারণত এটি ব্যবহার করি:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

আপনার যদি শেষ আদেশটি সরিয়ে ফেলতে হয় তবে আপনি এটি ব্যবহার করতে পারেন:

history -d $((HISTCMD-2))

2
এটি দেখে মনে হচ্ছে এটি কাজ করেছে তবে history | grep <string>এটি মুছে ফেলার দাবি করে এমন সমস্ত লাইন দেখায় ...
ব্রক হেনসলে

1
এটি fisrt মুছে ফেলার পরে ভুল ইতিহাস লাইন মুছে ফেলবে !!
mivk

1
তবে ভাগ্যক্রমে, এটি কেবল ভুল মুছে ফেলা আদেশগুলি মুদ্রণ করে। নিম্নলিখিতগুলি মুছে ফেলা সঠিক কমান্ডগুলি মুদ্রণ করবে:history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
mivk

3

ইতিহাস থেকে যদি আপনার অনেকগুলি লাইন অপসারণের প্রয়োজন হয়, তবে নীচের ব্যাশ ফাংশনটি আপনাকে কিছুটা সময় বাঁচাতে পারে:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

ফাংশনটি সাধারণত যুক্ত করা উচিত $HOME/.bashrc। Ialiatelly ফাংশনটি ব্যবহার করতে, আপনার চলমান শেল ( . $HOME/.bashrc) দ্বারা ফাইলটি আবার পড়তে হবে । তারপরে ইতিহাস থেকে 200-210 উদাহরণস্বরূপ কমান্ড মুছতে:

$ histdel 200 210

(দ্রষ্টব্য: আপনি বাশ ইতিহাস থেকে বিভিন্ন কমান্ড মুছে ফেলার জন্য অনুসন্ধান করেন তবে এই প্রশ্নটি শীর্ষ অনুসন্ধানের ফলাফলগুলির মধ্যে So


3
forবিবৃতিটির বিকল্প ফর্মগুলি : for n in $(seq "$2" "$1")স্টাইলিস্টিকভাবে কিছু লোক পছন্দ করে এবং যদি seqকাজ না করে তবে চেষ্টা করুন for ((n="$2"; n>="$1"; n--))
স্কট

3
history | sed -i 59d

59 লাইন নম্বর। এর চেয়ে মিষ্টি আর কিছু হতে পারে না :)


3

এই চেষ্টা করুন,

$ history

এটি ইতিহাস এবং কমান্ডের আইডি প্রদর্শন করবে, যেমন



211 ls
212 javac
স্বাগতম
। জাভা 213 জাভা স্বাগতম ।

ব্যবহার করেন,

$ history -d 211

এখানে 211 ইতিহাসের আইডি। এখন এটি ব্যবহার করে পরীক্ষা করুন

$ history



211 জাভাক
স্বাগতম
। জাভা 212 জাভা স্বাগতম ।


2

আমি জানি যে দীর্ঘদিন হয়েছে এই প্রশ্নটি জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে তবে আমি আপনাকে আমার ইতিহাস ফাইলটি পরিষ্কার করার এবং একই সাথে লগ আউট করার জন্য আমার পদ্ধতিটি দেখাব।

আমি দৌড়াই : history -w && nano "${HISTFILE}" && history -c && exit

এটি যা সহজ তা:

  1. history -w : ভিতরে ক্যাশেড ইতিহাস লেখেন "${HISTFILE}"
  2. nano "${HISTFILE}": আমাকে সম্পাদনা করার অনুমতি দিন আপনি "${HISTFILE}"একটি সিড স্ক্রিপ্ট বা যা আপনার পরিষ্কার করতে চান তা ব্যবহার করতে পারেন"${HISTFILE}"
  3. history -c : ক্যাশেড ইতিহাস সাফ করুন যাতে এই শেষ আদেশটি যুক্ত করা হয় না।
  4. exit : আমাকে ক্যাশেড ইতিহাস যুক্ত করার জন্য লগ আউট করুন ... তবে এটি খালি;)

এই আদেশের পরে, আপনি একটি পরিষ্কার ইতিহাস ফাইল দিয়ে লগ আউট হবেন। আপনার ইতিহাস চেক করতে লগ ইন করুন;)

আমি আশা করি এটি কারও সাহায্য করবে।


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