rique1me
Goto Top

Pingscript

Hallo, mein Ausbilder hat mir als Aufgabe gegeben, dass ich ein Script schreiben soll, in dem eine Liste von Rechnern angepingt werden.
Alle Rechner die nicht angepingt werden können, sollen dann in einer Textdatei stehen.

Die Liste der Rechner steht in einer Rechner.txt
Ich weiß nun nicht wie ich da ganz vorgehen soll.

Also ich habe so gut wie keine Ahnung im Bash.

Ich habe angefangen in der Rechner.txt überall ein ping vor zusetzen:

ping Rechner1
ping Rechner2

zursätzlich habe ich dann die Auswertung in eine extra Datei schreiben lassen

ping Rechner1 >>Protokoll.txt
ping Rechner2 >>Protokoll.txt
...

Ist das der Richtige Ansatz oder wie kann man das geschickter lösen?

Content-Key: 99096

Url: https://administrator.de/contentid/99096

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: Biber
Biber 13.10.2008 um 11:35:40 Uhr
Goto Top
Moin rique1me,
willkommen im Forum.

Also ich habe so gut wie keine Ahnung im Bash.
Also arbeitet ihr unter einem Unix-System und nicht unter Windows? Unter welchem?

Ich habe angefangen in der Rechner.txt überall ein ping vor zusetzen:
Lass die sinnvolle Trennung von "Programm" und "Daten" bestehen.
In der Rechner.txt sollten nur die Rechnernamen stehen, sonst nix.
zursätzlich habe ich dann die Auswertung in eine extra Datei schreiben lassen
Wie würdest Du den Unterschied zwischen "Auswertung" und "alles, was mir Ping.exe auf den Bildschirm schreibt" formulieren?

Ist das der Richtige Ansatz oder wie kann man das geschickter lösen?
Auf Oder-Fragen gibt es nur eine Antwort: natürlich!

Bitte nutze die interne Suchfunktion, nachdem Du nochmal überprüft hast, ob Du es unter Batch oder bash lösen willst.

Grüße
Biber
Mitglied: rique1me
rique1me 13.10.2008 um 11:42:45 Uhr
Goto Top
Hey danke für die schnelle Antwort:


Also wir sollen das unter Windows machen.

mit Batch-Dateien

Wie gesagt das Ziel ist es das eine Liste von Rechner angepingt wird.
Und die Rechner die nicht angepingt werden können, sollen in einer .txt-Datei gespeichert werden.
Mitglied: Biber
Biber 13.10.2008 um 11:51:24 Uhr
Goto Top
Moin rique1me,

Danke für die schnelle Beantwortung der ersten zwei Fragen...
Wie gesagt das Ziel ist es das eine Liste von Rechner angepingt wird.
Die Sachverhalte, die ich glaubte verstanden zu haben, habe ich gar nicht nochmal angefragt..*gg

Hast Du meine anderen Nachfragen/Hinweise gelesen?
Die sollten Dich schon auf den richtigen Weg bringen...

ist doch sicher in Deinem Sinne, wenn Du hier Hilfe zur Lösung bekommst und nicht eine Fertig-Lösung, oder?

Grüße
Biber
Mitglied: TuXHunt3R
TuXHunt3R 13.10.2008 um 14:00:47 Uhr
Goto Top
In Batch (nicht getestet, schreibe es jetz kurz aus dem Kopf):

@echo off
for /f %%a in (C:\yourfile.txt) do call :processline %%a
goto :eof

:processline
echo Pinge %1 ...
ping -n 1 %1 | find /i "TTL" >nul  
if errorlevel==0 (
echo %1 pingbar!
) else (
echo %1
echo %1 nicht pingbar! >>c:\pinglog.txt
)

In PowerShell (ebenfalls nicht getestet):
function fcnPing ($geraet) {
$ping = Get-WmiObject win32_pingstatus -Filter "Address='$geraet'"  
    if ($ping.statuscode -eq "0") {  
       $ausgabe = $geraet + " pingbar!"  
       write-host $ausgabe
    } else {
       $ausgabe = $geraet + " nicht pingbar!"  
       write-host $ausgabe
       $ausgabe | out-file -filepath C:\pinglog.txt -encoding default -append
    }
}

foreach ($pc in get-content C:\yourfile.txt) {fcnPing $pc}

So.
Nun erwarte ich eine kurze Erklärung zumindest von einem der beiden Scripts in Pseudocode, damit der Lerneffekt gewährleistet ist.
Mitglied: rique1me
rique1me 13.10.2008 um 14:25:39 Uhr
Goto Top
Erstmal vielen Dank es läuft halbwegs.

Er sagt bei mir, dass alle Rechner anpingbar sind.

Dürfte aber nicht sein, da einige Rechner definitiv aus sind.
Mitglied: TuXHunt3R
TuXHunt3R 13.10.2008 um 15:04:32 Uhr
Goto Top
Welches hast du genommen?
Das Batchscript oder das in PowerShell?

Wenn du das Batchscript genommen hast, stimmt meine Errorlevel-Abfrage nicht.
Unter welchem Betriebsystem arbeitest du?
Die Errorlevel-Abfrage ist von OS zu OS unterschiedlich....


Versuchs mal so:
if errorlevel 0 (
Oder so:
if "%errorlevel%"=="0" (  
Oder so:
if %errorlevel%==0 (
Oder so:
if %errorlevel%=0 (

PS: Hast du den Code verstanden? Ich will eine kurze Erklärung, was das Script genau macht ("Es pingt alle Clients in der Liste" reicht nicht).
Mitglied: rique1me
rique1me 13.10.2008 um 15:05:50 Uhr
Goto Top
also ich nutze Windows XP SP3

habe die Batch genommen:

so sieht das bei mir aus:


for /f %%a in (i:\test\Rechner.txt) do call :processline %%a

goto :eof

:processline

echo Pinge %1 ...

ping -n 1 %1 | find /i "TTL" >nul

if errorlevel==0 (

echo %1 pingbar! >>i:\test\pinglog.txt

) else (

echo %1 nicht pingbar! >>i:\test\pinglog.txt

)
Mitglied: rique1me
rique1me 13.10.2008 um 15:10:13 Uhr
Goto Top
es läuft jetzt mit der dritten version

vielen dank
Mitglied: TuXHunt3R
TuXHunt3R 13.10.2008 um 15:15:31 Uhr
Goto Top
Wie gesagt: Könntest du mir kurz beschreiben, was genau das Script macht? Du willst ja schliesslich was lernen und dein Lehrer könnte dir diese Frage ja auch stellen. Dann hättest du bereits eine gute Antwort....
Mitglied: rique1me
rique1me 13.10.2008 um 15:29:45 Uhr
Goto Top
Naja ich kann es mal versuchen.

also

for /f %%a in (i:\test\Rechner.txt) do call :processline %%a

bedeutet, dass ein Prozess (prozessline) in meiner Rechner.txt gestartet wird.

goto :eof

heißt, dass zum Ende der Datei gesprungen werden soll

:processline

ist ein verweis von dem for

echo Pinge %1 ...

ist eine ausgabe, die sagt, dass folgende rechner gepingt werden

ping -n 1 %1 | find /i "TTL" >nul

der erste teil ist der eigentliche pingbefehl. (Mit dem zweiten teil kann ich nicht wirklich was anfangen.

if "%errorlevel%"=="0" (
echo %1 pingbar! >>i:\test\pinglog.txt

wenn keine fehlermeldung kommt soll ausgegeben werden das der rechner pingbar ist.
das wird in der folgenden datei gespeichert.

) else (
echo %1 nicht pingbar! >>i:\test\pinglog.txt
)

ansonsten soll die meldung rechnerxyz nicht pingbar! in die pinglog.txt gespeichert werden


ist jetzt alles bisschen komisch erklärt aber wie gesagt, mach das jetzt zum ersten mal
Mitglied: TuXHunt3R
TuXHunt3R 13.10.2008 um 16:15:03 Uhr
Goto Top
War ja schon gar nicht schlecht. Zur Ergänzung/Berichtigung:

for /f %%a in (i:\test\Rechner.txt) do call :processline %%a
Ist eigentlich eine Foreach-Schleife. Für jede Linie im Texfile Rechner.txt wird zum Sprungpunkt "processline" gesprungen. Dabei wird der Parameter %%a mitgegeben, was eine Variable ist, in der dein Rechnername aus dem Textfile mitgegeben wird.

ping -n 1 %1 | find /i "TTL" >nul  
Führt zuerst mal einen Ping aus. "-n 1" bedeutet, dass nur ein Ping-Paket geschickt wird.
Danach wird mit dem Befehl "find" in der Ausgabe des Pings nach der Zeichenfolge "TTL" gesucht. Dies darum, weil die Ausgabe "Antwort von ..." (also ein erfolgreicher Ping) die einzige Ausgabe von Ping ist, die die Zeichenfolge "TTL" drin hat. Die anderen möglichen Ausgaben von Ping ("Unknown Host", "Request Timed Out", "Destination Host Unreacheable") haben diese Zeichenfolge alle nicht drin. Kurz gesagt: Ist die Zeichenfolge "TTL" in der Ausgabe drin, war der Ping erfolgreich.
Das ">nul" sorgt dafür, dass für diesen Befehl keine Bildschirmausgabe ausgegeben wird.

Wenn nun also die Zeichenkette "TTL" gefunden wird (der Ping also erfolgreich war), generiert der find-Befehl einen Errorlevel mit dem Inhalt "0". Wenn diese nicht gefunden wird, generiert der find-Befehl einen Errorlevel mit dem Inhalt "1". Dann kommt die folgende Abfrage zum Zug:
if errorlevel==0 (
So wird unterschieden, ob der PC nun pingbar ist oder nicht.

PS: Fürs erste Mal wars nicht schlecht....

PPS: Ich weiss, theoretisch könnte man mit dem Find-Befehl auch nach "Antwort" oder so etwas suchen. Das Script funktioniert dann aber nicht mehr, wenn du an einen Rechner kommst, auf dem ein anderssprachiges OS installiert ist. Mit der Suche nach der Zeichenfolge "TTL" funktioniert dein Script überall auf der Welt.
Mitglied: miniversum
miniversum 13.10.2008 um 18:27:31 Uhr
Goto Top
Nur als Anmerkung:
Das Find kann man auch ganz weglassen. Ein einfaches:
ping -n 1 %1 >nul
reicht auch. Der Ping-Befehl selbst gibt als Errorlevel 0 zurück wenn ein Pingversuch erfolgreich war und ein errorlevel ungleich 0 wenn er schief ging.
Mitglied: TuXHunt3R
TuXHunt3R 13.10.2008 um 21:32:25 Uhr
Goto Top
Das wusste ich nicht. War das unter Windows 2000 auch schon so? Dort habe ich nämlich gelernt zu batchen...
Mitglied: miniversum
miniversum 13.10.2008 um 22:32:21 Uhr
Goto Top
Keine Ahnung. aber bei xp ists so.
Da ginge also auch:
ping -n 1 %ip%>NUL && echo %ip% erreichbar
Mitglied: bastla
bastla 14.10.2008 um 08:00:14 Uhr
Goto Top
@TuXHunt3R
War das unter Windows 2000 auch schon so?
Hätte so sein sollen, funktionierte aber nicht, und deshalb die Klimmzüge mit "find"/"findstr" ...

Grüße
bastla
Mitglied: TuXHunt3R
TuXHunt3R 14.10.2008 um 18:36:57 Uhr
Goto Top
@bastla

Na also, wusst ichs doch....
Mitglied: miniversum
miniversum 14.10.2008 um 20:07:37 Uhr
Goto Top
Also unter XP funktionierts auf jeden Fall (bei mir Zuhause zumindest)
Mitglied: TuXHunt3R
TuXHunt3R 14.10.2008 um 20:38:59 Uhr
Goto Top
@ miniversum

Das glaub ich dir schon, aber wie gesagt, ich habs unter Windows 2000 gelernt und habe es einfach so weiter verwendet....