Vaatimus on kaapata komentorivihistoria tiedostoon, jossa on tietty päivämäärä ja aika komennoilla, kun ne suoritettiin.
Alla oleva komentosarja tallentaa historiaan päivämäärän ja kellonajan, mutta määrittää myös nykyisen päivämäärän ja kellonajan vanhemmille komennoille. Haluan myös laajentaa komentosarjaa ottamaan osittaisen varmuuskopion historiatiedostosta.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Kommentit
- Älä ' älä käytä tähän shell-historiaa. Käytä kirjanpitoa tai sudoa (ja kirjaa sudo-komentoja).
- Kuinka kirjanpitoa tai sudoa käytetään tiedostojen historian sieppaamiseen
- sudo voidaan määrittää sieppaamaan sen historia (ja jopa tty-tulos ) tiedostoon (tai syslogin kautta). Mitä tarkoitat " kirjanpidolla "?
- @SunLynx, katso Miten kirjaat kaikki kirjoitetut komennot
Vastaa
Ei aivan mitä halusi, mutta voit saada bash
lisätä aikaleimat jokaiselle historian riville automaattisesti. Yksinkertaisesti määritä esimerkillesi:
HISTTIMEFORMAT="%d%b%y%T "
history
-komento ilman argumentteja näyttää sitten historiatietosi näin:
23Jul1515:48:14 ls -ld .
history -w
-komento kirjoittaa kuitenkin aina historiatiedoston sisäisessä muodossa :
#1437659315 ls -ld .
ts kahdella rivillä ensimmäinen rivi pitää ajan sekunteina ”aikakaudesta lähtien” (eli 1. tammikuuta 1970) #
edessä, jotta sitä ei sekoiteta komentoon.
Kommentit
- Haluan kaapata historiaa päivittäin, yllä oleva komentosarja toimii, mutta se määrittää nykyisen päivämäärän kaikille komennoille. Jokaisen komennon jälkeen generoidaan myös yksi numero, jota en halua ' halua. Jos joku voi auttaa, siitä on todella hyötyä.
- En tiedä mitä tarkoitat " yksi numero tuottaa ". Voisitko muokata alkuperäistä kysymystäsi esimerkillä haettavista tiedostoista ja niiden sisällöstä?
- 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: 01kissa /srv/cloud-user_hist.sh
- kuten tämä viesti synnyttää
- tätä on vaikea lukea kommentista. poista kommenttisi ja muokkaa kysymystä , jonka kirjoitit alun perin.
Vastaa
Bashissa on vaihtoehto, joka kehottaa bashia tallentamaan aikaleiman jokaisen komennon kanssa. Teet tämän määrittämällä hyödyllisen arvon ympäristömuuttujalle HISTTIMEFORMAT
. bash
-sivulta:
Jos tämä muuttuja on asetettu eikä nolla, sen arvoa käytetään format string for
strftime(3)
tulostaaksesi aikaleiman, joka liittyy jokaisen sisäänrakennetun historian näyttämään historiatiedoon. Jos tämä muuttuja on asetettu, aikaleimat kirjoitetaan historiatiedostoon, jotta ne voidaan säilyttää shell-istunnoissa. Tämä käyttää historiakommenttimerkkiä erottamaan aikaleimat muista historiariveistä.
Ympäristössä käytän
HISTTIMEFORMAT="%s (%H:%M:%S):"
Jotta komennot voidaan lajitella helposti (%s
on aikaleima sekunneissa) ja ihmisen luettavissa. Kun kirjoitan komentotulkkiin history
, näen jotain seuraavaa:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs question ei ole täysin vastattu.
Haluan myös laajentaa komentosarjaa ottamaan osittaisen varmuuskopion historian tulostetiedostosta
En ole varma, mitä tarkoitat historiatiedoston ”inkrementaalisella varmuuskopioinnilla”. Ehkä haluat yksinkertaisesti, että historia varmuuskopioidaan säännöllisesti. Voit tehdä muutaman lähestymistavan:
- Määritä PROMPT_COMMAND-muuttuja
history -a
-toiminnolla päivittääksesi historiakomennon jatkuvasti jokaisen kutsun jälkeen (toisin kuin uloskirjautumisen odottamista). - Trap DEBUG signaali määrittelemälläsi toiminnolla. Joka kerta, kun komento syötetään, toiminto kutsutaan. Funktion sisällä voit tehdä kaiken. (Hieman luotettavampi kuin PROMPT_COMMAND).
- cronjob ajoittain kopioimiseksi / arkistoimiseksi historiatiedosto.
Kommentit
- Kiitos ehdotuksista, mutta olen ' testannut yllä. Voitteko kertoa tarkemmin historiasta -a. Shell-komentosarja toimii hyvin, mutta väärät aikaleimat.Tämä on yksi ongelma ja toinen on yksi numero jokaisen komennon jälkeen, joka alkaa numerolla #. esimerkiksi # 1435987168.
- Historiatiedoston
#1435987168
on aikaleima ! On olemassa muutama tapa muuntaa se käyttäjäystävälliseksi muodoksi, mukaan lukien: lataa historiatiedosto bash-tiedostoonhistory -n _filename_
ja sittenhistory
. Tai voit tehdä jotain tällaista:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
näyttääksesi historian ja aikaleimat. Joten ' luultavasti aikaleimat ovat oikein, mutta onko sinulla kieli- tai aikavyöhykeongelma? - Selvitä
history -a
?? Man-sivu on hieman harhaanjohtava. Se lisää nykyisen istuntohistorian tiedostoon, jonka $ HISTFILE on määrittänyt. Seuraavat puhelut lisäävät edellisen kutsun jälkeen luodun historian (se ei korvaa ' t koko tiedostoa uudestaan ja uudestaan)