มีวิธีใดบ้างที่ฉันสามารถเห็นเวลาที่คำสั่งถูกดำเนินการจากประวัติทุบตี? เราสามารถดูคำสั่งซื้อได้ แต่มีวิธีใดบ้างที่ฉันจะได้รับเวลาด้วย?

บรรทัดล่าง: เวลาดำเนินการในประวัติทุบตี

answer

กดCtrl+ Alt+ Tเพื่อเปิดเทอร์มินัล จากนั้นเรียกใช้คำสั่งใดคำสั่งหนึ่งด้านล่าง:

HISTTIMEFORMAT="%d/%m/%y %T "  # for e.g. “29/02/99 23:59:59”
HISTTIMEFORMAT="%F %T "        # for e.g. “1999-02-29 23:59:59”

หากต้องการทำการเปลี่ยนแปลงอย่างถาวรสำหรับผู้ใช้ปัจจุบัน:

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc  # or respectively
echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bashrc
source ~/.bashrc

ในการทดสอบเอฟเฟกต์ให้รัน:

history

สำหรับข้อมูลเพิ่มเติม โปรดดูที่ man bashหรือดัชนี AZ ของบรรทัดคำสั่ง Bash สำหรับ Linux

สำหรับคำสั่งที่รันก่อนหน้า HISTTIMEFORMATนี้ถูกตั้งค่า เวลา ปัจจุบันจะถูกบันทึกเป็นการประทับเวลา คำสั่งที่รันหลังจากHISTTIMEFORMATตั้งค่าไว้จะมีการบันทึกเวลาที่เหมาะสม

เปิดเทอร์มินัลCtrl+ Alt+ Tและเรียกใช้

HISTTIMEFORMAT="%d/%m/%y %T "

แล้ว,

history

หากต้องการทำการเปลี่ยนแปลงอย่างถาวรให้ทำตามขั้นตอนด้านล่าง

gedit ~/.bashrc

คุณต้องเพิ่มบรรทัดด้านล่างในไฟล์ .bashrc แล้วบันทึก

export HISTTIMEFORMAT="%d/%m/%y %T "

เรียกใช้คำสั่งด้านล่างไปยังไฟล์ต้นฉบับ .bashrc

source ~/.bashrc

หลังจากนั้นให้รันhistoryคำสั่ง

ใส่คำอธิบายภาพที่นี่

ที่มา : http://www.cyberciti.biz/faq/unix-linux-bash-history-display-date-time/

ได้ คุณสามารถ: หากคุณตั้งค่า$HISTTIMEFORMATระบบ.bash-historyจะประทับเวลาอย่างถูกต้อง ที่ไม่ได้ช่วยกับ.bash-historyเนื้อหาที่มีอยู่ แต่จะช่วยในอนาคต

การเปลี่ยนแปลงHISTIMEFORMATไม่ได้ผลสำหรับฉันเพราะฉันใช้ zsh

หากคุณต้องการทำให้มันใช้งานได้กับ zsh คุณเพียงแค่พิมพ์ : history -i

คุณจะเห็นการเปลี่ยนแปลงในการเข้าสู่ระบบครั้งต่อไป

echo 'HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc

รุ่นของฉันที่ใช้งานได้

HISTTIMEFORMAT="%F %T %z " history | grep 'your command'

อ้างอิง https://www.linuxuprising.com/2019/07/bash-history-how-to-show-timestamp- when.html

เช่น

[email protected]:/some/path 
╰$ HISTTIMEFORMAT="%F %T %z "; history | grep 'some command'
 1947  2019-12-17 15:54:34 +0800 ./some.sh
 1948  2019-12-17 15:54:34 +0800 ./my-command

ดูไวยากรณ์แบบเต็มสำหรับHISTTIMEFORMAT ที่นี่

หากต้องการเปิดใช้งานการประทับเวลาประวัติสำหรับผู้ใช้ทั้งหมด ให้สร้างสคริปต์ใน /etc/profile.d :

echo 'HISTTIMEFORMAT="%Y%m%d %T "' >> /etc/profile.d/timestamp.sh

ฉันรู้ ฉันตอบช้ามาก แต่สำหรับผู้ใช้ทุกคน คุณสามารถสร้าง.shไฟล์/etc/profile.dและเพิ่มบรรทัดต่อไปนี้ลงไปได้:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' >> /etc/profile.d/existing-foo-file.sh

หากคุณไม่ได้เข้าสู่ระบบในฐานะrootหรือ superuser คุณต้องใช้teeคำสั่งเพื่อทำสิ่งนี้:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee /etc/profile.d/mytimestamp.sh

หากคุณต้องการผนวกไฟล์ที่มีอยู่ ให้ส่ง-aแฟล็กไปที่teeคำสั่ง:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee -a /etc/profile.d/mytimestamp.sh

ใส่คำอธิบายภาพที่นี่

ฉันรักษาประวัติต่ออุปกรณ์ tty ต่อผู้ใช้ใน .bash_profile และปล่อยให้พวกเขาเติบโตขึ้น บางครั้งฉันต้องการค้นหาตำแหน่งที่คำสั่งถูกใช้ในไฟล์ทั้งหมดโดยใช้ grep พูด ฉันเพิ่งใช้เวลาสักพักเพื่อให้ได้สิ่งที่ต้องการ โดยมีการประทับเวลาเป็นสตริงและส่วนหัวสำหรับแต่ละไฟล์ บวกกับ tty ใดก่อนเวลา ดังนั้นถ้าฉัน grepping ฉันจะเห็นว่าใช้ที่ไหนและเมื่อใด:

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003|head

==>.bash_history_ttys003<==
ttys003 Thu 28 Sep 2017 10:45:48+0.00H (1506591948)cp Qlog t
ttys003 Thu 28 Sep 2017 10:45:48+6.12H (1506613974)grep \ 755\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.15H (1506614092)grep \ 769\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.16H (1506614130)locate akd
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614159)less /System/Library/LaunchAgents/com.apple.akd.plist
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614172)mN -K PLIST
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614179)man -k plist
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614213)man swapllist

ไม่สามารถอธิบายพื้นหลังทั้งหมดได้เนื่องจากชีวิตสั้นเกินไป (LITS) แต่นี่คือบันทึกย่อสำหรับนักพัฒนาซอฟต์แวร์ของฉันในขณะที่ฉันทำงาน นี่เป็นใน macOS ดังนั้นจึงไม่มีการเพ่งมองพิเศษ แต่ฉันใช้ date -r ซึ่งอาจแตกต่างกันไปสำหรับคุณ date -d? สนุก! :

How would I list all .bash_history* lines that grep finds together with the Unix timestamp as string?
sample data lines in history (#unix time \n command)
head .bash_history_ttys007
\#1502956374
man top
\#1502956600
top

As 2 lines looks like an awk task...
Can't print FILENAME in begin as there is no current file at that stage :( so use FNR file rec numb check...
awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}'
awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}' .bash_history_ttys00[67]|head
Works but 3 lines per item as x0a line-returns are in there. WILL HAVE OTHER PROBLEMS TOO (later)...
Progress by field sep on new lines and carve up filename for controlling terminal
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys00[67]|head

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date -r "$1");print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002

Works OK but runs a bit slow: just do dates every once in a while? then if grep-ing will probably miss it...
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002

Do occasional date convert and retain string and offset secs? this does run much faster and requires timestamps to avoid # in commands. About 5s for 20,000 commands for me.
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003