expect integrieren

s3th*

Neuer User
Mitglied seit
23 Jan 2009
Beiträge
12
Punkte für Reaktionen
0
Punkte
0
Heyho!
bisher hab ich bei jeder freetz-bezueglichen frage immer ne fixe antwort gefunden, leider ist dies jetzt nicht der fall, oder ich bin zu daemlich sie zu finden =)

wie der titel schon sagt, such ich eine möglichkeit das kleine aber feine programm expect in das freetz-image zu integrieren

grund: ich will meine rechner nicht nur per wol von der box starten lassen, sondern auch per ssh und expect-script herunterfahren lassen

hat wer nen hinweis/schubs in die richtige richtung/den bereits offenen thread?

danke im vorraus!
 
Welche Abhängigkeiten hat expect?
 
nu dapper und hardy unveraendert:

libc6 (>= 2.3.4-1)
tcl8.4 (>= 8.4.5)
 
uff....mit tcl weiß ich nicht obs da so gut ausschaut...
 
Angeblich soll "empty" was ähnliches machen, vielleicht schaust du dir das mal an? Denn für Freetz gilt, so einfach geht es nicht:
Code:
[...]
checking for sysconf... yes
checking for strftime... yes
checking for strchr... yes
checking for timezone... yes
checking for siglongjmp... yes
checking for memcpy... yes
checking if WNOHANG requires _POSIX_SOURCE... configure: error: [B]Expect can't be cross compiled[/B]
joerg@joerg-ubuntu:~/freetz-trunk/source/expect-5.43$

Jörg
 
Was macht denn dieses expect? Wir hatten hier bereits in Zusammenhang mit Wol-CGI diskutiert gehabt, ob wir etwas in die Richtung machen. Leider ist die Sache irgendwie eingeschlafen. Da gab es unterschiedliche Ideen es per SSH / SAMBA / eigene Dienste laufen zu lassen. Die Intension dabei war es eine möglichst plattform-breite Lösung zu finden, die sowohl auf Windows als auch auf Linux-Basis sicher laufen würde.
Für Windows würde die SAMBA-Schiene sprechen. Allerdings muss man da sich damit relativ gut auskennen. Und ich weiß nicht, ob sowas aus dem Linux-Samba heraus möglich ist. Unter Windows-Rechner ist ein Herunterfahren auf jeden Fall möglich.
Gegen die SSH-Variante sprach ein relativ hoher Aufwand es einzurichten. Wir waren schon so weit, dass man dafür Zertifikate braucht. Am besten sogar einen extra-Benutzer einrichten, der nur Herunterfahren darf. Denn sonst hat man ein potentielles Risiko auf der Box geschaffen, wenn dort z.B. Root-Zertifikate deines Rechners rumliegen würden.
Die Lösung mit einem eigenen Dienst wäre die eleganteste. Man könnte sich Vieles bei callmonitor abschauen. Allerdings dort sind wir ins Stocken geraten, weil keiner bereit war ein Dienst (wirklich als Dienst, und nicht als userspace-Binary) für Windows zu schreiben.

Deswegen, wenn du es denn willst, kannst du dich hier gerne einbringen. Wir werden dich mit allem Möglichen unterstützen. Aber bitte nicht über SSH. Ich halte es für eine Sackgasse und übertrieben für diese Anwendung. Warum, habe ich bereits im anderen Thread beschrieben.
Wenn die Sache hier wenigstens teilweise angelaufen wäre, könnte ich mir vorstellen mit der Überarbeitung der WOL-cgi so zu unterstützen, dass dort z.B. aktuell aktive PCs zu sehen wären (nicht mit AVM verwechseln, die haben es wie immer beschießen gelöst) und dementsprechend ein Knopf zum Herunterfahren angeboten wäre. Dies setzt natürlich voraus, dass bis dahin alle anderen Box- und Klientseitigen Sachen stehen.

MfG
 
mmhh..irgendwie freunde ich mich auch gerade mit der idee an, das ganze ganz simpel per telnet zu lösen.
da es nen internes netzwerk ist, sprich nen netzwerk in einem zimmer, bei dem die fritzbox nur den kram für diesen raum bereitstellt(internetzugang geschieht über den wg-router, welcher noch dahinter, bzw. davor haengt, gibts da auch keine bedenklichen sicherheitsaspekte, so daß man es auch so loesen koennte:

#!/bin/sh
host=IP.IP.IP.IP
cmd="shutdown -r -t 0"

( echo open ${host}
sleep 1
echo "LOGIN\r"
sleep 1
echo "PASSWORD\r"
sleep 1
echo ${cmd}
sleep 1
echo "\r"
sleep 1
echo exit ) | telnet
 
Genau. Nur dass du einen schlanken telnet-Server für Linux/Windows... usw. bitte findest, der als Dienst fungiert und einen speziellen Benutzer einrichten lässt, der nur das Heruntrfahren darf.

Bei Linux ist sowas überhaupt kein Problem. Vielleicht schreibst du einen Shell-Skript dazu, wenn du schon so ein guter Skripter bist? Dann kann das jeder auf seiner Kiste als ROOT ausführen und schon ist die Sache quasi "installiert". Aber bitte in code-Tags hier posten. Dann könnte man vorstellen deine Idee eventuell bei WOL-CGI zu verwirklichen.

Bei Windows wird es schwieriger. Zu einem sind fast alle FTP-Server für Windows kommerziell oder eine Shareware der kommerziellen Version. Meistens gibt es da keine vernünftige Benutzerverwaltung, geschweige, dass sie mit Windows abgestimmt ist. Ferner sind es keine richtigen Dienste. Ergo: Ein solchens Programm wird gekillt, wenn der Benutzer sich abmeldet. Also, es ist deutlich schwieriger zu verwalten.
Für Windows wäre eher die SAMBA-Schiene dafür sprechen. Ich weiß, dass man per windows eigenen shutdown.exe auch fremde Rechner zum Schlafen schicken kann. Das heißt: Es gibt dafür eine Schnittstelle. Die Frage ist, ob diese Schnittstelle sich irgendwie per SAMBA ansprechen lässt oder per etwas anderes. Es wäre interessant, wenn jemand uns dazu aufschlauen würde.

Dann könnte man in WOL-CGI eine separate Lösung für Windows-Rechner erschaffen. Von mir aus könnte man die "broadcasts" (walsches Wort, nur als Anlehnung an WOL) nach beiden Methoden aussenden. Irgendeine wird schon gewinnen.

MfG
 
Hier ein einfacher Beispielcode für Windows Shutdown in VB

Code:
# Description:
# This VB project enables you to logoff, shutdown Windows or reboot system from within your VB application.
# Logoff Windows from VB, Shutdown Windows from VB, reboot system from VB application, Exit Windows from VB code

Const EWX_LogOff = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4

Private Declare Function ExitWindows _
          Lib "User32" Alias "ExitWindowsEx" _
          (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

Private Sub Command1_Click()
'Shut down windows

          ExitWindows EWX_SHUTDOWN, &HFFFFFFFF
      
End Sub

Private Sub Command2_Click()
'Reboot computer

          ExitWindows EWX_REBOOT, &HFFFFFFFF
      
End Sub

Hier das Ganze als Service, der z.B. auf Port 63000 lauscht (Quelle & Sourcen
Code:
Sub ListenToServer()
  Try
    Dim LISTENING As Boolean
    Dim localhostAddress As IPAddress = IPAddress.Parse(ipAddress.ToString)
    Dim port As Integer = 63000
    '' PORT ADDRESS
    ''''''''''' making socket tcpList 
    ''''''''''''''''
    Dim tcpList As New TcpListener(localhostAddress, port)
    Try
      tcpList.Start()
      LISTENING = True
      Do While LISTENING
        Do While tcpList.Pending = False And LISTENING = True
          ' Yield the CPU for a while.
          Thread.Sleep(10)
        Loop
        If Not LISTENING Then Exit Do

        Dim tcpCli As TcpClient = tcpList.AcceptTcpClient()
        Dim ns As NetworkStream = tcpCli.GetStream
        Dim sr As New StreamReader(ns)
        ''''''''' get data from server'''''''''''''''
        Dim receivedData As String = sr.ReadLine()
        If receivedData = "###SHUTDOWN###" Then
          trShutdown = New Thread(AddressOf shutdown)trShutdown.Start()
        End If
        If receivedData = "###REBOOT###" Then
          trReboot = New Thread(AddressOf reboot)trReboot.Start()
        End If
        If receivedData = "###LOGOFF###" Then
          trLogOff = New Thread(AddressOf logoff)trLogOff.Start()
        End If
        Dim returnedData As String = "###OK###" '& " From Server"
        Dim sw As New StreamWriter(ns)
        sw.WriteLine(returnedData)
        sw.Flush()
        sr.Close()
        sw.Close()
        ns.Close()
        tcpCli.Close()
      Loop
      tcpList.Stop()
    Catch ex As Exception
      'error
      LISTENING = False
    End Try
End Sub

und das zugehörige Send Message Modul, das man für Linux umschreiben könnte:

Code:
Sub SendMessage()
  Dim host As String = txtClientIP.Text
  Dim port As Integer = 63000
  Try
    Dim tcpCli As New TcpClient(host, port)
    Dim ns As NetworkStream = tcpCli.GetStream

    ' Send data to the client.
    Dim sw As New StreamWriter(ns)
    If rbShutdown.Checked = True Then
        sw.WriteLine("###SHUTDOWN###")
    End If

    If rbReboot.Checked = True Then
        sw.WriteLine("###REBOOT###")
    End If
    If rbLogOff.Checked = True Then
        sw.WriteLine("###LOGOFF###")
    End If
    If rbNothing.Checked = True Then
        sw.WriteLine("to")
    End If
    sw.Flush()
    ' Receive and display data.
    Dim sr As New StreamReader(ns)
    Dim result As String = sr.ReadLine()
    If result = "###OK###" Then
        MsgBox("Operation Performed!!!", MsgBoxStyle.Information, _
               "Accepted by client")
    End If

    sr.Close()
    sw.Close()
    ns.Close()
  Catch ex As Exception
    MsgBox(ex.Message)
  End Try
End Sub

Wahrscheinlich kann man das Ganze noch einfacher per WMI / RFC realisieren. Man kann auch einen SOAP Dienst als Wrapper auf den Windows Rechnern packen und per XML den Shutdown auslösen. Das wird aber dann zu sehr OT.

Hier die WMI Lösung:
Code:
Sub RebootComputer( strServer )
    Set objOSSet = GetObject("winmgmts:{(RemoteShutdown)}//" & strServer & "/root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")

    For each objOS in objOSSet
	objOS.Reboot()
    Next
End Sub


' *************************************************************
' Main
' **************************************************************
Dim strComputer
Do
   strComputer = inputbox( "Please enter the name of the computer you want to reboot", "Input" )
Loop until strComputer <> ""

RebootComputer( strComputer )
 
Zuletzt bearbeitet:
windows hat doch soweit ich weis ab XP den telnet server-dienst an board (vista und 7 haben ihn dabei, muss nur "installiert" und aktiviert werden, bei XP ist der dienst lediglich deaktiviert)

somit ist das ja schonmal erledigt..muss nurnoch nen ganz normaler systemuser mit rechten, seiner wahl angelegt werden und das sollte ja reichen?!
oder versteh ich grad was falsch?
 
Könnte funktionieren (telnet auf Windows hab ich noch nie benutzt) - ist aber nicht der Windows Way of Life ;)

Für Admin Sachen wurde WMI "erfunden", DCOM / RFC erlaubt ja auch direkt mit Windows zu sprechen, ohne Zusatzprotokolle, der Server Dienst läuft sowieso auf den Kisten und shutdown.exe nutzt ja diese Schnittstellen (SMB) auch direkt für den Remote Shutdown / Reboot.
 
windows way of life is das nich, das is richtig, is ja auch nen linus-way of life, da ich das ganze von nem linux-host aus machen will..letztendlich scheints mir ne gute loesung, da man komplett bereits vorhandene tools, etc nutzen kann
 
@cando: Kannst du bitte in 2-3 Sätzen für nicht-Admins und keine VB-Kenner etwas rausholen, wie man denn solche VB-Sachen überhaupt als Dienst laufen lassen kann. Bist du dir sicher, dass sie nicht im Userspace laufen, sondern wirklich als Dienst? In deinem Beispiel sind es ja nur VB-Code-Schnippsel. Wie würde man sie dann aufrufen? Braucht man dann noch Tausende dll-s von der entsprechenden VB-Version?

Zur WMI-Schnittstelle wäre es auch nicht schlecht, wenn du uns etwas aufklären würdest. Es reicht ein Paar grobe Hinweise, wie sowas einzurichten wäre und grob, wie es funktioniert, was man dafür braucht.

Ich sehe die Lösung erst dann als Ideal, wenn wir es so hinkriegen würden, dass die Dienste auf einem PC sich automatisch per einen Skript einrichten ließen. Klar, mit Root-rechten, aber eben per install-Skript.

Bei telnet-Geschichte auf Windows sehe ich es schwarz. Denn es wird sich bestimmt noch herausstellen, dass diverse home-Versionen überhaupt keinen onboard-telnet zulassen werden, oder etwas Ähnliches in die Richtung. Bei den Vorschlägen von cando sehe ich dagegen eventuell die Möglichkeit diesen selbst erschaffenen Dienst auch so umzubiegen, dass es telnet-ähnlich redet, sodass die beiden Aufrufe (Linux/Windows) dann halbwegs kompatibel gemacht werden könnten.

Leute, lass uns doch die Arbeit etwas aufteilen.
@s3th*: Kannst du bitte deine Linux-Richtung weiter verfolgen und es so weit verfolgen, dass du die zur Einrichtung eines Klienten notwendigen Schritte in Form eines Shell-Skriptes runterschreibst. Und zwar so, dass da ein neuer Benutzer namens "shutdown" (oder ähnlich) angelegt wird. Als Shell wird ihm "shutdown -h now" oder was in der Richtung verpasst. Somit braucht er sich nur anzumelden, und schon fährt der Rechner herunter. Das war nämlich unsere Ursprungsidee gewesen. Dadurch kann keiner mit dem Account was anderes anrichten, als Rechner runterfahren.

@cando: Kannst du uns bitte auf der Windows-Schiene aufschlauen, wenn du da schon so gut bist.

MfG
 
Also ich muss ja zugeben, dann Windows-Scripte schreiben und Windows-Dienste anlegen in meinen Augen weit über Freetz und das, was es ist, weit hinausgeht...
 
Es kommt drauf an, wie man Windows abriegelt.

In der "normalen" Installation läuft der Server Dienst und der lässt sich remote ansprechen und shutdown auslösen, ohne dass man einen neuen Dienst installiert (über SMB). Das ist der "alte" Weg der Windows Fernwartung.

Die Lösung mit WMI funktioniert, wenn der MS WMI Dienst gestartet ist - (wird neuerdings im Standard mit installiert und gestartet) und ist der neue Weg für alle Fernadministrationstools von MS Produkten - in Verbindung mit dem Scripting Host kann man auch remote Batch Tools basteln für alle erreichbaren PC's und alle Dienste einer Domain (AD, LDAP, Exchange, SQL, SMS, Windows, ...).

Der dritte Weg über SOAP - auch von MS empfohlen - zielt auf verteilte Dienste im Internet / Intranet und Plattformunabhängigkeit. Auch hier muss kein neuer Dienst gebaut werden, sondern der IIS Dienst von Windows beim Setup ausgewählt und gestartet werden (einfacher Web Server). Die SOAP Wrapper gibts auch als Template und man kann alle Dienste per .net / DCOM der Maschine nutzen und eben auch die Systembibliotheken aufrufen. Der Aufruf könnte z.B. per wget erfolgen.

Mit Visual Studio kann auch ganz einfach einen echten Windows Dienst erstellt werden (Whizard / Template) in dem man seinen Listener reinpackt - in beliebiger Sprache (C, C#, VB, ...) - mit ein paar Mausklicks.

Man kann auch eine beliebige windows exe aus dem "userspace" als Windows Dienst registrieren, wenn sie bestimmte Anforderungen erfüllt.

Für den Fall des Shutdowns muss im Grunde nur die User32.dll Funktion aufgerufen werden, um einen Rechner herunterzufahren, der Rest ist nur Kommunikationsschnittstelle.

Weil das alles so einfach ist und sogar aus einem Excel Makro oder Winword Dokument heraus funktionieren könnte - gibt es für Windows so viele erfolgreiche Virenprogrammierer ;).

Das Problem ist weniger der Windows Teil, sondern der Linux Teil. Die Frage ist, wie einfach kann ich welche Windows Netzwerkprotokolle adressieren.

Kann die FritzBox SMB oder WMI Nachrichten versenden - oder muss man auf die Internet Protokolle als gemeinsamen Nenner ausweichen.

Was Telnet angeht - in der XP Home Edition ist der Server glaube ich nicht enthalten - in der XP PRO vielleicht - die Server Versionen haben den standardmäßig dabei. Aus dem Windows Resource Kit kann man den auch nachinstallieren. Es gibt aber auch 3rd party telnet / ssh Server für Windows, die man nutzen könnte. Es gibt auch das kostenlose addon Unix Services for Windows wo ein NFS Client / Server / Proxy und diverse Unix Dienste dabei sind. Auch das könnte man nutzen.

Hier ein opensource ssh server für windows : http://www.kpym.com/2/kpym/download.htm oder http://www.freesshd.com/
 
Zuletzt bearbeitet:
Hübsch, aber wieso landet das nicht im Forenbereich, wo es hingehört? Windows-Serverdienste und Freetz haben wirklich _null_ miteinander zu tun. Aber wenn ihr schon dabei seid: Mein Toaster spinnt....
 
Ich würde sagen, die Diskussion hat sich etwas verselbständigt, aber ursprünglich wollte schon jemand ein Programm in Freetz integrieren. Inzwischen werden eben Alternativen diskutiert, das halte ich für in Ordnung.

Zum Thema Telnet & Co.: Ich habe seit Jahren auf meinem WinXP-PC einen über Portfreigabe von außen sehr gut erreichbaren SSH-Server als Windows-Dienst laufen, und zwar den Cygwin sshd. Als Dienst kriegst Du ihn mittels cygrunsrv zum Laufen. Der XP-Taskmanager zeigt für die zwei Prozesse 4,6 MB (sshd.exe) sowie 3,0 MB (cygrunsrv.exe) an, das erscheint mir völlig in Ordnung.
 
Es geht um Freetz Dienste, die Windows und Linux Rechner remote rebooten sollen als Erweiterung für WOL - Sozusagen "ROL" Reboot on Lan über die FritzBox. Die frage war, wie kann man Windows von der Box aus rebooten - und zwar war die ursprüngliche Idee einen Windows Dienst dafür zu verwenden. Die Antworten waren mögliche Alternativen für einen Windows Dienst bzw. Hinweise, wie man das leicht bauen kann (als alternative zu expect).

Ich halte die Idee, zu diesem Zweck einen einfachen ssh Dienst (open Source) auf Windows laufen zu lassen für die derzeit beste.

  • Verschlüsselte Übertragung (SSL + Authentifizierung per Zertifikate)
  • Weitere Windowsfunktionen nutzbar bei Bedarf (Script auf PC)
  • Normale shutdown windows tools nutzbar
  • (Re)starten von dienste ohne Reboot möglich
  • Möglichkeit einer "remote shell" a la Rudi_Shell über freetz für Windows Rechner hinter der Firewall ohne Portfreigaben.

Die Diskussion ist schon für Freetz interessant - einfach mal über den Tellerrand schauen... :rolleyes:

Was CygWin betrifft - das ist ja ein Linux Emulator auf Windows - erscheint mir etwas zu mächtig um nur ssh zu machen - kann mich aber auch irren.
 
Wie ich schon oben sagte, finde ich ssh etwas übertrieben. Fürs interne Netz (und darum ging es ja) würde etwas telnet-ähnliches ausreichen.
Über kpym und co. So ganz OpenSource mit mehreren Entwicklern usw. wie hier scheinen diese Projekte nicht zu sein. Ich hatte mir kpym vor Paar Monaten installiert gehabt, hatte aber relativ schnell runtergeschmießen. Fragt mich bite nicht warum.
Zum cygwin und seinen Varianten. Ja, OpenSSH läuft z.B. an der cygwin-Basis. Das kann man auch machen, allerdings weiß ich es hier nicht recht, ob man das Ding als Dienst zum laufen kriegt. Und das Hauptproblem an allen diesen cygwin-Ableitungen: Sie laufen mit höchsten Admin-Rechten, oder eben gar nicht. Und ich würde es schon so sehen, dass man diese Herunterfahren/Reboot-Geschichte auf den Rechtenebene von Windows so einrichtet, dass man nicht gleich dadurch den vollen Zugriff zum Rechner bekommt. Im Idealfall nur Herunterfahren.
Das Benutzen der vorhandenen Schnittstellen halte ich persönlich für sinnvoll. Allerdings habe ich aus deiner ausführlichen Erzählung cando genau das verstanden, was ich befürchtet hatte: Der Ottonormalverbraucher mit seiner XP-Home muss erstmal 25 Resource-Kits nachinstallieren, bevor sein Rechner überhaupt die ersten Anforderungen erfüllt.
Wäre den jemand hier in der Lage einen kleinen kastrierten telnet-Server (oder was auch immer) als eine exe-Datei inklusive Quellen zu posten? Der sollte als Dienst lauffähig sein, nur auf Benutzername/Passwort hörchen und eventuell 3-4 definierte Kommandos/Skripte ausführen.
Von mir aus können wir diesen Teil der Diskussion abspalten und irgendwo anders fortführen. Es ist aber wichtig, erstmal eine Schnittstelle für Windows zu definieren. Denn mit Linux ist alles mehr oder weniger klar und wenigstens die Wege sind bekannt.

MfG
 
welcher ottonormalverbraucher will denn auch seinen rechner unter verwendung eines eigenen fritzbox-OS automatisch starten und herunterfahren lassen?
die frage geistert mir grad im kopf rum?! =)
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.