Einfaches Gui für shell befehle

hallo!

ich würde gerne in Gambas2 (fast genau wie VB nur für Linux) eine Oberfläche für ein paar shell Befehle schreiben!

genau genommen geht es um sowas:

telnet host.tld 333 (hier muss es dan eigenständig enter klicken)
helo irgentwas (wieder enter…)

usw…

manches müssen variablen sein die man selbst eingeben kann, manches textteile wo dafor eine variable steht… usw…

ich hab einige handbücher durchblättert, weis aber nicht mal nach was ich suchen soll…
wäre nett wenn mir jemand helfen könnte, oder tipps geben könnte!

danke schonmal
l.g. seta

Nochwas:
es kann ja vorkommen das fehlerwerte ausgegeben werden bei telnet, ich hätte also gerne angezeigt was passiert wenn möglich…

auch dazu fand ich nichts…

l.g. seta

Hallo,

ich würde gerne in Gambas2 (fast genau wie VB

wie welches VB? Hier geht es um VB4 VB5, VB6, VBA, VBS

Weiter oben gibt es ein Brett ‚.NET und C#‘ für VB.Net 2003/2005/2008.

Für VB6 habe ich ein entsprechendes Programm, verwende so etwas selbst.

Gruß Rainer

also .net und c is es sicher nicht, ist ja ein linux clon^^

also laut hersteller, kann man einfach VB5 hernehmen…

l.g. seta

Hallo,

also .net und c is es sicher nicht, ist ja ein linux clon^^

das war schon klar, aber wovon war inetressant.

also laut hersteller, kann man einfach VB5 hernehmen…

Das ist schon mal gut, dann bist Du im richtigen Brett.
Nur ein Problem hast Du, Dir fehlen vermutlich die ganzen DLLs, oder kannst Du die auch verwenden? Ohne auf die API zurückzugreifen bekommst Du mit VB kein Telnet.

Um nicht zu viel Code zu posten und weil ich fürchte, daß es nichts wird, mal nur die Deklaration für das benötigte Socket-Modul:

Public Sockets As New Collection
Public usedcount%

Public Enum sockType
 sockClosed = 1
 sockListening = 2
 sockConnecting = 3
 sockConnected = 4
End Enum

Public Const FD\_SETSIZE = 64

Public Const CSocketMsg = 2000

Public Type fd\_set
 fd\_count As Integer
 fd\_array(FD\_SETSIZE) As Integer
End Type

Public Type timeval
 tv\_sec As Long
 tv\_usec As Long
End Type

Public Type Inet\_address
 Byte4 As String \* 1
 Byte3 As String \* 1
 Byte2 As String \* 1
 Byte1 As String \* 1
End Type

Public Type HostEnt
 h\_name As Long
 h\_aliases As Long
 h\_addrtype As Integer
 h\_length As Integer
 h\_addr\_list As Long
End Type
Public Const hostent\_size = 16

Public Type servent
 s\_name As Long
 s\_aliases As Long
 s\_port As Integer
 s\_proto As Long
End Type
Public Const servent\_size = 14

Public Type protoent
 p\_name As Long
 p\_aliases As Long
 p\_proto As Integer
End Type
Public Const protoent\_size = 10

Public Const IPPROTO\_TCP = 6
Public Const IPPROTO\_UDP = 17

Public Const INADDR\_NONE = &HFFFF
Public Const INADDR\_ANY = &H0

Public Type sockaddr
 sin\_family As Integer
 sin\_port As Integer
 sin\_addr As Long
 sin\_zero As String \* 8
End Type
Public Type sockaddrbyte
 sin\_family As Integer
 sin\_port As Integer
 sin\_addr1 As Byte
 sin\_addr2 As Byte
 sin\_addr3 As Byte
 sin\_addr4 As Byte
 sin\_zero As String \* 8
End Type
Public Const sockaddr\_size = 16

Public Const WSA\_DESCRIPTIONLEN = 256
Public Const WSA\_DescriptionSize = WSA\_DESCRIPTIONLEN + 1

Public Const WSA\_SYS\_STATUS\_LEN = 128
Public Const WSA\_SysStatusSize = WSA\_SYS\_STATUS\_LEN + 1

Public Type WSADataType
 wVersion As Integer
 wHighVersion As Integer
 szDescription As String \* WSA\_DescriptionSize
 szSystemStatus As String \* WSA\_SysStatusSize
 iMaxSockets As Integer
 iMaxUdpDg As Integer
 lpVendorInfo As Long
End Type

Public Const INVALID\_SOCKET = -1
Public Const SOCKET\_ERROR = -1

Public Const SOCK\_STREAM = 1
Public Const SOCK\_DGRAM = 2

Public Const MAXGETHOSTSTRUCT = 1024

Public Const AF\_INET = 2
Public Const PF\_INET = 2

Public Type LingerType
 l\_onoff As Integer
 l\_linger As Integer
End Type

'---Windows System Functions
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&amp:wink:
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long

'---async notification constants
Public Const SOL\_SOCKET = &HFFFF&
Public Const SO\_LINGER = &H80&
Public Const FD\_READ = &H1&
Public Const FD\_WRITE = &H2&
Public Const FD\_ACCEPT = &H8&
Public Const FD\_CONNECT = &H10&
Public Const FD\_CLOSE = &H20&

'---SOCKET FUNCTIONS
Public Declare Function acceptsocket Lib "wsock32.dll" Alias "accept" (ByVal S As Long, addr As sockaddr, addrlen As Long) As Long
Public Declare Function bind Lib "wsock32.dll" (ByVal S As Long, addr As sockaddr, ByVal namelen As Long) As Long
Public Declare Function closesocket Lib "wsock32.dll" (ByVal S As Long) As Long
Public Declare Function connectsocket Lib "wsock32.dll" Alias "connect" (ByVal S As Long, addr As sockaddr, ByVal namelen As Long) As Long
Public Declare Function ioctlsocket Lib "wsock32.dll" (ByVal S As Long, ByVal cmd As Long, argp As Long) As Long
Public Declare Function getpeername Lib "wsock32.dll" (ByVal S As Long, sname As Any, namelen As Long) As Long
Public Declare Function getsockname Lib "wsock32.dll" (ByVal S As Long, sname As Any, namelen As Long) As Long
Public Declare Function getsockopt Lib "wsock32.dll" (ByVal S As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long
Public Declare Function setsockopt Lib "wsock32.dll" (ByVal S As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long
Public Declare Function htonl Lib "wsock32.dll" (ByVal hostlong As Long) As Long
Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer
Public Declare Function inet\_addr Lib "wsock32.dll" (ByVal cp As String) As Long
Public Declare Function inet\_ntoa Lib "wsock32.dll" (ByVal inn As Long) As Long
Public Declare Function listensocket Lib "wsock32.dll" Alias "listen" (ByVal S As Long, ByVal backlog As Long) As Long
Public Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long
Public Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Integer
Public Declare Function recv Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long
Public Declare Function send Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long
Public Declare Function Socket Lib "wsock32.dll" Alias "socket" (ByVal af As Long, ByVal s\_type As Long, ByVal Protocol As Long) As Long
Public Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr\_len As Long, ByVal addr\_type As Long) As Long
Public Declare Function gethostbyname Lib "wsock32.dll" (ByVal host\_name As String) As Long
Public Declare Function gethostname Lib "wsock32.dll" (ByVal host\_name As String, ByVal namelen As Long) As Long
Public Declare Function getprotobynumber Lib "wsock32.dll" (ByVal proto As Integer) As Long
Public Declare Function getprotobyname Lib "wsock32.dll" (ByVal proto\_name As String) As Long
Public Declare Function getservbyport Lib "wsock32.dll" (ByVal Port As Long, ByVal proto As String) As Long
Public Declare Function getservbyname Lib "wsock32.dll" (ByVal serv\_name As String, ByVal proto As String) As Long

'---WINDOWS EXTENSIONS
Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVR As Long, lpWSAD As WSADataType) As Long
Public Declare Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare Sub WSASetLastError Lib "wsock32.dll" (ByVal iError As Long)
Public Declare Function WSAGetLastError Lib "wsock32.dll" () As Long
Public Declare Function WSAAsyncSelect Lib "wsock32.dll" (ByVal S As Long, ByVal hwnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal wndrpcPrev As Long, ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const GWL\_WNDPROC = (-4)

' ICMP
Public Type IP\_OPTION\_INFORMATION
 TTL As Byte ' Time to Live (used for traceroute)
 Tos As Byte ' Type of Service (usually 0)
 flags As Byte ' IP header Flags (usually 0)
 OptionsSize As Long ' Size of Options data (usually 0, max 40)
 OptionsData As String \* 128 ' Options data buffer
End Type

Public Type IP\_ECHO\_REPLY
 Address(0 To 3) As Byte ' Replying Address
 Status As Long ' Reply Status
 RoundTripTime As Long ' Round Trip Time in milliseconds
 DataSize As Integer ' reply data size
 Reserved As Integer ' for system use
 data As Long ' pointer to echo data
 Options As IP\_OPTION\_INFORMATION ' Reply Options
End Type

Public Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
Public Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal HANDLE As Long) As Boolean
Public Declare Function IcmpSendEcho Lib "ICMP" (ByVal ICMPHandle As Long, ByVal DestAddress As Long, ByVal RequestData As String, ByVal RequestSize As Integer, RequestOptns As IP\_OPTION\_INFORMATION, ReplyBuffer As IP\_ECHO\_REPLY, ByVal ReplySize As Long, ByVal TimeOut As Long) As Boolean

Public Const WS\_OVERLAPPED = &H0&
Public Const WS\_MINIMIZEBOX = &H20000
Public Const WS\_MAXIMIZEBOX = &H10000
Public Const WS\_SYSMENU = &H80000
Public Const WS\_THICKFRAME = &H40000
Public Const WS\_CAPTION = &HC00000 ' WS\_BORDER Or WS\_DLGFRAME
Public Const WS\_VISIBLE = &H10000000
Public Const WS\_OVERLAPPEDWINDOW = (WS\_OVERLAPPED Or WS\_CAPTION Or WS\_SYSMENU Or WS\_THICKFRAME Or WS\_MINIMIZEBOX Or WS\_MAXIMIZEBOX)

Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Public Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long

Meinst Du, daß das bei Dir laufen kann, wenn Du den ganzen Code hast?
Das vollständige Projekt aus VB6 wird Deine IDE sicher nicht laden, aber ich kann Dir gern den gesamten Quellcode mit ein paar Erklärungen in einem Textfile posten, um ihn mit ‚copy and past‘ leicht in Dein Projekt einfügen zu können. Wie Du aber siehst, musst Du die ganzen benötigten Dlls haben und verwenden können.

Gruß Rainer

Nochmal genauer: Bitte Hilfe!’
’ Gambas class file
PUBLIC SUB Button1_Click()
SHELL „telnet mail.host.ch 25“
END

PUBLIC SUB Button2_Click()
SHELL „HELO [email protected]
END

er erkennt den zweiten befehl nicht…
er gibt mir aus das Helo nicht erkannt wird, obwohl man nach dem connecten zum
server normal immer helo macht, in der shell funktioniert es so auch

lg.

Hallo

es kann ja vorkommen das fehlerwerte ausgegeben werden bei
telnet, ich hätte also gerne angezeigt was passiert wenn
möglich…

Und da fangen die Probleme an. Du muesstest das Telnet Fenster auslesen, was wiederrum nicht mal eben nebenbei gemacht ist.
Warum nimmst du nicht Rainer’s Vorschlag an ?

MfG Alex

Hi Alex,

Warum nimmst du nicht Rainer’s Vorschlag an ?

weil’s Linux ist und die API-Aufrufe nicht funktionieren werden.

Einen Telnetclient wird man so nicht schreiben können.

Gruß Rainer

hallo reiner danke für deine hilfe

ich hoffe du hast den ganzen code jetzt nicht selbst geschrieben, den ich glaub fast das es wohl doch nicht wie VB5 ist…
(es ist wirklich schlimm dar die meisten entwickler umgebungen im Linux nicht existieren, also kann man nur zeilen scripten… aber guis? als angfäner? nja)

das wäre ein code von mir:
’ Gambas class file
PUBLIC SUB Button1_Click()
SHELL „telnet mail.bluewin.ch 25“
END
PUBLIC SUB Button1_Leave()
PRINT „helo [email protected]
END

da bekomm ich ohne weiteres tellnet zugriff, eben der linux vorteil, die shell ist immer und überall dabei^^

hättest du vieleicht eine idee wie ich nach dem PRINT ein „enter“ einfügen kann das der befehl direkt ausgeführt wird?

(bitte verurteile jetzt nicht was ich damit vorhaben könnte… ich dachte nur das wäre mal ein gutes lern projekt, aber ich scheitere ständig an neuem)

danke jedenfalls!
l.g. seta

Hallo,

’ Gambas class file
PUBLIC SUB Button1_Click()
SHELL „telnet mail.host.ch 25“
END

PUBLIC SUB Button2_Click()
SHELL „HELO [email protected]
END

er erkennt den zweiten befehl nicht…

Wenn Du das Konsolenfenster mit Shell startest, kannst Du anschließend nur noch mit Sendkeys Tastenanschläge an die Konsole senden.

Bedingung, daß das funktioniert ist, daß das Konsolenfenster so lange auch wirklich im Vordergrund bleibt. Rückmeldungen bekommst Du auch keine.

Die einzige Möglichkeit ist eine Zeitsteuerung und hoffen, daß alles klappt. Mit Glück funktioniert das in drei von fünf Versuchen, wie es soll.

Gruß Rainer

Kann auch nicht funktionieren. Was macht denn shell?
Shell für eine Datei aus. Wobei man ihr auch Parameter
uebergeben kann.
Im ersten Beispiel rufst du die Telent.exe auf und übergibst
ihr als Parameter mail.host.ch 25 wobei du beim Klicken auf
Button2 folgendes versuchst „HELO [email protected]“ Hier wird nun
nach einer ausführbaren Datei namens Helo ( Wobei Hello mit 2
L geschrieben wird :wink: )gesucht. das es die nicht gibt, ist
klar und somit kann das Statement nicht funktionieren.

danke für deinen denkanschlag, aber erstmal ich rufe keine exe auf!? sowas gibs da gar nicht^^ telnet ist direkt in die shell integriert…

man schreibt übrigens wirklich helo, warum weis ich nicht genau, is aber bei jedem mailserver so

ich weis das es schwer für euch ist mir zu helfen, dar ich ganz andre möglichkeiten habe… aber es gibt sonst keine ort wo man etwas fragen kann und so gute antworten bekommt wie hier…

also momentan schweitere ich daran das ich den „helo …“ part irgentwie durch eine art viruelles „enter“ bestätigen müsste…

l.g. seta

er erkennt den zweiten befehl nicht…

Wenn Du das Konsolenfenster mit Shell startest, kannst Du
anschließend nur noch mit Sendkeys Tastenanschläge an die
Konsole senden.

Bedingung, daß das funktioniert ist, daß das Konsolenfenster
so lange auch wirklich im Vordergrund bleibt. Rückmeldungen
bekommst Du auch keine.

Die einzige Möglichkeit ist eine Zeitsteuerung und hoffen, daß
alles klappt. Mit Glück funktioniert das in drei von fünf
Versuchen, wie es soll.

Gruß Rainer

mit SHELL HELO… funktioniert es sowieso nicht, hab es jetzt durch PRINT HELO … ersetzt und er schreibt es mit zumindest schonmal hin

relevant ist wohl auch das die shell nicht offen ist, dar sowieso ganz linux nur eine anhäufung an shell befehlen ist, und die shell immer ausgeführt werden kann sollte dies aber kein problem sein, und in meiner entwickler umgebung bekomme ich angezeigt was die shell macht bzw die befehle ausgeben

l.g.

hier auch noch mal antworten:

ich brauch keinen clienten, ich muss nur die befehle ausführen (können), das ist linux^^

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich hoffe du hast den ganzen code jetzt nicht selbst
geschrieben,

nein. Den habe ich von http://www.PlanetSourcecode.com :smile:

den ich glaub fast das es wohl doch nicht wie VB5
ist…
(es ist wirklich schlimm dar die meisten entwickler umgebungen
im Linux nicht existieren, also kann man nur zeilen
scripten… aber guis? als angfäner? nja)

das wäre ein code von mir:
’ Gambas class file
PUBLIC SUB Button1_Click()
SHELL „telnet mail.bluewin.ch 25“
END

Bis hier her sieht das gut aus …

PUBLIC SUB Button1_Leave()
PRINT „helo [email protected]
END

… das kann nicht gehen. Wenn Dir eine wackelige Lösung, die nur manchmal funktioniert genügt, dann geht es ab hier mit Timern und Sendkeys weiter.

*gg* sorry, das steht ja jetzt etwas anderes. :smile: Ob das geht, kannst nur Du sehen.

da bekomm ich ohne weiteres tellnet zugriff, eben der linux
vorteil, die shell ist immer und überall dabei^^

Das geht mit Windows ganz genau so. Da heißt die Shell nur ‚Eingabeaufforderung‘.

hättest du vieleicht eine idee wie ich nach dem PRINT ein
„enter“ einfügen kann das der befehl direkt ausgeführt wird?

Der string kommt doch nicht in der Konsole an, oder? Falls doch, weil es eben Linux ist …

PRINT „helo [email protected]“ & Chr(13)

(bitte verurteile jetzt nicht was ich damit vorhaben könnte…
ich dachte nur das wäre mal ein gutes lern projekt, aber ich
scheitere ständig an neuem)

‚anstellen‘ kannst Du auf dem Niveau ohnehin nichts. :smile:

Gruß Rainer

Hallo,

das wäre ein code von mir:
’ Gambas class file
PUBLIC SUB Button1_Click()
SHELL „telnet mail.bluewin.ch 25“
END

Bis hier her sieht das gut aus …

PUBLIC SUB Button1_Leave()
PRINT „helo [email protected]
END

… das kann nicht gehen. Wenn Dir eine wackelige Lösung,
die nur manchmal funktioniert genügt, dann geht es ab hier mit
Timern und Sendkeys weiter.

Timern, sendkeys, ok werde mal das handbuch durchforsten

da bekomm ich ohne weiteres tellnet zugriff, eben der linux
vorteil, die shell ist immer und überall dabei^^

Das geht mit Windows ganz genau so. Da heißt die Shell nur
‚Eingabeaufforderung‘.

Ja sicher, aber die Eingabeforderung ist einfach nicht dauerpräsent

hättest du vieleicht eine idee wie ich nach dem PRINT ein
„enter“ einfügen kann das der befehl direkt ausgeführt wird?

Der string kommt doch nicht in der Konsole an, oder? Falls
doch, weil es eben Linux ist …

Ich denke eben schon, das ganze programm wertet mir die ergebnisse ja schon in einer console aus… und wie gesagt die console ist immer prsäsent, wemm ich manuell einfach enter klicke (in der auswertungs konsole des programms) funktioniert es zumindest

PRINT „helo [email protected]“ & Chr(13)

hab mal vorsichtshalber die visual basic kompaktiblität aktiviert, aber der befehl bewirkt nichts…

(bitte verurteile jetzt nicht was ich damit vorhaben könnte…
ich dachte nur das wäre mal ein gutes lern projekt, aber ich
scheitere ständig an neuem)

‚anstellen‘ kannst Du auf dem Niveau ohnehin nichts. :smile:

ok… darauf geh ich mal nicht weiter ein… *hihi*

l.g. seta

Hi,

Timern, sendkeys, ok werde mal das handbuch durchforsten

sieht so aus, als wäre da ein erheblicher Unterschied zu VB, dann brauchst Du das nicht.

Ja sicher, aber die Eingabeforderung ist einfach nicht
dauerpräsent.

Stimmt. Das finde ich auch gut. :smile:

Ich denke eben schon, das ganze programm wertet mir die
ergebnisse ja schon in einer console aus… und wie gesagt die
console ist immer prsäsent, wemm ich manuell einfach enter
klicke (in der auswertungs konsole des programms) funktioniert
es zumindest

PRINT „helo [email protected]“ & Chr(13)

hab mal vorsichtshalber die visual basic kompaktiblität
aktiviert, aber der befehl bewirkt nichts…

Sieh mal in die Hilfe. In alten Basics hieß das mal Chr$(13)

Gruß Rainer

Shell Perlscript…
#!/usr/bin/perl
system(„telnet mail.bluewin.ch 25“);
system(„helo [email protected]“);

was mach ich dabei falsch?
der erste befehl wird ausgeführt, aber der 2te nicht mehr!?

l.g. seta

Sieh mal in die Hilfe. In alten Basics hieß das mal Chr$(13)

das habe ich auch gefunden, ja… aber das giebt nur einen zeilen umbruch aus, ohne die „enter“ typische bestätigung…

ich hab mir grad was andres überlegt, ich lasse einfach ein perl script generieren, die chmods setzen, und anschliesend ausführen… ich glaube das das sowohl einfacher als auch praktischer ist (besonders wegen dem timeout des servers)

doch habe ich bei perl wieder das selbe problem, hab schon im perl bereich gefragt, vieleicht hast du auch ne ahnung davon und könnest mal schaun^^

l.g. seta
ps: fettes danke für die hilfe!

Hallo,

vieleicht hast du auch ne ahnung davon
und könnest mal schaun^^

sorry, nein. Pearl verstehe ich gar nicht.

Gruß Rainer