Forum: PC-Programmierung Kommandos auswerten


von T. (Gast)


Lesenswert?

Moin.

Wie programmiert man am Besten eine Anwendung, welche ein Mini Telnet 
Terminal enthalten soll.

Es soll ein Kommandopromt erscheinen und es sollen verschiedene Befehle 
entgegen genomen werden, die dann entsprechende Aktionen ausführen.
Dabei sollen auch Parameter berücksichtigt werden.

Macht man das am Besten über Stringfunktionen (scheiden, teilstrings 
filtern usw) und if then konstrukte?

von Daniel A. (daniel-a)


Lesenswert?

Es gibt eine unendliche vielzahl an möglichkeiten das umzusetzen. Es 
kommt auch darauf wofür man es programiert, und woher die Eingaben 
kommen. Was du beschreibst ist eine Kombination aus 3 Dingen:
  1) Die Eingabeschnittstelle. Im falle von Telnet wäre das eine TCP 
verbindung, denn telnet sendet einfach nur eingaben von stdin über eine 
tcp verbindung, und zeigt auf stdout an, was zurück kommt. Dies 
erfordert dann ein programm, welches tcp anfragen behandelt. Andere 
eingabeschnittstellen ohne telnet währen z.B. direkt über stdin, ohne 
netzwerk kram.
  2) Ein interpreter/shell. Das programm welches die befehle entgegen 
nimmt. beispiele wären bash, sh, dash, csh, python, php, nodejs, ... 
Meistens werden die befehle von stdin oder einer Datei geholt, um das 
Netzwerk kann sich dann telnet oder ssh kümmern.
  3) Die auszuführenden befehle. Hier wird meist zwischen 
Programmkonstrukten (if,while,etc.), builtins (eval,test,...) und 
befehlen unterschieden.

Die umsetzung hängt dann aber immer von den Anforderungen ab.
Auf einem UC könnte z.B. alles in einer anwendung sein, den netzwerkteil 
vom ip stack geregelt werden, der interpreter ein strcmp und die befehle 
eine liste. Den code sollte man dan aber trotzdem sauber unterteilen.
Auf einem PC will man eventuell nur den shell teil umsetzen, oder einen 
Interpreter, jenachdem auch mit fixer befehlsliste.

Es kommt eben ganz darauf an, was genau man wofür genau machen will, es 
gibt nicht wirklich die eine richtige lösung.

von Rolf M. (rmagnus)


Lesenswert?

Ich vermute, du meinst eigentlich kein Telnet-Terminal, sondern einen 
Kommandozeilen-Interpreter. Was Daniel beschreibt, sind mehrere separate 
Programme, die auf einem Unix-artigen System üblicherweise alle 
zusammenspielen, um dir deine Kommandozeile auf den Bildschirm zu 
zaubern. Ein Telnet-Terminal tut dabei nichts weiter, als Eingaben des 
Benutzers entgegenzunehmen und weiterzuleiten, sowie empfangene 
Ausgabedaten anzuzeigen.

T. schrieb:
> Macht man das am Besten über Stringfunktionen (scheiden, teilstrings
> filtern usw) und if then konstrukte?

Diese wird man definitiv dafür benötigen. Zunächst mal musst du dir aber 
eine Syntax für deine Kommandos überlegen, und ob es wie eine typische 
Shell hauptsächlich externe Kommandos aufruft oder nur programminterne 
Funktionen verfügbar machen soll.

von Daniel A. (daniel-a)


Lesenswert?

Rolf M. schrieb:
> T. schrieb:
>> Macht man das am Besten über Stringfunktionen (scheiden, teilstrings
>> filtern usw) und if then konstrukte?
>
> Diese wird man definitiv dafür benötigen.

Nicht unbedingt, man könnte auch einen lexer+parser wie lex und yacc 
oder bison verwenden, um einen Interpreter zu schreiben.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier gibt es einen ziemlich vollständigen Telnet-Server für Python. Er
kümmert sich nicht nur um die TCP-Kommunikation, sondern macht auch
Option-Negotiation und stellt einen einfachen Kommandozeilenparser
einschließlich der automatischen Generierung eine "Hilfe"-Kommandos
bereit:

  https://pypi.python.org/pypi/telnetsrv/0.4

von Mark B. (markbrandis)


Lesenswert?

Yalu X. schrieb:
> Hier gibt es einen ziemlich vollständigen Telnet-Server für Python.

Wenn ich mir den Eröffnungspost so durchlese, dann hält der 
Themenersteller Python wahrscheinlich für eine Schlange. ;-)

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

T. schrieb:
> s soll ein Kommandopromt erscheinen und es sollen verschiedene Befehle
> entgegen genomen werden, die dann entsprechende Aktionen ausführen.
> Dabei sollen auch Parameter berücksichtigt werden.

Lade dir die Lernbetty runter, dort findest du genau was du suchst - und 
bereits weitestgehend fertig vorgekaut.


Und nochwas: ne Python IST ne Schlange.

Und wer 'subtil' für nen Blumendünger hält, hat's auch nicht gerafft.

W.S.

von Garantiert ungiftige Schlange (Gast)


Lesenswert?

Es wäre nun aber trotzdem sinnvoll zu wissen, in welcher 
Programmiersprache das Ganze denn implementiert werden soll.
In Python kann man eben ganz anders vorgehen als etwa in C.
Minimalbeispiel:

1
#!/usr/bin/env python
2
3
def command_foo(args):
4
    print "Command foo called with args " + str(args)
5
6
def command_bar(args):
7
    print "Command bar called with args " + str(args)
8
9
while True:
10
    input = raw_input("> ")
11
12
    cmd  = input.split()[0]
13
    args = input.split()[1:]
14
15
    cmd_func = globals().get("command_" + cmd)
16
17
    if cmd_func:
18
        cmd_func(args)
19
    else:
20
        print cmd + ": Unknown command"

Zusätzlich könnte man dann jeder Kommandofunktion auch noch einen
Dokumentationskommentar geben und ein help-Kommando implementieren,
das die Dokumentationskommentare aller Kommandofunktionen ausgibt.
Versuch das mal so in C ...

von Daniel A. (daniel-a)


Lesenswert?

Ich werfe mal wieder diesen Thread in die Runde 
Beitrag "Re: Arduino Serial ganze wörter abfragen"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.