سؤال أزل خطًا معينًا من ملف Bash history


كيف يمكنني إزالة خط معين من historyقاعدة البيانات؟


130
2018-01-31 15:43


الأصل




الأجوبة:


تحتاج إلى تسجيل الخروج والعودة أو التشغيل history -a لذلك التاريخ الحالي ملتزم بالقرص.

ثم فقط قم بتحرير الملف ~/.bash_history.


97
2018-01-31 16:01



إذا تم تعيين متغير البيئة HISTFILE ، فإن ملف السجل ليس ~ / .bash_history ولكن بدلاً من $ {HISTFILE}. - Karolos
تتم كتابة الإدخالات في ملف السجل عند الخروج من shell. لذلك ، بعد إدخال أمر ترغب في إزالته ، يلزمك إما تسجيل الخروج والعودة ، أو استخدام "history -d xxxx" لإزالتها من جلسة shell الحالية. - harmic
ولكن كيف تحذف سجل تحرير ملف السجل؟ - chiliNUT
chiliNUT: ما عليك سوى بدء الأمر (على سبيل المثال ، vim ~/.bash_history) مع وجود مساحة أوامر تبدأ مع الفضاء عادة لا تحصل على تسجيل الدخول (انظر $HISTCONTROL). - cYrus
لا أعتقد أن هذا هو الحال في توزيعي ، ولكن بشكل عام هذا منطقي - chiliNUT


يمكنك تحقيق الإزالة من ملف السجل باستخدام سطر الأوامر في خطوتين:

  1. الكتابة history -d <line_number> حذف خط محدد من التاريخ في الذاكرة.
  2. الكتابة history -w يكتب التاريخ الحالي في الذاكرة إلى ~/.bash_history ملف.

الخطوات اثنين معاً إزالة الخط بشكل دائم من الذاكرة التاريخ ومن .bash_history الملف كذلك.


141
2018-01-31 16:09



كيفية حذف الماضي history -w من التاريخ؟ - KrIsHnA
KrIsHnA edit ~ / .bash_history يدويًا - Alexander Myshov
أو أضف مسافة قبله لمنع إضافته ، كما هو الحال في إجابة @ tao - Mark
لايجاد <line_number> مجرد history | grep [unwanted_content] للحصول على قائمة تحتوي على جميع الخطوط التي تحتوي عليها [unwanted_content] (مثل كلمات المرور). - AvL
كيف تحذف أسطر متعددة (محددة) (بواسطة المعرف)؟ - Pathros


إلى يحول دون أمر من إضافته إلى التاريخ في المقام الأول ، تأكد من أن متغير البيئة HISTCONTROL يحتوي على قيمها المفصولة بفواصل النقطتين ignorespaceعلى سبيل المثال (إضافة على سبيل المثال إلى .bashrc):

$ export HISTCONTROL=ignorespace

سيؤدي هذا إلى منع أي أمر به مسافة بادئة من إضافتها إلى السجل. يمكنك بعد ذلك مسح السجل بالكامل عن طريق التشغيل

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

37
2018-02-01 22:19





أولاً ، إذا كان الأمر الذي توشك على إصداره حساسًا أو غير آمن ، أو أنك لا تحتاج إلى ازدحام في تاريخك ، فمن الأفضل / الأسرع منعه من إدخال التاريخ في المقام الأول. تأكد من أن $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 مع محرر النص.


30
2018-06-18 16:33



"سيظل التلاعب بالسجل باستخدام الأوامر المذكورة أعلاه فقط ألحق المتبقي الجديد البنود إلى $HISTFILE، عند الخروجفي الواقع ، هذا ليس صحيحًا تمامًا. يبدو أن إلحاق عناصر جديدة متبقية فقط "تخرج" من طول التاريخ الأصلي. مثلا إذا أزلت 5 عناصر أصلية وأضفت 15 عنصرًا جديدًا ، فلن يتم إلحاق سوى آخر 10 عناصر جديدة ، بينما أتوقع أن يتم إلحاق جميع العناصر الجديدة البالغ عددها 15 عنصرًا جديدًا. أعتقد أن هذا خطأ لأنني لا أستطيع أن أرى كيف أن هذه وظيفة مرغوبة على الإطلاق. - James Haigh
أعتقد أن bash يحيط علما بالطول الأصلي. عند الإغلاق ، يُلحق بشكل افتراضي العناصر التي يكون رقمها أكبر من هذه القيمة. إذا تم decremented هذه القيمة في كل مرة يتم فيها حذف عنصر رقمه أقل من أو يساوي هذه القيمة ، فإنه يعمل كما هو متوقع. ؛-) - James Haigh


عدة تقنيات:

منع تخزين المعلومات الحساسة في ملف السجل

إذا كنت قد أدخلت بعض كلمات المرور في سطر الأوامر ، فعندئذٍ أدرك أنه تم تسجيل جميع الأوامر ، يمكنك إما:

  1. فرض الخروج من الجلسة الحالية دون حفظ المحفوظات:

     kill -9 $$
    

    هذا سوف يسقط كل التاريخ الحالي.

  2. نوع ↑ (سهم لأعلى) في جلسة bash المفتوحة حتى يتم عرض المعلومات الحساسة ، ثم استخدم ضغطات تحرير الخط مثل السيطرة+W لحذف المعلومات الحساسة ، و ثم  down (السهم لأسفل) حتى يتم طلب سطر فارغ جديد ، قبل الكتابة أدخل.

حذف المعلومات الحساسة من ملف السجل

إذا كنت تدرك أن المعلومات الحساسة مخزنة بالفعل ، وتريد حذفها ، ولكن ليس السجل بالكامل:

بسيط 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، لن يتعامل مع الملفات مع الخطوط الجديدة في أسمائها.


14
2017-07-19 12:50





حدد الخط الذي تريد حذفه بالضغط ↑ (سهم لأعلى) حتى تظهر ، ثم اضغط السيطرة+U. يجب أن يزيل الخط.

إذا كنت تستخدم history الأمر ، يمكنك رؤية تم استبدال الخط بعلامة النجمة.


10
2018-04-01 16:00



في الواقع ، أعتقد أنه يجب عليك الضغط على الخط ، اضغط على Ctrl + U ، ثم المؤشر لأعلى أو لأسفل إلى سطر آخر (ربما واحد فارغ في أسفل القائمة). أيضا ، بالمعنى الدقيق للكلمة ، لم يتم استبدال الخط بعلامة النجمة. بدلا من ذلك ، تم مسح الأمر ، و رقم السجل وقد تم إلحاق مع *. - G-Man
يصبح هذا أكثر قوة مع Ctrl + R (البحث عن التاريخ المتغير العكسي) ، على سبيل المثال. [نهاية] ، Ctrl + U - sehe


إذا كنت بحاجة إلى إزالة عدة أسطر في نفس الوقت ، فأنا عادةً ما استخدم هذا:

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

إذا كنت بحاجة إلى إزالة آخر أمر يمكنك استخدامه:

history -d $((HISTCMD-2))

4
2018-01-07 05:53



هذا بدا وكأنه يعمل ولكن history | grep <string> لا يزال يعرض جميع الخطوط التي ادعى حذفها ... - Brock Hensley
هذا سوف يحذف خطوط التاريخ الخطأ بعد حذف fisrt! - mivk
لكن لحسن الحظ ، فإنه يطبع فقط أوامر حذف خاطئ. سوف يقوم ما يلي بطباعة أوامر الحذف الصحيحة: history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}' - mivk


إذا كنت بحاجة إلى إزالة مجموعة من الأسطر من السجل ، فقد توفر لك وظيفة bash التالية بعض الوقت:

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. لاستخدام الوظيفة imediatelly ، ستحتاج إلى إعادة قراءة الملف مرة أخرى بواسطة shell الخاص بك (. $HOME/.bashrc). ثم لحذف مثل. الأوامر 200-210 من التاريخ:

$ histdel 200 210

(ملاحظة: هذا السؤال هو من بين أهم نتائج البحث إذا كنت تبحث عن حذف مجموعة من الأوامر من تاريخ bash. لذلك ، في حين أن ما سبق هو أكثر مما يطلبه السؤال ، قد يكون مفيدًا لبعض القراء.)


3
2017-10-26 14:09



أشكال بديلة لل for بيان: for n in $(seq "$2" "$1") يفضل من الناحية الفنية من قبل البعض ، و ، إذا seq لا يعمل ، حاول for ((n="$2"; n>="$1"; n--)). - Scott


history | sed -i 59d

59 هو رقم السطر. لا يمكن أن يكون أي شيء أحلى من هذا :)


3
2018-04-03 21:16





فقط جرب هذه ،

$ history

سيعرض هذا معرف التاريخ والأمر ، على سبيل المثال ،

.
  .
  211 ليرة سورية
  212 javac Welcome.java
  213 جافا الترحيب
  .
  .

استعمال،

$ history -d 211

هنا 211 هو معرف التاريخ. تحقق الآن من هذا باستخدام

$ history

.
  .
  211 javac Welcome.java
  212 جافا الترحيب
  .
  .


3
2018-03-04 11:16





أعلم أنه قد مر وقت طويل منذ طرح هذا السؤال والإجابة عليه ولكني سأوضح لك طريقتك لتنظيف ملف السجل الخاص بي وتسجيل الخروج في نفس الوقت.

انا اجري : history -w && nano "${HISTFILE}" && history -c && exit

ما يفعله بسيط:

  1. history -w : يكتب التاريخ المخبأ في الداخل "${HISTFILE}"
  2. nano "${HISTFILE}" : اسمحوا لي أن تحرير "${HISTFILE}" يمكنك استخدام برنامج نصي أو أي شيء تريد تنظيفه "${HISTFILE}"
  3. history -c : مسح محفوظات ذاكرة التخزين المؤقت حتى لا يتم إلحاق هذا الأمر الأخير.
  4. exit : تسجيل الخروج لإلحاقه بالتاريخ المخبأ ... ولكنه فارغ ؛)

بعد ذلك الأمر ، سيتم تسجيل خروجك باستخدام ملف محفوظات نظيف. تسجيل الدخول للتحقق من السجل الخاص بك ؛)

آمل أن يساعد هذا شخصًا ما.


2
2017-09-30 04:57