[Linux] [Screen] Commando injecteren in draaien screen

Pagina: 1
Acties:

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
De meeste kennen het programma "screen" wel :) een zeer handige tool om programma's in de achtergrond te starten, en later weer terug te roepen op je console.

Ik gebruik bijvoorbeeld het volgende commando voor een gameserver:
Screen -L -d -m -S prognaam ./programma

Zorgt dat er wordt gelogd, screen gedetached wordt, de sessie de naam "prognaam" krijgt en fijn draait.

Reattachen kan gemakkelijk met "screen -r prognaam". Klaar. Nou ja, bijna.

Nu wil ik het screen kunnen stoppen. Geen probleem, "screen -r prognaam -X quit" doet wat ik wil. Ook handig.

Maar aangezien dit een gameserver betreft, en dus een programma met een soort openstaande "console" die commando's accepteerd, wil ik ook commando's die console in kunnen sturen.

Dus:
"screen -r prognaam -X disconnect"
om een voorbeeld te noemen, maar ipv disconnect zou je ook "echo hallo mensen" kunnen doen. En dit werkt dus juist niet ;(

Na wat uitvissen lijkt het erop dat screen het programma start, maar als je zo'n command opgeeft met -X het in bash of SH ofzo uitvoert in een screen, en niet in het openstaande programma. In de logfile kan ik nergens een responds van de server terugvinden over het gegeven commando (de log, de -L optie, geef alle output van de gameserver console weer).

Wat gaat hier nu fout? Het lijkt alsof screen het opgegeven commando niet naar die gameserver console stuurt, maar naar /dev/null ofzo :(

Ik hoop dat iemand me hiermee kan helpen, ik heb deze functie erg hard nodig om vanuit een webpagina dingen naar de console te kunnen sturen!

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
-X Send the specified command to a running screen session.
Dat werkt prima hoor, maar blijkbaar niet zoals jij verwacht, je stuurt namelijk het commando naar de screen session, en niet naar de console van dat programma, je kunt dus screen commando's geven, zoals "quit" en dergelijke, maar geen input geven aan wat er draait.
Dit is ooit eens eerder ter sprake gekomen hier in NOS, ik kan alleen het topic even niet vinden.
Wat je wel kunt doen (iig bij quake2) is een fifo maken en die aan de stdin van de game hangen, en dan vervolgens met een daemon of iets anders naar die fifo schrijven.
Veel fatsoenlijke games kun je trouwens gewoon via een netwerkpoort benaderen om commando's te geven.

[ Voor 24% gewijzigd door blaataaps op 07-01-2005 18:42 ]


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
blaataaps schreef op vrijdag 07 januari 2005 @ 18:30:
[...]
Dat werkt prima hoor, maar blijkbaar niet zoals jij verwacht, je stuurt namelijk het commando naar de screen session, en niet naar de console van dat programma, je kunt dus screen commando's geven, zoals "quit" en dergelijke, maar geen input geven aan wat er draait.
Dit is ooit eens eerder ter sprake gekomen hier in NOS, ik kan alleen het topic even niet vinden.
Wat je wel kunt doen (iig bij quake2) is een fifo maken en die aan de stdin van de game hangen, en dan vervolgens met een daemon of iets anders naar die fifo schrijven.
Veel fatsoenlijke games kun je trouwens gewoon via een netwerkpoort benaderen om commando's te geven.
Ik heb de oplossing al gevonden denk ik, toch beter die manpage lezen: De -s optie, waarmee je een "window" kunt specificeren.

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • Onno
  • Registratie: Juni 1999
  • Niet online
Met screens "exec" commando kun je een nieuw proces aan de stdin/out/err (in welke combinatie je dat maar wilt) knopen. Als je als nieuw proces iets als "echo bla" gebruikt stuur je dan dus "bla" naar je programma.

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
Nou, het lukte bijna.

Na wat hulp van iemand anders kreeg ik het volgende commando:
screen -S prognaam -X -p0 eval "stuff disconnect^m"

Dit werkt: het zendde het disconnect woord naar de server console, de server disconnecte.

Echter begrijp ik niet helemaal hoe dat eval werkt, ik heb wat manpages gelezen maar het blijft wat onduidelijk. Een probleem wat ik namelijk wil oplossen is het enkele woord: Ik wil een lange commando lijn opgeven, bijvoorbeeld "connect xxx.xxx.xxx.xxx:poort". Hier zit een spatie in, en dat werkt dit niet.

Ook is het "stuff" wat er staat geen commando, het lijkt dus op een hack, eerst 1 ding zetten voordat het werkt. Volgens mij heeft dat met eval te maken.
De ^m is denk ik nodig voor screen oid, ik durf dat niet te zeggen.

Ik heb ook dingen als
screen -S prognaam -X -p0 "disconnect" of
screen -S prognaam -X -p0 "echo disconnect"

geprobeerd, maar dat werkt helemaal niet.

Kan iemand me helpen een juist commando te maken? Thx!

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
pierre-oord schreef op zaterdag 08 januari 2005 @ 14:33:
Echter begrijp ik niet helemaal hoe dat eval werkt, ik heb wat manpages gelezen maar het blijft wat onduidelijk. Een probleem wat ik namelijk wil oplossen is het enkele woord: Ik wil een lange commando lijn opgeven, bijvoorbeeld "connect xxx.xxx.xxx.xxx:poort". Hier zit een spatie in, en dat werkt dit niet.
eval is hier een screen commando, dat zorgt ervoor dat de sessie het commando 'stuff' + een argument krijgt, in plaats van het commando 'stuff een_argument' wat een niet bestaand commando is.
Ook is het "stuff" wat er staat geen commando, het lijkt dus op een hack, eerst 1 ding zetten voordat het werkt. Volgens mij heeft dat met eval te maken.
'stuff' is een commando voor screen:
stuff string

Stuff the string string in the input buffer of the current window. This is like the "paste" command but with much less overhead. You cannot paste large buffers with the "stuff" command. It is most useful for key bindings. See also "bindkey".
De ^m is denk ik nodig voor screen oid, ik durf dat niet te zeggen.
Die ^m is gewoon een <ENTER>.


Je kunt spaties mee sturen door er quotes omheen te zetten:
code:
1
screen -S prog -X -p0 eval "stuff 'connect x.x.x.x:poort'^m"

De ^m moet buiten de quotes staan.

[ Voor 6% gewijzigd door _Squatt_ op 08-01-2005 15:09 ]

"He took a duck in the face at two hundred and fifty knots."


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
_Squatt_ schreef op zaterdag 08 januari 2005 @ 15:08:
[...]

eval is hier een screen commando, dat zorgt ervoor dat de sessie het commando 'stuff' + een argument krijgt, in plaats van het commando 'stuff een_argument' wat een niet bestaand commando is.


[...]

'stuff' is een commando voor screen:

[...]


[...]

Die ^m is gewoon een <ENTER>.


Je kunt spaties mee sturen door er quotes omheen te zetten:
code:
1
screen -S prog -X -p0 eval "stuff 'connect x.x.x.x:poort'^m"

De ^m moet buiten de quotes staan.
Werkt perfect!

Nu heb ik nog 1 vraag:
Kan ik ook de output uit die gameconsole lezen?
Ik gebruik nu screenlog, maar die kan heel groot worden, lastig om het laatste stuk te lezen, en VEEL in te lezen.

Kan ik ook, nadat ik het commando hierboven heb gestuurd, meteen alle output lezen dat er op de console komt te staan, in de seconde (instelbaar?) erna?

Dan zou ik bijvoorbeeld kunnen zien "connection ok" of "hey maat je doet wat fout". Ik script met PHP, die kan wel de output lezen die een bestand terugstuurt als ik de output van de script file die ik execute echo. Dus ik moet eigenlijk in een variabele de instellingen terug krijgen, zodat ik die daarna kan echo-en in de "normale" console.

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
kick :)

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
pierre-oord schreef op zaterdag 08 januari 2005 @ 16:48:
Ik gebruik nu screenlog, maar die kan heel groot worden, lastig om het laatste stuk te lezen, en VEEL in te lezen.
Je kunt de logs natuurlijk doorn iets als logrotate gooien zodat je ze per dag/uur/minuut(?) hebt. En met 'tail' kun je altijd de laatste regels bekijken.
Kan ik ook, nadat ik het commando hierboven heb gestuurd, meteen alle output lezen dat er op de console komt te staan, in de seconde (instelbaar?) erna?
Dit lijkt me iets lastiger, als de datum/tijd bij de output staat moet je met 'grep' redelijk ver kunnen komen. Het wordt er alleen niet duidelijker van. Het lijkt me de moeite waard om te onderzoeken of je inderdaad niet via een netwerkpoort kunt verbinden. Anders kun je ook met het (eerder genoemde) 'exec' commando van screen aan de slag.

"He took a duck in the face at two hundred and fifty knots."


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 15-01 10:55
_Squatt_ schreef op zondag 09 januari 2005 @ 18:06:
[...]

Je kunt de logs natuurlijk doorn iets als logrotate gooien zodat je ze per dag/uur/minuut(?) hebt. En met 'tail' kun je altijd de laatste regels bekijken.


[...]

Dit lijkt me iets lastiger, als de datum/tijd bij de output staat moet je met 'grep' redelijk ver kunnen komen. Het wordt er alleen niet duidelijker van. Het lijkt me de moeite waard om te onderzoeken of je inderdaad niet via een netwerkpoort kunt verbinden. Anders kun je ook met het (eerder genoemde) 'exec' commando van screen aan de slag.
Ik heb dat exec commando bekeken (online ook voor de snelle klikkers: klik

Ik moet zeggen dat het best lastig is om te begrijpen wat daar allemaal staat. Het lijkt alsof je een soort 2e proces in een window kunt starten, waarvan je dan de output kunt lezen in een attached screen. Ik heb zo'n idee dat dat niet ergens anders naartoe kan worden gestuurd.

Logrotate is zeer omslachtig, omdat het toch over een groot aantal consoles gaat, in verschillende directory's. Enkel het uitlezen van het laatste stuk van een config file zou een oplossing zijn, misschien kan ik een datum in de logfile echo-en, en dat ik dan met php alleen het laatste stuk van de file laat uitlezen totdat de ge-echode datum wordt gespot.

Ik weet dat via het php exec() commando je een opdracht kunt uitvoeren, en daarvan de output kunt lezen.
Ik gebruik dat nu al voor een shell script op een machine, die echo-ed bijvoorbeeld "he he, je kunt een server niet 2x starten", en dat kun je dan als ouput opvragen bij PHP. Nu wil ik dat hetzelfde script de regels uitgevoerd na bijvoorbeeld 3 seconden (anders moet de pagina wel _heel_ lang laden in de browser..) gaat echo-en.

En anders via de logfile, wat opzich ook een goede mogelijkheid is. Ik weet alleen niet, als zo'n logfile erg groot wordt, of het inlezen erg lang gaat duren. Wel zijn de mogelijkheden misschien groter, omdat je op ieder moment de log kunt opvragen.

Nu ik zo vertel, denk ik dat ik voor de logfile ga:
Opvraagbaar om helemaal te lezen;
wissen als > 1 mb dan command uitvoerne
Als < 1 mb dan invoeren datum, inlezen vanaf onderaan totdat de datum is tegengekomen.

Ik ga er eens mee aan de slag!

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • froggie
  • Registratie: November 2001
  • Laatst online: 20-11-2024

froggie

Kwaaak

Overigens kun je met ctrl - a een commando naar je programma sturen wat binnen je screen draait.
Ikzelf werk bijv met geneste screen sessies. Om dan bijv een nieuw screen window te openen in 'de binnenste screen' wordt het commando ctrl - a, ctrl - c. De binnenste screen detachen wordt ctrl - a, ctrl - d enz.

[ Voor 3% gewijzigd door froggie op 10-01-2005 16:20 ]

Pagina: 1