hallo liebe Kollegen,
Als Laie habe ich mir gerade ein Skript im wahrsten Sinne gebastelt.
Zweck vom Skript soll nur ein schneller Überblick sein was man im PC hat.
Im Hintergedanken auch nicht schlecht, für Leute, die im Nickles-Forum ihre Hardware posten sollen.
Die wichtigsten Befehle lauten: uname -a, lspci, lsusb, lsmod, ifconfig -a
Und jetzt das Skript (wenn wer kopieren möchte, einfach nur übernehmen)
------- Ab hier ----- (Diese Zeile aber nicht mitkopieren!!!)
#!/bin/sh
# Skript fuer Auslesen der Hardware
echo ++++++++++++++ > hardware.txt
echo +++ System +++ >> hardware.txt
echo ++++++++++++++ >> hardware.txt
uname -a >> hardware.txt
echo +++++++++++++ >> hardware.txt
echo +++ lspci +++ >> hardware.txt
echo +++++++++++++ >> hardware.txt
lspci >> hardware.txt
echo +++++++++++++ >> hardware.txt
echo +++ lsusb +++ >> hardware.txt
echo +++++++++++++ >> hardware.txt
lsusb >> hardware.txt
echo +++++++++++++ >> hardware.txt
echo +++ lsmod +++ >> hardware.txt
echo +++++++++++++ >> hardware.txt
lsmod >> hardware.txt
echo ++++++++++++++++ >> hardware.txt
echo +++ ifconfig +++ >> hardware.txt
echo ++++++++++++++++ >> hardware.txt
ifconfig -a >> hardware.txt
------- Bis hier --------(Diese Zeile auch nicht mitkopieren!!!)
Dateiname war bei mir ./hardware.sh, Dateirechte mit chmod +x unter root vergeben.
Linux 15.036 Themen, 107.107 Beiträge
Ich war mal so frei und habe das etwas flexibler weiter gebastelt:
#!/bin/sh
run_fancy () {
COMMAND="$1"
TITLE="${2:-$1}"
echo
echo '+++'
echo "+++ $TITLE"
echo '+++'
$COMMAND
}
run_all() {
run_fancy 'uname -a' 'System'
run_fancy lspci
run_fancy lsusb
run_fancy lsmod
run_fancy 'ifconfig -a' ifconfig
}
LOGFILE="hardware.`date +%F`.`uuidgen`.txt"
run_all > $LOGFILE
echo "Ausgabe erfolgte in $LOGFILE"
hallo Borlander,
danke für deine Bemühungen. für mich zum lernen wie man sowas schreibt natürlich ideal.
Wie kommt man auf run_fancy? und das mitn $1 kapier ich auch noch, denn das ist ja nur eine Variable
Aber das 2: innerhalb {} löst bei mir Fragezeichen auf.
Der Rest ist klar.
Die Variable $1 ist der erste Parameter von einem Shellscript. Das ist bei jedem BASH Shellscript immer gleich.
Die Variable $0 ist der Name des Shellscriptes und $1 ist der erste Parameter der dem Shellscript in der Kommandozeile übergeben wird.
run_fancy () ist eine Funktion genau so wie run_all (), in der verschiedene Befehle zusammengefasst sind, die immer zusammen ausgeführt werden sollen.
Hallo KarstenW,
danke für deine Antwort, $1 erster Parameter, danke für die Info.
und was hat das mit dem 2: auf sich?...das kapier ich nicht.
ich nehme an, das run_fancy ist eine funktion die man selbst nennen kann wie man möchte?
Wie kommt man auf run_fancy?
Durch scharfes nachdenken bis Dir ein Funktionsname einfällt der kurz und knackig ist und grob beschreibt was die - selbst definierte - Funktion tut. Du köntest die Funktion auch xyz nennen, aber das wäre wenig zweckmäßig ;-)
Aber das 2: innerhalb {} löst bei mir Fragezeichen auf.
http://de.wikibooks.org/wiki/Linux-Kompendium:_Shellprogrammierung#Variablen-Substitution entfernt das die Fragezeichen? Wobei diese WikiBook-Seite als ganzes lesesnswert ist, da sie eine schöne Übersicht über Shell-Scripting liefert :-)
Gruß
Borlander
hallo Borlander,
welch kesse Antwort! Durch scharfes nachdenken *g*
danke für den Link zur Shellprogrammierung, schaut sehr gut aus, ich werde mir mal das Book auf den Laptop runterladen und bei einer Kanne Kaffee mal screenreaden *inklusiver einer packung schokokeksi*
Gruß Alekom
Edit:
${Variable:-Wert}
Nutzt den Wert von Variable. Falls die Variable nicht gesetzt ist, wird der Wert benutzt.
ich denke du meinst diese Zeile !
Nabend Alekom
welch kesse Antwort! Durch scharfes nachdenken *g*
Das beschreibt den Vorgang der Namensfindung jedoch einfach am besten. So hatte im ersten Entwurf hatte ich auch noch einen anderen Namen verwendet, der jedoch eher unpassend war. Habe den inzwischen allerdings schon wieder vergessen. Etwas kurzes (und dadurch tendenziell recht praktisches) wie run wäre zu unspezifisch gewesen und run_logged hätte nicht gepasst da die Ausgabe in die Log-Datei erst außerhalb der Funktion erfolgt. Mit run_fancy gibt es zumindest einen kleinen Hinweis darauf, dass die Ausführung etwas schöner erfolgt. Vollkommen glücklich bin mich mit diesem Namen allerdings auch noch nicht. Gibt bestimmt noch eine schönere Möglichkeit ;-)
${Variable:-Wert} […] ich denke du meinst diese Zeile !
Exakt.
Gruß
Borlander
Ich finde das hier witzig (until-beispiel.sh)
http://de.wikibooks.org/wiki/Linux-Kompendium:_Shellprogrammierung#until
@Alekom
Wenn Du Dein Skript nicht explizit als root laufen lassen willst oder kannst, kannst Du für die ganze Sache auch einen Eintrag in die /etc/sudoers vornehmen und dabei auch die Paßwortabfrage deaktivieren. Es ist natürlich aus Sicherheitsgründen nicht unbedingt sinnvoll, aber es funktioniert. Denn unter Opensuse benötigst Du für ifconfig und lspci root-Rechte und so kann das Skript auch als normaler User die komplette Ausgabe anzeigen.
fakiauso
Eintrag in die /etc/sudoers vornehmen und dabei auch die Paßwortabfrage deaktivieren. Es ist natürlich aus Sicherheitsgründen nicht unbedingt sinnvoll, aber es funktioniert.
Das kann sogar richtig gefährlich sein: Wenn das Script noch von Usern ohne root-Account editiert werden darf!
Ggf. wäre es sinnvoll im Script zu Testen ob die Ausführungsrechte vorhanden sind…
Gruß
bor
also meine bescheidene meinung ist die, das ein normaler user keine root-rechte haben sollte.
passwortabfrage hat schon einen sinn. gibt ja viele user die brain 1.0 nicht nutzen.
Hallo Alekom,
definiere mal -----> normaler user
Hallo Acader,
für mich ist ein normaler User, der Briefe in der Textverarbeitung tippt, seine Haushaltskassa am Pc erledigt, mailt, surft. usw... das übliche halt. (Gut, das mach ich ja auch und die meisten im Nickles-Forum auch.)
aber ein "normaler" User WILL sich nicht mit der Kommandozeile beschäftigen, wenn das System mal läuft.
Denn zum Lernen gibts immer was. Mit Lernen ist man nie fertig.
Hi
Ich bin halt nur darübergestolpert, weil beim einfachen Aufruf die Meldung kam "Befehl nicht gefunden" (Ausführungsrechte waren gesetzt). Aber das ist ja völlig klar, wenn ein Skript als User erstellt und ausgeführt wird, aber eben Aufrufe enthält, die unter der Susi root-Rechte voraussetzen, in dem Fall eben sbin/lspci und sbin/ifconfig.
Unter Ubuntu z.B. ist das kein Problem, weil das dort der normale User ebenfalls aufrufen darf.
Und da es mir keine Ruhe gelassen hat, wie das ohne Anmeldung als root trotzdem als User funzt, habe ich eben etwas herumprobiert. Erst Aufruf mit sudo, aber da war halt die Paßwortabfrage noch im Weg, auch wenn es nur ein paar Tipper mehr sind. Die /etc/sudoers habe ich dann so eingerichtet, das dieses Skript explizit nur ein User per sudo ohne Paßwort ausführen darf.
Als Szenario passend zu diesem Ansatz stelle ich mir zum Beispiel ein Live-Linux von Stick vor, das als Hardwarecheck für Katastrophenfälle und vermutlich kaputte Rechner immer dabei ist, in diesem Fall ist der Sicherheitsaspekt auch eher unrelevant, da es kein Produktivsystem ist, auch wenn es auf das eine Mal Paßwort eingeben eigentlich nicht ankommt. Auf einem richtigen Rechner macht man solche Spielchen selbstverständlich nicht. Mir ging es da eher um das prinzipielle Ob und Wie.
fakiauso
Kannst du ifconfig als normaler User unter SUSE nicht aufrufen, wenn du den kompletten Pfad angibst, d.h. /sbin/ifconfig in der Konsole eintippst? Zumindest unter Debian funktioniert das. /sbin ist zwar nicht in $PATH des normalen Users gelistet, aber /sbin/ifconfig ist rechtemässig nicht eingeschränkt:
$ ls -l /sbin/ifconfig
-rwxr-xr-x 1 root root 72296 Sep 7 09:54 /sbin/ifconfig
Unter Ubuntu ist iirc auch /sbin und /usr/sbin in $PATH des normalen Users eingetragen. Daher kann man dort auch einfach nur ifconfig eintippen.
Die Interfaces ändern kann trotzdem nur root, aber das liegt daran, dass die entsprechenden Kernel-Aufrufe wiederum zwingend Rootrechte verlangen :-)
Kannst du ifconfig als normaler User unter SUSE nicht aufrufen, wenn du den kompletten Pfad angibst
Guten Morgen, Herr fakiauso;-)
Ja, das klappt bei mir auch. Das habe ich jetzt gar nicht bedacht, den vollen Pfad statt des einfachen Befehls in´s Skript zu setzen, weil ich eigentlich nur auf das Ausführen als root fixiert war.
Frühschichten und tiefgründiges Denken harmonieren wohl doch nicht immer.
[…] Live-Linux […] ist der Sicherheitsaspekt auch eher unrelevant […] das eine Mal Paßwort eingeben eigentlich nicht ankommt.
Auf entsprechenden Live-Systemen hast Du aber häufig überhaupt kein Passwort gesetzt. Da kannst Du dann sudo ohne Passwort-Eingabe nutzen ;-)
Gruß
bor
Ich würde die Ausführungsrechte prüfen:
#!/bin/sh
# Script braucht root Rechte
if [ "$UID" != 0 ] ; then
echo
echo "Script $0 braucht root Rechte !"
echo
exit 1
fi
run_fancy () {
COMMAND="$1"
TITLE="${2:-$1}"
echo
echo '+++'
echo "+++ $TITLE"
echo '+++'
$COMMAND
}
run_all() {
run_fancy 'uname -a' 'System'
run_fancy lspci
run_fancy lsusb
run_fancy lsmod
run_fancy 'ifconfig -a' ifconfig
}
LOGFILE="hardware.`date +%F`.`uuidgen`.txt"
run_all > $LOGFILE
echo "Ausgabe erfolgte in $LOGFILE"
Da wir hier ja auch ein wenig schön Skripten wollen würde ich in diesem Fall vorschlagen die Prüfung zu verschieben, sonst würden der ausgeführte Code unschön zerstückelt. Und wenn wir schon dabei sind auch die Fehlerausgabe nutzen:
#!/bin/sh
run_fancy () {
COMMAND="$1"
TITLE="${2:-$1}"
echo
echo '+++'
echo "+++ $TITLE"
echo '+++'
$COMMAND
}
run_all() {
run_fancy 'uname -a' 'System'
run_fancy lspci
run_fancy lsusb
run_fancy lsmod
run_fancy 'ifconfig -a' ifconfig
}
# root-Rechte vor beginn der Ausführung sicherstellen:
if [ "$UID" != 0 ] ; then
echo >&2
echo "Script $0 braucht root-Rechte!" >&2
echo >&2
exit 1
fi
# Die wirkliche Arbeit erledigen:
LOGFILE="hardware.`date +%F`.`uuidgen`.txt"
run_all > $LOGFILE
echo "Ausgabe erfolgte in $LOGFILE"
eigentlich wollt ich nur einen schnellen überblick haben *g*
aber das würde auch mit den einzelnen befehlen auch gehen.
Hast ja Recht .
Danke für Deine Antwort. klingt als hätten wir den gleichen Matheprofessor!
klingt als hätten wir den gleichen Matheprofessor! |
Und was hat das Ganze mit einem Matheprofessor zu tun ?
** natürlich nichts ! **
Und was hat das Ganze mit einem Matheprofessor zu tun ? ** natürlich nichts ! **Scharfen Hinsehen (verwandt mit dem scharfen Nachdenken) gehört zum allgemein anerkannten mathematischen Handwerkszeug, mit dem jeder der an der Uni eine Mathematik Grundlagenvorlesung besucht hat in Berührung kommen müsste. In sofern also tatsächlich nicht spezifisch für einen bestimmten Dozenten…
Zweck vom Skript soll nur ein schneller Überblick sein was man im PC hat. |
Das ist ja auch alles gar nicht so schlecht wenn man das im Überblick mit einemal dann hat.
Falls du dich weiter in dieser Hinsicht damit beschäftigen möchtest gebe ich dir mal einen interessanten Link ---> klick und hier noch gleich das kleine Handbuch für die Shell-Programmierung.
Wenn du Zeit hast kannste ja mal bisschen basteln und dann berichten.
danke Acader,
das kleine Handbuch für die Shell-Programmierung, da hab ich schon mal reingeguckt.
das andere ist mir total fremd.
Hallo Acader,
habe soeben mal etwas probiert im Terminal unter Root-Rechte:
#!/bin/sh
# Demonstriert die select-Anweisung
# aselect1
select auswahl in Punkt1 Punkt2 Punkt3 Punkt4
do
echo "Ihre Auswahl war : $auswahl"
done
natürlich alles unter einem dateinamen mit ./aselect1.sh abgespeichert, chmod a+x vergeben und die datei aufgerufen.
terminal zeigt mir an:
./aselect1.sh: 5: ./aselect1.sh: select: not found
./aselect1.sh: 6: ./aselect1.sh: Syntax error: "do" unexpected
ähm, alles abgetippt so wie es steht mal als probe...dann hätte ich meine eigenen wörter verwendet und hätte geguckt warum das so ist.
aber so?...pffff
wo liegt mein denkfehler, das mit dem 5 und 6 nach dem sh, ja das sind die zeilen, schon klar. aber wenn dort nix von etwaiger deklarierung im script steht oder so, dann weiss ich nicht wo der fehler liegt.
habe ich übrigens vom buch shell-programmierung:
http://openbook.galileocomputing.de/shell_programmierung/shell_007_006.htm#RxxKap00700604004E771F038172
Edit:
Habe gerade den Fehler entdeckt, habe aber obigen Text absichtlich nicht gelöscht, um Euch meine Denkweise darzustellen *g*
habe das Script wieder abgetippt, DIESMAL das gewohnte #!/bin/sh weggelassen und siehe da, es hat sofort funktioniert. jetzt frage ich mich, wann das mit dem #!/bin/sh gilt ?
jetzt frage ich mich, wann das mit dem #!/bin/sh gilt ? |
Lese bitte unter Shebang Verwendung nach.
MfG Acader
hallo Acader,
danke für den Link, habe es mir durchgelesen.
alleine, ich bin schlau wie zuvor.
das system ist ja das gleiche, wo ich geskriptet habe.
bei einem skript funktioniert es und beim anderen skript nur wenn man die zeile entfernt.
logisch ist das für mich nicht.
beim skript wo es mit der #!/bin/sh funktioniert hat, auch dort habe ich es dann probehalber entfernt, gespeichert und ausgeführt
hat dann auch funktioniert.
mir lässt, wie bekanntlich, nie etwas eine ruh.
habe soeben das skript geändert, welches mit #!/bin/sh nicht funktioniert hatte, und zwar mit #!/bin/bash.
Hat sofort funktioniert, das andere Skript welches mit sh funktioniert hatte, hab ich auch geändert auf bash, hat auch funktioniert.
man würde mich jetzt mit einem ratlosen Gesicht sehen *g*
Gehe mal davon aus, dass select ein Befehl ist der in bash integriert ist… ;-)
ja im terminal wenn ich help eingebe, scheint dieser befehl select auf.
wenn ich aber im terminal sh eingebe, erscheint ja dieses $ und unter root # dort ist der befehl select scheinbar unbekannt, weil not found
ok, ich kapiere, guter hinweis, danke
wenn ich help eingebe, scheint dieser befehl select auf.
Dann bekommst Du (bzw. ich zumindest) in der ersten Zeile jedoch auch folgenden Hinweis:
GNU bash, Version 4.1.5(1)-release (i486-pc-linux-gnu)
Die Shell Kommandos sind intern definiert. […]
ja diese meldung bekomm ich auch..version 4.2.24(1)
alles klar !
Danke übrigens