Hej,
Jag har en fråga;
jag skulle vilja använda kommandot "script" för att logga stdin/stdout/stderr på samtliga terminaler som jag startar efter uppstart av OS.
Hur gör man det på enklast/bästa sätt?
Jag förstår också att jag inte därmed kommer att logga alla tangenttryckningar, men det är inte heller syftet. Är ute efter att i efterhand kunna gå igenom samtliga kommandon jag skrivit och vad resultatet blivit. Alltså ej vad jag skrivit i t ex VI vid editering av fil.
Förslag?
/ Hasse
Logga samtliga terminaler [LÖST]
Logga samtliga terminaler [LÖST]
Senast redigerad av 2 hanssolo, redigerad totalt 16 gång.
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: Logga samtliga terminaler
Hej och välkommen till ubuntu-se.org
Det här kräver lite mixtrande. Jag har idéer om hur du skulle kunna göra, men jag har inget intresse av att göra det själv. Bara så att du vet att jag inte själv har gjort det jag föreslår.
Lite bakgrund.
När du startar ett nytt skal, bash, körs vissa filer, tex ~/.bashrc ~/.bash.profile. Det enkla vore att i dessa starta script i dessa filer. Men när du startar skript startas ett nytt skal osv. Så det gäller att se till att script enbart körs en gång. Annars kommer maskinen dö tills att du får bort loopen, (det är egentligen ingen loop utan rekursion utan slut). Så hela det här tillvägagångssättet är ganska farligt om man gör fel.
För att komplicera det hela lite till så körs inte bägge de här skripten varje gång du startar ett nytt skal, och jag är faktiskt lite osäker på när de körs. Kolla man sidan för bash för mer informaition.
Vad du kan göra.
Lägg till följande rader i .bashrc
Det kan behövas en liten förklaring
[ -z "$SCRIPT_STARTED" ] kontrollerar att "$SCRIPT_STARTED" är tomt (att längdet av strängen är 0). Det är det första gången .baschrc körs.
&& betyder att om kommandot innan går bra så kör nästa kommando.
{ } innehåller flera kommandon (kan ses som ett icke namgett skript).
SCRIPT_STARTED=$(mktemp -d ~/ script) tilldelar variabeln SCRIPT_STARTED ett unikt filnamn i din hemkatalog. Namnet startart med script. Det blir felen som du kommer att logga i. Det blir ett per skal med den här metoden.
export SCRIPT_STARTED gör om variableln till en miljövariabel.
script $SCRIPT_STARTED startar skript.
Var mycket försiktig... Tänk på att kontrellera när skripten körs och undvik att ha ihjäl datorn pga rekursioner...
Om du är osäker tror jag att det är bättre att starta script monuellt. Dessutom finns kanske det finns någon som har en bättre idé
Det här kräver lite mixtrande. Jag har idéer om hur du skulle kunna göra, men jag har inget intresse av att göra det själv. Bara så att du vet att jag inte själv har gjort det jag föreslår.
Lite bakgrund.
När du startar ett nytt skal, bash, körs vissa filer, tex ~/.bashrc ~/.bash.profile. Det enkla vore att i dessa starta script i dessa filer. Men när du startar skript startas ett nytt skal osv. Så det gäller att se till att script enbart körs en gång. Annars kommer maskinen dö tills att du får bort loopen, (det är egentligen ingen loop utan rekursion utan slut). Så hela det här tillvägagångssättet är ganska farligt om man gör fel.
För att komplicera det hela lite till så körs inte bägge de här skripten varje gång du startar ett nytt skal, och jag är faktiskt lite osäker på när de körs. Kolla man sidan för bash för mer informaition.
Vad du kan göra.
Lägg till följande rader i .bashrc
Kod: Markera allt
[ -z "$SCRIPT_STARTED" ] && {
SCRIPT_STARTED=$(mktemp -d ~/ script)
export SCRIPT_STARTED
script $SCRIPT_STARTED
}
[ -z "$SCRIPT_STARTED" ] kontrollerar att "$SCRIPT_STARTED" är tomt (att längdet av strängen är 0). Det är det första gången .baschrc körs.
&& betyder att om kommandot innan går bra så kör nästa kommando.
{ } innehåller flera kommandon (kan ses som ett icke namgett skript).
SCRIPT_STARTED=$(mktemp -d ~/ script) tilldelar variabeln SCRIPT_STARTED ett unikt filnamn i din hemkatalog. Namnet startart med script. Det blir felen som du kommer att logga i. Det blir ett per skal med den här metoden.
export SCRIPT_STARTED gör om variableln till en miljövariabel.
script $SCRIPT_STARTED startar skript.
Var mycket försiktig... Tänk på att kontrellera när skripten körs och undvik att ha ihjäl datorn pga rekursioner...
Om du är osäker tror jag att det är bättre att starta script monuellt. Dessutom finns kanske det finns någon som har en bättre idé

Re: Logga samtliga terminaler
Tack, det är något sådant jag behöver.
Har inte testat ännu, men ska göra det inom kort.
Kanske siktar jag på att placera variabelkollen/exekvering av "script" någonstans under /etc/ (bash.bashrc?)
Då kan man det få att gälla för fler users än för endast den user som man editerat .profile.
Som jag förstår kommandot "script" så skapas ytterligare en konsole-process (motsv) när "script" körs. Därav rekurssionsproblematiken då detta skal även läser in exekveringen av "script".
Att sätta en variabel och kontrollera denna borde funka, men jag är lite nyfiken på om det finns någon "renare" lösning? (no offense, det var en bra lösning, men du förstår säkert vad jag menar)
/ Hasse
Har inte testat ännu, men ska göra det inom kort.
Kanske siktar jag på att placera variabelkollen/exekvering av "script" någonstans under /etc/ (bash.bashrc?)
Då kan man det få att gälla för fler users än för endast den user som man editerat .profile.
Som jag förstår kommandot "script" så skapas ytterligare en konsole-process (motsv) när "script" körs. Därav rekurssionsproblematiken då detta skal även läser in exekveringen av "script".
Att sätta en variabel och kontrollera denna borde funka, men jag är lite nyfiken på om det finns någon "renare" lösning? (no offense, det var en bra lösning, men du förstår säkert vad jag menar)
/ Hasse
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
Re: Logga samtliga terminaler
Förstår exakt. Hoppas någon annan har någon idé.hanssolo skrev:Att sätta en variabel och kontrollera denna borde funka, men jag är lite nyfiken på om det finns någon "renare" lösning? (no offense, det var en bra lösning, men du förstår säkert vad jag menar)
Re: Logga samtliga terminaler
Detta funkade bra. Ändrade lite i mktemp så att det körde med -p directory samt i script-kommandot så att det flushade characters under tiden (minns inte vilken växel det var) samt att script-kommandot exekverade med -q=quit.
Lade in detta i .bashrc som körs för varje icke-inloggningsterminal-session.
Tackar för hjälpen / Hasse
Lade in detta i .bashrc som körs för varje icke-inloggningsterminal-session.
Tackar för hjälpen / Hasse