ดำเนินการคำสั่งโดยไม่เก็บไว้ในประวัติ [ปิด]


203

ฉันต้องการรันคำสั่งบางอย่าง แต่ไม่ต้องการเก็บไว้ในประวัติคำสั่ง เพื่อให้ไม่มีใครสามารถค้นหาได้ใน.bash_historyไฟล์

มีวิธีการรันคำสั่ง bash ด้วยวิธีนี้หรือไม่?


13
คำถามนี้อาจถูกย้ายไปที่ ServerFault เนื่องจากไม่ใช่ "การเขียนโปรแกรม" มากเท่ากับ "ผู้ดูแลเซิร์ฟเวอร์" - แต่ขอบคุณสำหรับคำถาม / คำตอบสิ่งที่ฉันต้องการ!
Andrew Theken

คำตอบ:


294

เริ่มต้นคำสั่งของคุณด้วยช่องว่างและมันจะไม่รวมอยู่ในประวัติศาสตร์

โปรดระวังว่าสิ่งนี้จะต้อง$HISTCONTROLตั้งค่าตัวแปรสภาพแวดล้อม

  • ตรวจสอบว่าคำสั่งต่อไปนี้กลับมาignorespaceหรือ ignoreboth

    #> echo $HISTCONTROL
  • หากต้องการเพิ่มตัวแปรสภาพแวดล้อมหากขาดหายไปสามารถเพิ่มบรรทัดต่อไปนี้ลงในโปรไฟล์ทุบตี เช่น%HOME/.bashrc

    export HISTCONTROL=ignorespace

หลังจากหาโปรไฟล์คำสั่งที่ขึ้นต้นด้วยช่องว่างอีกครั้งจะไม่ถูกเขียนไป $HISTFILE


20
สิ่งนี้ใช้ไม่ได้หากไม่รวมการไม่ตอบสนองใน $ HISTCONTROL - แม้ว่านี่อาจเป็นค่าเริ่มต้นในระบบส่วนใหญ่
pgl

2
แก้ไข. สำหรับรายละเอียดเพิ่มเติม OP ควรดู HISTCONTROL และ HISTIGNORE ในหน้า bash man
u-punkt

2
thegeekstuff.com/2008/08/... - เคล็ดลับประวัติทุบตีเพิ่มเติมมีอยู่ที่นี่รวมทั้งวิธีการนี้มาจากที่ซ่อนคำสั่งจากประวัติศาสตร์
user379997

52

ในเซสชัน Bash ใด ๆ ให้ตั้งค่าไฟล์ประวัติเป็น / dev / null โดยพิมพ์:

export HISTFILE=/dev/null

โปรดทราบว่าตามที่ระบุไว้ในความคิดเห็นสิ่งนี้จะไม่เขียนคำสั่งใด ๆ ในเซสชันนั้นไปยังประวัติ!

โปรดอย่ายุ่งกับการทำงานหนักของผู้ดูแลระบบโปรด;)

โซลูชันของ Doodadนั้นสง่างามยิ่งกว่า เพียงแค่ยกเลิกการตั้งค่าตัวแปร: unset HISTFILE(ขอบคุณ!)


5
นี่จะป้องกันไม่ให้คำสั่งทั้งหมดถูกบันทึก ไม่ใช่สิ่งที่ผู้ถามต้องการ
Noufal Ibrahim

12
สิ่งนี้ทำให้เกิดปัญหากับฉันที่เกี่ยวข้องกับการ/dev/nullอนุญาตให้ตั้งค่าเป็น 0600 เมื่อล็อกเอาต์ unset HISTFILEแต่ผมใช้
Doodad


21

ส่วนขยายของคำตอบของ @John Doe & @ user3270492 แต่นี่ดูเหมือนจะใช้ได้สำหรับฉัน

<your_secret_command>; history -d $((HISTCMD-1))

คุณไม่ควรเห็นรายการคำสั่งในประวัติของคุณ

นี่คือคำอธิบาย ..

'history -d' จะลบรายการที่กล่าวถึงจากประวัติ

HISTCMD เก็บ command_number ของอันที่จะดำเนินการต่อไป ดังนั้น (HISTCMD-1) หมายถึงคำสั่งที่ดำเนินการล่าสุด

ลบบรรทัดหนึ่งออกจากไฟล์ Bash history


น่าเสียดายที่นี่ไม่ได้ผลสำหรับฉัน
Magick

10

คุณอาจพิจารณาใช้เชลล์ที่ไม่มีประวัติเช่นบางที

/bin/sh << END
   your commands without history
END

(อาจจะ/bin/dashหรือ/bin/sashอาจจะเหมาะสมกว่า/bin/sh)

หรือใช้ยูทิลิตี้แบตช์ได้ดียิ่งขึ้นเช่น

batch << EOB
   your commands
EOB

ประวัติศาสตร์จะมีshหรือbatchไม่มีความหมายมากนัก


8

คุณสามารถเริ่มเซสชันของคุณด้วย

export HISTFILE=/dev/null ;history -d $(history 1)

จากนั้นดำเนินการตามที่คุณแอบทำ การตั้งค่า histfile เป็น/dev/nullจะบันทึกลงในไฟล์ประวัติ แต่รายการนี้จะถูกลบออกอย่างง่ายดายและไม่มีร่องรอย (อย่างน้อยในไฟล์ประวัติ) จะปรากฏขึ้น

นอกจากนี้ยังไม่ถาวร


คำตอบนี้มีอยู่แล้วหลายครั้ง สิ่งที่คุณจะพูดคำตอบของคุณเพิ่มไปยังหัวข้อนี้ (ยกเว้นเสียงที่ไร้ประโยชน์)?
gniourf_gniourf

มันไม่ได้รวมอยู่ในคำตอบเดียวดังนั้นเพื่อไม่ให้มีคำสั่งปรากฏตัวในประวัติศาสตร์และไม่มีอะไรปรากฏขึ้นหลังจากนั้น
Christian

1
แต่ตอนนี้กระทู้นี้เป็นระเบียบจริง! ในกรณีนี้โดยเฉพาะอย่างยิ่งสำหรับคำถามเก่าฉันเชื่อว่ามันจะดีกว่าที่คุณแก้ไขคำตอบที่ดีที่มีอยู่แล้วและ / หรือแสดงความคิดเห็น ...
gniourf_gniourf

5

เป็นที่กล่าวถึงโดย doodad ในความคิดเห็น , unset HISTFILEไม่นี้เป็นอย่างดี แต่ในกรณีที่คุณยังต้องการที่จะลบประวัติศาสตร์บางคนทำecho $HISTFILEเพื่อรับตำแหน่งแฟ้มประวัติ (ปกติ~/.bash_history) unset HISTFILEและแก้ไข~/.bash_history(หรือสิ่งที่HISTFILEเป็น - แน่นอนมันในขณะนี้unsetเพื่อให้คุณสามารถ' ฉันไม่ได้อ่านมัน)

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

จากนั้นคุณได้แก้ไขประวัติของคุณและความจริงที่ว่าคุณแก้ไขมัน!


พยายามทำสิ่งนี้เมื่อ: ทุบตี GNU, รุ่น 3.2.57 (1) -release (x86_64-apple-darwin15) และมันไม่ทำงาน คำสั่งที่ฉันใช้หลังจากล้างประวัติถูกเก็บไว้ใน ~ / .bash_history
Krystian

@ Krystian ความผิดพลาดของฉัน - ฉันได้เขียน "unset HISTORY" เมื่อมันควรจะเป็น "unset HISTFILE" - แก้ไขแล้ว มันใช้งานได้แล้วตอนนี้? มันทำงานบน GNU bash, รุ่น 4.3.30 (1) - ปล่อย (x86_64-pc-linux-gnu)
drkvogel

ดีฉันไม่แน่ใจ ทดสอบอย่างง่าย: unset HISTFILE; echo TEST; historyจะให้คำสั่งแก่คุณecho TESTก่อนหน้านี้เป็นครั้งสุดท้าย แม้ว่าหลังจากสิ้นสุดเซสชันและเชื่อมต่ออีกครั้ง แต่ประวัติไม่มีรายการนี้ ดังนั้นฉันจะบอกว่ามันใช้งานได้ :)
Krystian

unset HISTFILEดูเหมือนจะไม่หยุดคำสั่งที่ถูกบันทึกไว้ในประวัติในหน่วยความจำ แต่มันจะหยุดคำสั่งที่ถูกบันทึกไว้ในไฟล์ $ HISTFILE ใด ๆ ก็ได้ ดังนั้นฉันเดาว่าคุณยังมีประวัติในเครื่องของคุณอยู่ในหน่วยความจำ แต่มันไม่ได้ถูกบันทึกในไฟล์อีกต่อไปซึ่งเป็นสิ่งที่คุณอาจต้องการ! ;)
drkvogel

4

คุณยังสามารถใช้คำสั่งต่อไปนี้:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

ฉันคิดว่ามันเป็นคำสั่งแบบพกพามาก


ฉันได้สร้างนามแฝงจากนี้: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"และตอนนี้คุณสามารถทำสิ่งนี้:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
ขออภัย แต่ฉันรู้ว่าคุณต้องสร้างฟังก์ชั่นแทนนามแฝงเพราะเครื่องหมายคำพูดเปลี่ยนความหมายของ$sและสิ่งอื่น ๆ ในใจ function forget() { // put code here // }
sobi3ch

3

หากคุณใช้zshคุณสามารถเรียกใช้:

setopt histignorespace

หลังจากตั้งค่าแล้วคำสั่งแต่ละคำสั่งที่ขึ้นต้นด้วยช่องว่างจะถูกแยกออกจากประวัติ

คุณสามารถใช้นามแฝงใน.zshrcการเปิด/ ปิด :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

ดี แต่คำถามนี้มีการติดแท็กเฉพาะทุบตี
Tripleee

2

มีหลายวิธีที่คุณสามารถทำได้ สิ่งนี้ตั้งค่าขนาดของไฟล์ประวัติเป็น 0:

export HISTFILESIZE=0

สิ่งนี้ตั้งค่าไฟล์ประวัติเป็น/dev/nullปิดการใช้งานอย่างมีประสิทธิภาพ:

export HISTFILE=/dev/null

สำหรับแต่ละคำสั่งคุณสามารถนำหน้าคำสั่งด้วยช่องว่างและคำสั่งนั้นจะไม่ถูกบันทึกไว้ในไฟล์ประวัติ โปรดทราบว่าสิ่งนี้ต้องการให้คุณมีignorespaceค่าที่รวมอยู่ใน$HISTCONTROLตัวแปรสภาพแวดล้อม (man bash และค้นหาignorespaceรายละเอียดเพิ่มเติม)


2
นี่จะป้องกันไม่ให้คำสั่งทั้งหมดถูกบันทึก ไม่ใช่สิ่งที่ผู้ถามต้องการ
Noufal Ibrahim

ฉันคิดว่าผู้ถามจะรีเซ็ตค่าหลังจากทำทุกอย่างที่เขาต้องการซึ่งไม่ควรบันทึก
pgl

1

สิ่งนี้มีประโยชน์ถ้าคุณต้องการลบประวัติทั้งหมดรวมถึงความจริงที่ว่าคุณลบประวัติทั้งหมด!

rm .bash_history;export HISTFILE=/dev/null;exit

0

คุณเพียงแค่ต้องเรียกใช้:
$ set +o history

หากต้องการดูเพิ่มเติมให้เรียกใช้:
$ man set


2
สิ่งนี้จะปิดใช้งานประวัติสำหรับคำสั่งในอนาคตทั้งหมดไม่ใช่สำหรับแต่ละคำสั่ง คนส่วนใหญ่ที่มาที่นี่ควรดูคำตอบที่ยอมรับแทน
tripleee

สิ่งนี้ถูกต้องหรือโอเค แต่ไม่สมบูรณ์ ตราบใดที่เราเพิ่มคำสั่ง reverse set -x historyหลังจากนั้นก็ใช้งานได้
อับดุลลาห์

0

คำสั่งนี้อาจมีประโยชน์ สิ่งนี้จะไม่บันทึกคำสั่งที่เรียกใช้งาน

history -d $((HISTCMD-1)) && <Your Command Here>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.