A követelmény a parancssori előzmények rögzítése egy fájlban, a parancsok dátumával és idejével, amikor azokat végrehajtották.
Az alábbi szkript rögzíti az előzményeket dátummal és idővel, de hozzárendeli az aktuális dátumot és időt a régebbi parancsokhoz is. Ezenkívül szeretném kibővíteni a szkriptet az előzmények kimeneti fájljának növekményes biztonsági mentése érdekében.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Megjegyzések
- Don ' ne használja erre a shell előzményeket. Használja a könyvelést vagy a sudo (és a sudo parancsok naplózását).
- Hogyan használhatja a könyvelést vagy a sudo-t az előzmények rögzítéséhez egy fájlban?
- A sudo konfigurálható az előzmények (és akár a tty kimenet) rögzítésére. ) fájlba (vagy syslogon keresztül). Mit értesz " könyvelés alatt "?
- @SunLynx, lásd: Hogyan lehet naplózni minden beírt parancsot
Válasz
Nem egészen az, amit te kívánt, de elérheti, hogy bash
automatikusan hozzáadja az időbélyegeket az előzmények minden sorához. Egyszerűen állítsa be a példáját:
HISTTIMEFORMAT="%d%b%y%T "
A history
parancs argumentum nélkül ekkor a következőképpen jeleníti meg az előzménybejegyzéseket:
23Jul1515:48:14 ls -ld .
A history -w
parancs azonban mindig az előzményfájlt írja a következő belső formátumba: :
#1437659315 ls -ld .
ie 2 soron az első sor másodpercekben tartja az időt “a korszak óta” (azaz 1970. január 1.) #
elül, így nem keverhető össze egy paranccsal.
Megjegyzések
- Naponta szeretnék rögzíteni az előzményeket, a fenti szkript működik, de az összes parancshoz aktuális dátumot rendel. Minden parancs után egy szám generálódik, amelyet nem akarok '. Ha bárki tud segíteni, az valóban hasznos lesz.
- Nem tudom, mit értesz " alatt egy szám generál ". Szerkesztheti eredeti kérdését egy példával arra, hogy mely fájlokat szeretné megszerezni, és azok tartalmát?
- 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Jul15 00: 00: 01 # 1435988263 602 05Jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05Jul15 00: 00: 01 # 1435988281 604 05Jul15 00: 00: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
- mint ez az üzenetek generálnak
- ezt nehéz elolvasni egy megjegyzésben. kérjük, távolítsa el a megjegyzéseit és szerkessze az eredetileg írt kérdést .
Válasz
A bash-ban van egy lehetőség, amely utasítja a bash-t, hogy minden parancshoz rögzítsen egy időbélyeget. Ezt úgy teheti meg, hogy hasznos értéket rendel hozzá a HISTTIMEFORMAT
környezeti változóhoz. A bash
manpage oldalról:
Ha ez a változó be van állítva és nem null, akkor az értékét formátum karakterlánc a
strftime(3)
számára a beépített előzmények által megjelenített minden előzménybejegyzéshez tartozó időbélyeg nyomtatásához. Ha ez a változó be van állítva, akkor az időbélyegeket az előzményfájlba írják, így azok megmaradhatnak a shell-munkamenetek során. Ez az előzmények megjegyzés karakterét használja az időbélyegek megkülönböztetéséhez a többi előzménysortól.
A környezetemben a következőt használom:
HISTTIMEFORMAT="%s (%H:%M:%S):"
Annak érdekében, hogy a parancsok könnyen válogathatók legyenek (%s
időbélyeg másodpercekben), és ember által olvashatóak. A héjban, amikor beírok history
, valami hasonlót látok:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs kérdés nincs teljesen megválaszolva.
Ezenkívül szeretném kibővíteni a szkriptet az előzmények kimeneti fájljának növekményes biztonsági mentése érdekében
Nem vagyok biztos abban, hogy mit ért az előzményfájl „növekményes biztonsági mentése” alatt. Talán egyszerűen azt szeretné, ha az előzmények rendszeresen biztonsági másolatot készítenének. Néhány megközelítést megtehet:
- Állítsa be a PROMPT_COMMAND változót a
history -a
paranccsal, hogy minden invokáció után folyamatosan frissítse az előzmények parancsot (szemben a kijelentkezéssel való várakozással). - Csapdába ejti a DEBUG jelezzen egy Ön által definiált funkcióval. Minden alkalommal, amikor egy parancsot megadunk, a függvény meghívásra kerül. A függvényen belül mindent megtehet. (Valamivel megbízhatóbb, mint a PROMPT_COMMAND).
- cronjob rendszeresen másolni / archiválni az előzményfájl.
Megjegyzések
- Köszönöm a javaslatokat, de én ' fentebb teszteltem. Bővebben bővebben a -a történelemről. A Shell szkript jól működik, de rossz az időbélyegző.Ez az egyik probléma, a másik pedig egy szám minden # után kezdődő parancs után. mert pl. # 1435987168.
- A
az előzményfájlban az időbélyeg ! Párféleképpen lehet ezt felhasználóbarát formátumba konvertálni, beleértve a következőket: töltse be az előzményfájlt bash-ba a history -n _filename_
, majd a history
. Vagy tehet ilyet: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
az előzmények és az időbélyegek megjelenítéséhez. Tehát ' valószínűleg az időbélyegek helyesek, de területi vagy időzóna problémája van?
history -a
?? A man oldal kissé félrevezető. Az aktuális munkamenet előzményeket hozzáfűzi a $ HISTFILE által kijelölt fájlhoz. A következő hívások hozzáfűzik az utolsó meghívás óta létrehozott előzményeket (nem írja le ' t az egész fájlt újra és újra)