Sieht auch nach einer Möglichkeit aus, muss ich mir noch überlegen. Ist nämlich eine Aufgabe für die Schule. Danke für den Hinweis
Der Code-Schnippsel-Thread
-
-
fping ist das Mittel der Wahl.
Alle pingen: fping -a -g 192.168.178.0/24
Alle pingen, nur die zeigen die online sind: fping -a -q -g 192.168.178.0/24
Jede Menge weiterer Optionen: man fping -
Alle druckbaren ASCII-Zeichen ausgeben.C
Alles anzeigen#include <stdio.h> #include <stdlib.h> #ifdef DEBUG #define OUTPUT "%02x " #else #define OUTPUT "%c " #endif int main(void) { unsigned char i, j; for (i=0x20; i<=0x70; i+=0x10) { for (j=0x00; (j<=0x0F && i+j!=0x7F); j++) { printf(OUTPUT, i+j); } printf("\n"); } return EXIT_SUCCESS; }
Neu: jetzt auch funktional!
Codeimport Data.Char (chr) import Data.List (intersperse) main :: IO () main = putStr $ unlines [ (intersperse ' ' [chr x | x <- [0x00 + i .. 0x0f + i], x /= 0x7f]) | i <- [0x20, 0x30.. 0x70]]
Ich gebs zu, ein bisschen unübersichtlich und nichmal konsistent. -
fping ist das Mittel der Wahl.Alle pingen: fping -a -g 192.168.178.0/24
Alle pingen, nur die zeigen die online sind: fping -a -q -g 192.168.178.0/24
Jede Menge weiterer Optionen: man fpinghttps://github.com/robertdavidgraham/masscan für /0er Netz.
-
Ich bin grade n bisschen verwirrt.
Mein Backup-Script sieht so aus
Code
Alles anzeigen############################# # Backup - Client-Part # Author Tobias Koehler # Mail: tk1908@gmail.com # Version 1.5 ############################# #!/bin/bash # Variablen definieren parameter=$1 # Funktionen definieren function unix_nfs() { rsync -avu ${HOME}/Dokumente /data/beer/save/Dokumente } function unix_ssh() { rsync -avz ssh ${HOME}/Dokumente backup@beer.tknet.lan:/data/save/Dokumente } function rsyncd() { #etherwake <MAC-Adresse> #sleep 30 #ping -c1 storshell.tknet.lan > /dev/null if [$? -ne "0" ]; then mailx -s "Server nicht erreichbar! Backup fehlgeschlagen!" exit 1 fi rsync -avz /data/ backup@storshell.tknet.lan::backup ssh -i .ssh/backup_rsa backup@storshell.tknet.lan "mailx -s "Backup finished! Shutdown has been iniciated at $(date+ %Y-%m-%d-%h-%M); shutdown -h 15"" } function restore { rsync -avu /data/beer/Dokumente ${HOME}/Dokumente } case $parameter in unix_nfs) unix_nfs() ;; unix_ssh) unix_ssh() ;; rsyncd) rsyncd() ;; *) echo Es stehen nur die Funktionen unix_nfs, unix_ssh und rsyncd zur Verfügung! ;; esac
Wenn Ich das Script ausführen möchte, bekomme ich folgende Meldung:
Code
Alles anzeigen/usr/bin/Backup: Zeile 42: Syntaxfehler beim unerwarteten Wort `;;' /usr/bin/Backup: Zeile 42: ` ;;' [root@gin tkoehler]# Backup /usr/bin/Backup: Zeile 42: Syntaxfehler beim unerwarteten Wort `;;' /usr/bin/Backup: Zeile 42: `;;' [root@gin tkoehler]# Backup /usr/bin/Backup: Zeile 42: Syntaxfehler beim unerwarteten Wort `;;' /usr/bin/Backup: Zeile 42: ` ;;' [root@gin tkoehler]# Backup /usr/bin/Backup: Zeile 42: Syntaxfehler beim unerwarteten Wort `;;' /usr/bin/Backup: Zeile 42: ` ;;' [root@gin tkoehler]# Backup /usr/bin/Backup: Zeile 42: Syntaxfehler beim unerwarteten Wort `;;' /usr/bin/Backup: Zeile 42: ` ;;' [root@gin tkoehler]#
Edit: Ok hatte Syntaxfehler drin.
So funkts
Code
Alles anzeigen############################# # Backup - Client-Part # Author Tobias Koehler # Mail: tk1908@gmail.com # Version 1.5 ############################# #!/bin/bash # Variablen definieren parameter=$1 # Funktionen definieren function unix_nfs(){ rsync -avu ${HOME}/Dokumente /data/beer/Dokumente } function unix_ssh(){ rsync -avz ssh ${HOME}/Dokumente backup@beer.tknet.lan:/data/beer/Dokumente } function rsyncd(){ #etherwake <MAC-Adresse> #sleep 30 #ping -c1 storshell.tknet.lan > /dev/null if [$? -ne "0" ]; then mailx -s "Server nicht erreichbar! Backup fehlgeschlagen!" exit 1 fi rsync -avz /data/ backup@storshell.tknet.lan::backup ssh -i .ssh/backup_rsa backup@storshell.tknet.lan "mailx -s "Backup finished! Shutdown has been iniciated at $(date+ %Y-%m-%d-%h-%M); shutdown -h 15"" } function restore(){ rsync -avu /data/beer/Dokumente ${HOME}/Dokumente } case $parameter in unix_nfs) unix_nfs ;; unix_ssh) unix_ssh ;; rsyncd) rsyncd ;; restore) restore ;; *) echo Es stehen nur die Funktionen unix_nfs, unix_ssh und rsyncd zur Verfügung! ;; esac
-
Tu das doch mal in irgendein VCS-Repo, das kann man ja nicht mit ansehen. RCS wenns sein muss, aber mal _irgendwas_.
-
-
Wichtig: Vor dem ersten Aufruf einmal mkdir /Users/$(whoami)/Library/Application\ Support/Skype2[ -d "/Users/$(whoami)/Library/Application\ Support/Skype2" ] mkdir "/Users/$(whoami)/Library/Application\ Support/Skype2"
Hat das kein $HOME oder wenigstens $USER?
Und überhaupt, dafür brauchste keine bash starten, da reicht ne POSIX-Shell übrig. Und den Pfad würd ich mal noch quoten (wenn du ein Username mit Leerzeichen hast, gehörst du geschlagen, aber macht man einfach). -
[ -d "/Users/$(whoami)/Library/Application\ Support/Skype2" ] mkdir "/Users/$(whoami)/Library/Application\ Support/Skype2"
Hat das kein $HOME oder wenigstens $USER?
Und überhaupt, dafür brauchste keine bash starten, da reicht ne POSIX-Shell übrig. Und den Pfad würd ich mal noch quoten (wenn du ein Username mit Leerzeichen hast, gehörst du geschlagen, aber macht man einfach).Mit ner if-Abfrage das Verzeichnis bei Bedarf anlegen kann man natürlich am Anfang machen. Man kann aber genauso gut als ersten Schritt das Verzeichnis einmal anlegen und gut, macht ja keinen großen Unterschied.
Warum soll ich eine veraltete sh nehmen, wenn ich bash verfügbar habe? Mit SH gehen einige nette Shortcuts von bash nicht (auch wenn ich hier keine davon benutze)
Ja, ${HOME} hätte ich nehmen können statt /Users/$(whoami), aber am Mac kommt da das gleiche raus.
Zu Usernames mit Leerzeichen: Unter OS X hat man das nicht. Der Vorname-Nachname-Username ist wie bei Linux das "vollständiger Name"-Feld, der eigentliche Benutzername ist standardkonform. In meinem Falle afeld und Alexander Feld. Habe ich beim Linux Mint im Büro genauso.
Hier mal die thosch-kompatible Variante:Bash#!/bin/bash if [ ! -d "${HOME}/Library/Application Support/Skype2" ] then mkdir "${HOME}/Library/Application Support/Skype2" fi open -na /Applications/Skype.app --args -DataPath "${HOME}/Library/Application Support/Skype2"
Man könnte das Script jetzt noch gucken lassen, wie viele Skype-Verzeichnisse da sind und entsprechend hochzählen, dann würde auch ne 3., 4. Instanz usw gehen. Aber das wäre echt unnötig.
Ich bleibe aber bei Bash, das ist bei OS X einfach Standard. Unter den meisten Linux-Distributionen übrigens auch.
-
Die meisten Scripts nutzen dennoch sh. Du und deine angeblichen Standards, die keine sind
Vor allem das mit den Nutzernamen - DEN Standard musst du mir zeigen.
-
Die meisten Scripts nutzen dennoch sh. Du und deine angeblichen Standards, die keine sindVor allem das mit den Nutzernamen - DEN Standard musst du mir zeigen.
Unter OS X ist /bin/sh mit /bin/bash identisch, sieht man etwa am funktionierenden Completion.
Echtes sh ist zum scripten eher doof, da viele wichtige Funktionen nicht laufen. Folgendes Beispiel geht etwa NICHT auf sh und muss statt der internen Zählfunktion auf Tools wie seq zurückgreifen:
Bevor du nun sagst "Das geht wohl in sh, guck mal hier am Mac" beachte, was sh dort ist.
Beispiel unter Ubuntu:
Coderoot@stuart[~] # for i in {1..3} ; do echo Hallo bash ${i}; done Hallo bash 1 Hallo bash 2 Hallo bash 3 # for i in {1..3} ; do echo Hallo sh ${i}; done Hallo sh {1..3}
Und das ist nur ein Beispiel von vielen, was in bash problemlos geht und in einer reinen sh (etwa der von Busybox) nicht geht. Habe täglich mit beiden Shells beruflich zu tun.
Also was willst du mir damit also nun sagen?
Dass man auf Homeverzeichnisse nicht so direkt zeigen soll stimmt ja, auf einem Mac OS X-Einzelplatzsystem ist das aber vernachlässigbar, da sie dort immer unter /Users liegen. In Netzwerken wo etwa das Home per NFS gemountet wird sieht das natürlich anders aus. Aber da nutzt man meist kein Skype. Und wenn doch, kann man ja ${HOME} im Script benutzen.
Und das tollste an diesem Script: Gerne könnt ihr euch das für eure Lieblingsshell umbauen und es wird vermutlich aufgrund der geringen Komplexität überall laufen. Somit sind auch alle Fans von sh, ksh, tcsh, pdsh, zsh, fish und co nicht ausgegrenzt und können entsprechende Versionen erstellen.
Auch wenn die Shell bei diesem "Script" (prinzipiell tuts sogar ein Alias für den einen Aufruf) egal ist, bei komplexeren Sachen sollte man schon Bash nehmen, damit man alle Funktionen nutzen kann. Sei es zählen oder Integerrechnen oder sonst was. Da kommt man mit sh nicht weit.
Hier noch was zu OS X:
Bonus: Auf IRIX wo die Bash unter /usr/nekoware/bin/ liegt kann man ja den env-Befehl im Shebang nutzen, um sie aufzufinden.
-
Also ich benutze immer lieber den kleinsten gemeinsamen Nenner. Wenn ich auf NetBSD unterwegs bin, hab ich auch oft aus Faulheitsgründen keine bash installiert und tu’s erst, wenn ich eine Funktion wirklich schmerzlich vermisse.
Aber ausschlaggebend für mich ist immer die Performance, also lasst uns doch mal einen Performance-Vergleich machen.
-
Naja wenn ich Performance will, nehm ich kein Script, sondern ein kompiliertes Programm, etwa in C.
-
Du hast aber nicht immer auf jedem System, auf dem du mal eben was scripten möchtest, einen Compiler installiert.
Außerdem verlierst du dann den menschenlesbaren Source, den man vielleicht mal noch anpassen will und musst stattdessen allerlei Konfigurationsmöglichkeiten für zukünftige Was-wäre-wenn-Fälle in der kompilierten Software vorsehen. Aus »schnelle Lösung« wird dadurch gleich ein ganzes Programmierprojekt.Aber ja, wenn ich von vornherein weiß, dass ich eine langwierige Prozedur vorhabe, wo der Unterschied zwischen einem zu interpretierendem Script und einer kompilierten Software durchaus in Stunden ausufern kann, dann kompiliere ich lieber was.
-
shadowtux: Lass mal hier bitte nicht den "Beruf" raushängen, da ich ja bekanntlich den selben habe. Es gibt nur zu sagen: Du hast meinen Kommentar verstanden [ ]
-
Und du ihn anscheinend nicht gelesen. Sonst wüsstest du, dass die sh-Skripte unter OS X alle bash nutzen. auch wenn sie /bin/sh als Shebang haben.
-
Und du ihn anscheinend nicht gelesen. Sonst wüsstest du, dass die sh-Skripte unter OS X alle bash nutzen. auch wenn sie /bin/sh als Shebang haben.Du, das ist mir schon bewusst. Es steht außerdem außer Frage, dass die bash mehr Funktionen hat als die sh. Es ging mir darum, dass du Standards proklamierst, die keine sind und diese auch ständig wieder erwähnst.
-
Und der Standard ist eben, dass man im Zweifelsfall keine Bash hat, dass der extra Fork völlig übertrieben ist (Alias oder Shellfunktion), und dass man auch mit einer POSIX-Shell Skripte schreiben kann, vielleicht nicht so angenehm eben. Z.B. mal eins von mir: daemontools-Runscript für git-daemon(1).
-
Unter OS X gibt es standardmäßig nur die Bash, daher ist das vollkommener Blödsinn in dem Fall, sich da auch nur ansatzweise Gedanken zu zu machen. Auch auf modernen Linux-Distributionen ist sogut wie immer eine Bash bei. Also ist das auch da vernachlässigbar. Klassisches sh hat man höchstens in Embedded-Umgebungen, aber von denen rede ich ja hier nicht. Wir sind nicht mehr im Jahr 1993 oder so, sondern haben 2014 - Und da hat jede halbwegs moderne Distribution eine bash vorinstalliert.
-
Eigentlich haben wir 2015. Siehst du keine Hoverboards?
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!