Um einen Patch manuell auszuführen, muss ich diesen Befehl eingeben
sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
Es gibt ein Leerzeichen kurz vor dem 09:
sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql
Wie kann ich das in einem Skript ausführen?
Es gibt auch mehrere andere Befehle, aber dieser gibt Probleme.
sudo
Passwort - das Skript kann nicht vollständig ausgeführt werden, wenn niemand da ist, um es einzugeben.sudoers
Setup durcheinander gebracht . Keine große Sache. Es muss nur behoben werden.Antworten:
Es ist selten eine gute Idee,
sudo
Insider-Skripte zu haben . Entfernen Sie stattdessen dassudo
aus dem Skript und führen Sie das Skript selbst aus mitsudo
:Auf diese Weise werden alle Befehle im Skript mit Root-Rechten ausgeführt, und Sie müssen das Kennwort beim Starten des Skripts nur einmal eingeben. Wenn Sie einen bestimmten Befehl innerhalb des Skripts benötigen, um ohne
sudo
Berechtigungen ausgeführt zu werden, können Sie ihn als regulärer Benutzer mit ausführen (danke Lie Ryan ):Das Leerzeichen ist irrelevant, es sollte nichts beeinflussen, es gibt immer ein Leerzeichen zwischen einem Befehl und seinen Argumenten.
quelle
sudo
Aufrufe in das Skript eingefügt werden, da das Erhöhen des gesamten Skripts zum root eine schreckliche Idee sein kann, wenn es nur eine Handvoll eingeschränkter Aktionen gibt, die root benötigen. In diesem Zusammenhang habe ich speziell auf Ihren Kommentar geantwortet: "Vor allem, weil Sie das Skript nicht automatisch ausführen können, da Sie das Kennwort jedes Mal eingeben müssen, wenn Sie dazu aufgefordert werden."Sie könnten möglicherweise die
sudoers
Datei ändern .Rennen
sudo visudo
.Fügen Sie einen Eintrag für Ihren Benutzernamen und das Skript hinzu, das Sie ausführen möchten, ohne nach einem Kennwort gefragt zu werden.
quelle
sudoers
Datei bearbeitet haben .Sie könnten versuchen, etwas wie:
Dies ist nicht die sicherste Vorgehensweise, da Sie ein Sudoer-Kennwort im Nur-Text-Format schreiben. Um die Sicherheit zu erhöhen, können Sie eine Variable erstellen und das sudo-Passwort in die Variable einlesen. Anschließend können Sie den Befehl wie folgt ausführen:
Wenn Sie nichts dagegen haben, dass alle Befehle als root ausgeführt werden, können Sie Ihr Skript einfach mit ausführen
sudo
, wie zuvor vorgeschlagen.quelle
read -s PASSWORD
Diese Antwort ähnelt der Antwort von Terdon . Ich würde auch vorschlagen, das Hauptskript mit
sudo
auszuführen, damit das Skript ausgeführt werden kann, ohne während der Ausführung nach dem Kennwort des Benutzers fragen zu müssen.Wenn Sie jedoch Root-Berechtigungen für einige Befehle löschen und diese als der tatsächliche Benutzer ausführen möchten, mit dem der Befehl aufgerufen wurde
sudo
, können Sie überprüfen, ob die$SUDO_USER
Variable den ursprünglichen Benutzer ermittelt hat.Dies ist ein Beispielskript, wie Sie dies erreichen können:
quelle
Es gibt tatsächlich einen viel einfacheren Weg, dies zu tun. Aus Gründen der Portabilität ist dies meine Implementierung, Sie können sie jedoch jederzeit an Ihre Anforderungen anpassen.
Geben Sie Ihr sudo-Passwort als Parameter ein, wenn Sie das Skript starten, erfassen Sie es und wiederholen Sie es mit jedem Befehl, der Sie zur Eingabe des sudo-Passworts auffordert.
Sie können eine Eingabeaufforderung hinzufügen und wie folgt erfassen, nachdem das Skript gestartet wurde:
Aber wenn jemand anderes überwacht, was auf dem Knoten läuft; hat Zugriff auf die von ihm erstellten Protokolle; oder prüft nur nach dem Zufallsprinzip, wann Sie einen Test durchführen, der die Sicherheit gefährden könnte.
Dies funktioniert auch bei der Ausführung von Befehlen / Skripten, für deren Fortsetzung ein Ja erforderlich ist:
Das Echo reagiert auf eine Eingabeaufforderung, sodass Sie alles verwenden können, was Sie benötigen, wenn Sie andere Skripts ausführen, die nacheinander nach dem Fortschritt fragen. Stellen Sie sicher, dass Sie diese Reihenfolge kennen, da sonst schlimme Dinge passieren können.
quelle
read
: ryanstutorials.net/bash-scripting-tutorial/bash-input.php Das sollte dieses Problem vermeidenquelle
Sie können versuchen, den Benutzer, der das Skript ausführt, zur sudoers-Datei hinzuzufügen:
quelle