Rosika
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hallo zusammen, ich habe eine Frage bzgl. der Verwendung von "sudo" in Skripten. Hintergrund: Ich habe mir ein Skript geschrieben (s. unten), das ich immer, wenn ich den PC einschalte, manuell laufen lasse.
Es ermittelt zwei ausgesuchte SMART-Werte der externen FP (ist aber meine System-FP), nämlich den Start-Stop-Count und den Load_Cycle-Count. Diese werden dann ein eine Log-Datei geschrieben ( "zu_ext_FP_kgw.txt" ) und danach angezeigt. Für diesen Befehl
smartctl -A -d sat /dev/sdc | grep -E 'Start|Load'
brauche ich aber sudo, also ein sudo im Skript. Auf der Seite https://wiki.ubuntuusers.de/sudo/#Sudo-in-einem-Skript-verwenden steht als Lösung: gksu -p -m "Bitte Passwort eingeben:" | sudo -S -s -- [BEFEHL]
Dies initiiert aber eine grafische Abfrage. Nun wollte ich gerne wissen, ob es eine Möglichkeit gibt, das Ganze ohne grafische Abfrage zu machen, also Passwort-Abfrage per Terminal-Eingabe. Ich möchte aber nicht das ganze Skript mit sudo starten, weil ich denke (vielleicht liege ich damit aber auch falsch), daß dann jeder Befehl im Skript mit root-Rechten ausgeführt wird. Ich möchte aber nur den Befehl, der sudo benötigt, mit den entsprechenden Rechten ausführen.
Gibt´s dafür überhaupt eine Lösung? Vielen Dank im voraus. Grüße.
Rosika 😐
| #!/bin/bash
cd /home/rosika/Dokumente/interne_Verwaltung
echo >> zu_ext_FP_kgw.txt
echo >> zu_ext_FP_kgw.txt
date | awk '{ print "Heute ist "$1,$2,$3,$6 " und es ist "$4, "Uhr" }' >> zu_ext_FP_kgw.txt # Datumsangabe
echo >> zu_ext_FP_kgw.txt
gksu -p -m "Bitte Passwort eingeben:" | sudo -S -s -- smartctl -A -d sat /dev/sdc | grep -E 'Start|Load' >> /home/rosika/Dokumente/interne_Verwaltung/zu_ext_FP_kgw.txt
gedit /home/rosika/Dokumente/interne_Verwaltung/zu_ext_FP_kgw.txt
|
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Ich würde aus Sicherheitsgründen nicht das Passwort irgendwo im Klartext stehen haben. Konfiguriere sudo lieber so, dass dieser bestimmte Befehl ohne die Eingabe eines Passworts (strg+f "ohne Passwort") aufgerufen werden darf.
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hallo misterunknown, danke für Deine Antwort. Wenn ich´s richtig verstanden habe, müsste ich also etc/sudoers so modifizieren, dass ich den Benutzer rosika setze und ihn so definiere:
rosika ALL = NOPASSWD: /usr/sbin/Skript_für_Festplatte.sh
Natürlich müßte dann das Skript auch in /usr/sbin/ liegen. Falls das so richtig ist, muß ich dann die shebang in meinem Skript nicht umbenennen in #!/bin/sh ? ❓ Grüße
Rosika
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Rosika schrieb: Wenn ich´s richtig verstanden habe, müsste ich also etc/sudoers so modifizieren, dass ich den Benutzer rosika setze und ihn so definiere:
rosika ALL = NOPASSWD: /usr/sbin/Skript_für_Festplatte.sh
Natürlich müßte dann das Skript auch in /usr/sbin/ liegen.
Richtig.
Falls das so richtig ist, muß ich dann die shebang in meinem Skript nicht umbenennen in #!/bin/sh ? ❓
Nein. Ob das Shebang korrekt ist, hängt davon ab, was im Skript steht, also ob es auch mit der Default-Shell oder nur mit der Bash läuft.
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hi misterunknown, danke für die Aufklärung. Jetzt weiß ich auch, daß das shebang ein Neutrum ist (Entschuldigung für den Fehler 😳 ). Das einzige, was ich jetzt noch nicht weiß, ist, wo genau in der sudoers-Datei ich meinen neuen Eintrag setzen muß.
Hier meine Original-Einträge: #
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d Auf der Seite https://wiki.ubuntuusers.de/sudo/Konfiguration/#Einstellungen heißt es: Die untersten Einträge haben die höchste Priorität. D.h., gilt für die Gruppe admin: "ALL = (ALL) ALL", so werden NOPASSWD-Einträge für die Benutzer aus admin überschrieben.
Ist mit "untersten Einträgen" die genaue Position in der Datei gemeint oder die hierarchische Wertung? Nicht, daß ich da etwas falsch mache..... Grüsse,
Rosika
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5582
|
Ganz korrekt waere eine eigene Datei in /etc/sudoers.d mit einem nicht auskommentierten includedir ... in der letzten Zeile. Ansosten einfach unten, vor dem includedir rein.
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hi sebix, danke für Deine Antwort. Im sudoers.d-Ordner befindet sich z.Zt. nur eine README-Datei.
Wenn ich´s richtig verstanden habe, soll ich also in dem Ordner eine neue Datei anlegen mit dem Inhalt
rosika ALL = NOPASSWD: /usr/sbin/Skript_für_Festplatte.sh
Aber was für einen Namen soll diese Datei haben? Muß man da auf etwas achten? Und: Ganz korrekt waere eine eigene Datei in /etc/sudoers.d mit einem nicht auskommentierten includedir ... in der letzten Zeile.
Damit meinst Du also die letzte Zeile in /etc/sudoers, oder?. Ich müßte da also das Hash-Zeichen entfernen, da es ja noch auskommentiert ist. Grüsse.
Rosika P.S.: Oder ist die letzte Zeile gar nicht auskommentiert, da kein Leerzeichen nach dem Hash?????
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
*****EDIT***** Ich glaube, ich versteh jetzt gar nichts mehr. In besagter README-Datei heißt es.
#
# As of Debian version 1.7.2p1-1, the default /etc/sudoers file created on
# installation of the package now includes the directive:
#
# #includedir /etc/sudoers.d
#
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
#
# Note that there must be at least one file in the sudoers.d directory (this
# one will do), and all files in this directory should be mode 0440.
#
[...] Das sieht doch so aus, als ob #includedir /etc/sudoers.d schon die Direktive darstellt. Wie ist das nun: Muß beim Auskommentieren nach dem "#" zwingend ein Leerzeichen kommen, oder nicht?
Ich mache in diesem Fall immer eines; deshalb hab´ ich das auch nie hinterfragt. Die sudoers-Datei macht auf jeden Fall kein Leerzeichen bei
#includedir /etc/sudoers.d
, sonst bei Kommentaren aber stets. Darum bin ich unsicher geworden. LG.
Rosika
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11250
Wohnort: München
|
Rosika schrieb: Das sieht doch so aus, als ob #includedir /etc/sudoers.d schon die Direktive darstellt.
Ja genau. Wie ist das nun: Muß beim Auskommentieren nach dem "#" zwingend ein Leerzeichen kommen, oder nicht?
Ich mache in diesem Fall immer eines; deshalb hab´ ich das auch nie hinterfragt. Die sudoers-Datei macht auf jeden Fall kein Leerzeichen bei
#includedir /etc/sudoers.d
, sonst bei Kommentaren aber stets. Darum bin ich unsicher geworden.
Im Zweifelsfall lohnt sich immer ein Blick in die Dokumentation - #includedir und #include sind Direktiven, keine Kommentare: https://www.sudo.ws/man/1.8.20/sudoers.man.html Including other files from within sudoers It is possible to include other sudoers files from within the sudoers file currently being parsed using the #include and #includedir directives. This can be used, for example, to keep a site-wide sudoers file in addition to a local, per-machine file. For the sake of this example the site-wide sudoers file will be /etc/sudoers and the per-machine one will be /etc/sudoers.local. To include /etc/sudoers.local from within /etc/sudoers we would use the following line in /etc/sudoers:
#include /etc/sudoers.local
When sudo reaches this line it will suspend processing of the current file (/etc/sudoers) and switch to /etc/sudoers.local. Upon reaching the end of /etc/sudoers.local, the rest of /etc/sudoers will be processed. Files that are included may themselves include other files. A hard limit of 128 nested include files is enforced to prevent include file loops. If the path to the include file is not fully-qualified (does not begin with a ‘/’, it must be located in the same directory as the sudoers file it was included from. For example, if /etc/sudoers contains the line:
#include sudoers.local
the file that will be included is /etc/sudoers.local. The file name may also include the %h escape, signifying the short form of the host name. In other words, if the machine's host name is “xerxes”, then
#include /etc/sudoers.%h
will cause sudo to include the file /etc/sudoers.xerxes. The #includedir directive can be used to create a sudoers.d directory that the system package manager can drop sudoers file rules into as part of package installation. For example, given:
#includedir /etc/sudoers.d
Und wie alle die /etc/sudoers auch würde ich die Dateien in /etc/sudoers.d/ immer mit visudo bearbeiten, damit die Syntax überprüft wird, bevor die Datei in das Verzeichnis geschrieben wird.
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hallo seahawk1986, vielen Dank. Dann habe ich´s doch richtig verstanden. In der sudoers-Datei steht ja bereits
#includedir /etc/sudoers.d
in der letzten Zeile als Direktive. Dann muß ich hier also nichts machen. Und wie alle die /etc/sudoers auch würde ich die Dateien in /etc/sudoers.d/ immer mit visudo bearbeiten, damit die Syntax überprüft wird, bevor die Datei in das Verzeichnis geschrieben wird.
Danke, mache ich so. Wenn ich noch zur endgültigen Klärung folgende Frage stellen dürfte: Wie ist´s denn jetzt allgemein, wenn ich ein Skript schreibe? In der ersten Zeile das Shebang; das ist klar: #!/bin/bash. Wenn ich aber in den nächsten Zeilen einen Kommentar einfügen möchte, beginne ich die Zeile mit "#". Auch klar. Aber muß dann zwingend ein Leerzeichen sein, bevor ich den Kommentar definiere oder nicht? Anders gesagt: was ist richtig:
[...]
# Dies ist eine Kommentar
#Dies ist ein Kommentar
[...]
Ich habe schon überall nachgesehen, aber keine Antwort darauf gefunden. Grüße.
Rosika
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11250
Wohnort: München
|
Der Shell ist es egal, ob du ein Leerzeichen hinter der Raute vor dem Kommentartext machst oder nicht.
sollte einem das ebenfalls verraten:
3.1.3 Comments
--------------
In a non-interactive shell, or an interactive shell in which the
'interactive_comments' option to the 'shopt' builtin is enabled (*note
The Shopt Builtin::), a word beginning with '#' causes that word and all
remaining characters on that line to be ignored.
[...]
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
Hi seahawk1986, danke herzlichst für die Aufklärung. Dann ist also beides richtig. Ich habe es mir angewöhnt (der Übersichtlichkeit halber), in den Skripten stets ein Leerzeichen nach "#" zu machen.
Mit dem Konzept der Direktive war ich noch nicht vertraut. Deswegen bin ich ins Grübeln gekommen. Aber jetzt ist alles klar. An verschiedenen Stellen habe ich nach Klärung gesucht; aber auf die man-pages wäre ich als Letztes gekommen. Tut mir echt leid. 😳 Ich hoffe, ich komme jetzt klar. Danke nochmals Dir und an alle Helfenden. Grüsse.
Rosika ☺
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5582
|
seahawk1986 schrieb: Rosika schrieb: Das sieht doch so aus, als ob #includedir /etc/sudoers.d schon die Direktive darstellt.
Ja genau. Wie ist das nun: Muß beim Auskommentieren nach dem "#" zwingend ein Leerzeichen kommen, oder nicht?
Ich mache in diesem Fall immer eines; deshalb hab´ ich das auch nie hinterfragt. Die sudoers-Datei macht auf jeden Fall kein Leerzeichen bei
#includedir /etc/sudoers.d
, sonst bei Kommentaren aber stets. Darum bin ich unsicher geworden.
Im Zweifelsfall lohnt sich immer ein Blick in die Dokumentation - #includedir und #include sind Direktiven, keine Kommentare: https://www.sudo.ws/man/1.8.20/sudoers.man.html
Wieder was gelernt, danke!
|
Rosika
(Themenstarter)
Anmeldungsdatum: 26. Februar 2016
Beiträge: 1359
|
*****ergänzende Frage***** Hallo nochmals, ich habe jetzt viel dazugelernt und weiß auch, wie ich´s nun anstellen muß. Aber rein interessehalber möchte ich nochmals auf meine Eingangs-Frage zurückkommen: In dem von mir geschriebenen Skript brauche ich nur einmal sudo:
sudo smartctl -A -d sat /dev/sdc | grep -E 'Start|Load'
Mit
gksu -p -m "Bitte Passwort eingeben:" | sudo -S -s -- [BEFEHL]
starte ich die grafische Pw-Abfrage. Weiß zufällig jemand, ob es eine Möglichkeit gibt, die PW-Abfrage nicht grafisch zu machen, sondern per Terminal? Also: ich starte das Skript im Terminal. Dort wird nach dem PW gefragt, ich gebe es ein, und der Rest des Skripts läuft dann "normal" ab.
Dabei sollen alle anderen Befehle ohne "sudo" ausgeführt werden. Wie gesagt - nur interessehalber. Grüsse.
Rosika
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5582
|
Rosika schrieb: Weiß zufällig jemand, ob es eine Möglichkeit gibt, die PW-Abfrage nicht grafisch zu machen, sondern per Terminal?
Mit sudo . Und wenn du in der sudoers schon festgelegt hast, dass kein Passwort notwendig ist, warum dann die Abfrage nach dem Passwort? Du kannst dort auch den auszufuehrenden einzelnen Befehl hinterlegen, also smartctl -A -d sat /dev/sdc .
|