Toon posts:

[Shellscript] afvangen input

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een script gemaakt dat in een loop terecht komt. Dat is ook de bedoeling, maar er is ook een probleem.

Als het script actief is, en je tikt iets in, in het terminal waarin het script loopt, dan word dat uitgevoerd nadat het script stopt.

Ik vroeg me af of het mogelijk is de input die tijdens dat het script loopt gegeven wordt, genegeerd kan worden, of redirecten naar /dev/null.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 12:38
Dat is niet een probleem, dat hoort.

Zo werkt de shell nu eenmaal. Je zou een andere shell dan bash kunnen proberen die de input weggooit na het uitvoeren van een script (ik weet niet of zo'n shell bestaat).

Ik kan eigenlijk geen manier bedenken om dit te veranderen. Daarnaast zou ik het zelf ook absoluut niet verwachten en zeer geirriteerd zijn als een script me een dergelijk kunstje toch zou weten te flikken.

Dus waarom wil je dit precies?

  • Weppel
  • Registratie: Oktober 2000
  • Laatst online: 07:18
Ik kan me eigenlijk niet een legitiem doel hiervan bedenken..

Het enigste waar ik mee op kan komen, is het hacken van een box, en er voor zorgen dat de sysop er lokaal ook niets meer mee kan.. dus graag wat meer uitleg.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Als je nou gewoon als laatste regel in je script op de een of andere manier alle buffers ( keyboard , shell buffer etc ) leeggooit??? Of is het echt het script zelf wat input creert???

Verwijderd

Topicstarter
Nee dat is juist de bedoeling, maar ik heb geen idee hoe je alle buffers leeg maakt!

Het is namelijk zo, het script wordt gebruikt om mijn werk, en soms is men zo slim om per ongeluk commando's in te tikken in het terminal waar het script in loopt.

Als dan het script om wat voor reden dan ook stopt, worden deze commando's alsnog uitgevoerd, op een verkeerd tijdstip.

Maar als iemand weet hoe je de buffers leeg maakt, post het ff aub! _/-\o_

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Script in de background laten lopen en de terminal uitloggen? Of een basiscursus geven aan de mensen daar dat ze niet aan terminals moeten komen waar dingen draaien.

Verwijderd

Topicstarter
Ja dat laatste is helaas geen optie, sommige mensen kan je gewoon geen dingen leren...

En het eerste ook niet, het script gebruikt de hele terminal om informatie weer te geven, en refreshed om de zoveel seconden om de geupdate informatie weer te geven....

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Ik weet niet hoe het script precies werkt, maar je kunt ook output naar de terminal sturen vanuit de background hoor, wat je ook kunt proberen is met read aan het einde alle input zelf vangen en er niks mee doen.

Verwijderd

Topicstarter
Ik ben eigenlijk niet echt goed in shell programming, ik doe alles eigenlijk met TCL/TK.

Maar dit vereist even wat shell kennis, ik kan wel met read een file uitlezen, maar heb geen idee hoe ik de prompt uitlees... iemand voorbeelden?

Verwijderd

Zo ff snel uit m'n hoofd kun je een read in je loop zetten, die de keyboard buffer uitleest.
code:
1
2
3
4
5
for i in `seq 5`; do
     echo $i
     sleep 5
     INPUT="" read INPUT
done

werkt als een bus.
edit:

werkt dus alleen maar als je enter intikt in de loop :/


edit2: Is het niet mogelijk om dit script als login shell ipv bash te gebruiken? Daarmee omzeil je het probleem in z'n geheel.

[ Voor 74% gewijzigd door Verwijderd op 11-11-2003 12:54 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
INPUT="" read INPUT kan afgekort worden tot read denk ik, je hoeft het verder niet in een variabele te stoppen, je doet er toch niks mee, je kunt ook
code:
1
2
echo DONE
while read ; do : ; done

Aan het einde van je script zetten, dan blijft ie de input afvangen, tot je een ^C of een ^D geeft op het keyboard, nadeel is dan dat ie niet automatisch exit, maar dat er DONE in beeld komt alstie klaar is, ik weet niet in hoeverre dit een probleem is.

Verwijderd

@blaataaps: read zonder een variabele vangt alleen maar de enter af, en doet niet de keyboard buffer uitlezen. Vandaar de INPUT="" read INPUT constructie.

@TS: Zie m'n vorige posting over het script als login-shell.

[ Voor 18% gewijzigd door Verwijderd op 11-11-2003 12:56 ]


  • ajvdvegt
  • Registratie: Maart 2000
  • Laatst online: 04-12-2025
En als je nou 'screen' gebruikt om de hele terminal voor de gebruikers te verbergen? Zelf kan je dan van tijd tot tijd eens gaan kijken hoe het er mee staat (of dat automatiseren met een mailtje ofzo, maar da's weer wat anders).

I don't kill flies, but I like to mess with their minds. I hold them above globes. They freak out and yell "Whooa, I'm *way* too high." -- Bruce Baum


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
@r3boot: read zonder variabele neemt aan de je het in $REPLY wil hebben, en vangt dus wel alles af :)
If no NAMEs are supplied,
the line read is stored in the REPLY variable.
maar dat is allemaal eigenlijk offtopic, en als het goed is kan de topicstarter iig nu weer iets vooruit met al deze replies.

[ Voor 25% gewijzigd door blaataaps op 11-11-2003 16:52 ]


Verwijderd

wat je ook kan doen is de output naar een andere screen sturen, bv:
./scriptje.sh > /dev/tty8

Verwijderd

Topicstarter
Ja ik ben verlopig geholpen.

Bedankt voor de reacties.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 12:38
Heheh..de oplossingen vertonen inderdaad precies de problemen die ik had verwacht: of je moet op enter drukken als er niets was ingetikt, of je moet lezen tot een EOF - hoe weet je anders dat je moet stoppen met lezen?

Kortom: dit gaat domweg niet op de manier zoals de topicstarter het zich voorstelt :)

Inderdaad kun je wel een programma starten en dan de uitvoer naar een compleet andere tty redirecten (en die dan op het scherm tonen), dan kun je als 'user' ook weinig uitrichten :) - wat Pakje_bakmeel zegt dus, werkt wel. Succes ermee anyway.

[ Voor 8% gewijzigd door Wilke op 12-11-2003 10:54 ]


Verwijderd

Topicstarter
Het script vraagt nu om een ctrl-c om afgesloten te worden, en commando's die tijdens de run van het script ingetikt worden, worden niet uitgevoerd. En dat lost mijn probleem op.

Het redirecten is inderdaad een optie, ik zit er over te denken om gewoon een TCL variant op het bestaande script te maken maar daar is nu even geen tijd voor.

Bedankt in ieder geval
Pagina: 1