Ich versuche, die Macs an meinem Arbeitsplatz alle zu einem bestimmten Zeitpunkt zu aktualisieren. Dazu führe ich ein Bash-Skript von einem Ersatz-Macbook aus, auf dem OS X Server ausgeführt wird. Ich habe ein kleines und ein großes Problem mit meinem aktuellen Skript und könnte Ihre Hilfe gebrauchen.
Das Skript ist sehr einfach und ich brauche es nicht zu robust für meine Zwecke:
#!/bin/bash
for host in 192.blah.blah.blah 192.blah.blah.blah 192.blah.blah.blah
do
ssh -t $host sudo softwareupdate -ia
ssh -t $host sudo shutdown -r now
done
Das kleine Problem: Wenn ich aus irgendeinem Grund versuche, beide Befehle mit ;
oder &&
so in dieselbe Zeile zu setzen:
ssh -t $host sudo softwareupdate -ia;sudo shutdown -r now
oder
ssh -t $host sudo softwareupdate -ia && sudo shutdown -r now
Stattdessen wird der eigentliche Server neu gestartet. Ich bin mir nicht sicher, wo ich mit der Syntax falsch liege.
Das große Problem: Obwohl ich ssh mit einem öffentlichen ssh-Schlüssel eingerichtet habe (unter Verwendung der Anweisungen, die ich hier gefunden habe ), werde ich immer noch aufgefordert, ein Passwort zweimal pro Maschine einzugeben, wenn das Skript ausgeführt wird. Ich bin mir sicher, dass es an unserem Freund liegt sudo
, aber die Befehle werden ohne ihn überhaupt nicht ausgeführt. Idealerweise richte ich früh morgens einen Cron-Job ein und lasse dieses Skript automatisch ausführen, damit die Macs bis zu meiner Arbeit aktualisiert und neu gestartet sind. Ich bin mir sicher, dass es einen Weg gibt, aber mein Google-Fu lässt mich im Stich.
BEARBEITEN / TEILWEISE ANTWORT Es stellt sich heraus, dass selbst wenn Sie TextEdit in den Nur-Text-Modus versetzen, es immer noch "intelligente Anführungszeichen" verwendet. Das Skript über das Terminal einzugeben und zu speichern und es dann auszuführen, funktionierte wie ein Zauber.
0942v8653 war so freundlich, mir im Chat zu helfen, und stellte auch einen Befehl zur Verfügung, um diese „Funktion“ zu deaktivieren:defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
Ich suche immer noch nach einer Lösung für das Passwortproblem.
Die ;
und werden von auf dem lokalen Rechner &&
interpretiert . bash
Sie können dies sehen, indem Sie Folgendes ausführen ssh 127.0.0.1 -t env && env
: Beim zweiten Mal gibt es keine SSH_CONNECTION
Variable.
Sie können den gesamten Befehl zitieren, damit er ordnungsgemäß funktioniert:
ssh -t $host 'sudo softwareupdate -ia && sudo shutdown -r now'
Meiner Meinung nach -t
sollte nur ein in Anführungszeichen gesetztes Argument zugelassen werden, um solche Probleme zu vermeiden. Achten Sie auch auf die Erweiterung von Variablen. Stellen Sie sicher, dass Sie alles in einfache Anführungszeichen setzen oder es mit Backslashes maskieren, damit es nicht auf dem lokalen Computer erweitert oder interpretiert wird.
Ich bin mir über das Neustartproblem nicht sicher, aber das Einrichten eines Skripts zum Ausführen von sudo
Befehlen ohne Eingabe des Kennworts ist ziemlich einfach. Schauen Sie sich Schritt 4 dieser Antwort an, die ich zuvor geschrieben habe (es war für etwas ganz anderes, aber die Schritte zum Aktivieren der Ausführung sudo
ohne Passwort sind universell).
Beachten Sie, dass sich der tatsächliche Befehl zum Ausführen Ihres Skripts in ändert
sudo ./myscript.sh
Schritt 4: Einrichten von sudo für die Ausführung ohne Passwort
Den Terminal-Befehl
sudo
ohne Passwort laufen zu lassen, kann sehr gefährlich sein. Aus diesem Grund haben die obigen Schritte die Shell-Skripte in ihrem eigenen Verzeichnis erstellt, sodass die tatsächliche Ausführung begrenzt ist.Geben Sie im Terminal den folgenden Befehl ein:
sudo pico /etc/sudoers
Geben Sie dann Ihr Administratorkennwort ein, wenn Sie dazu aufgefordert werden.
Dies kann zu einem (meistens) leeren Bildschirm führen oder Text enthalten. Wenn es leer ist - das ist in Ordnung. Sie fügen einfach die folgende Zeile oben ein. Wenn Text bereits vorhanden ist, ist das auch in Ordnung; Verwenden Sie Ihren Abwärtspfeil, um direkt unter die Zeilen zu gehen, die sich bereits im
# User privilege specification
Abschnitt befinden, wie im folgenden Screenshot zu sehen ist.Fügen Sie hier die folgende Zeile hinzu:
<yourusername> ALL = NOPASSWD: /Users/<yourusername>/PathToScript/*
Ersetzen Sie es an beiden Stellen, an denen
<yourusername>
angezeigt wird, durch Ihren Mac-Benutzernamen. Drücken Sie Strg + x, geben Sie y ein und drücken Sie die Eingabetaste, um zu speichern und zu beenden.
sudo bash UpdateScript.sh
. Wenn ich es so anrufe, fragt es mich außerdem immer und immer wieder nach einem Passwort, bis es heißt: "Berechtigung verweigert (öffentlicher Schlüssel, Tastatur-interaktiv)". Gedanken?VISUAL
Umgebungsvariable auf pico
.
zomgdavidbowie
'sudo: command not found
. Es verwirrt mich. Obwohl, vielleicht sollte ich anmerken: Ich betreibe die server.app auf Yosemite. Ich bezweifle, dass das die Wurzel des Problems ist, aber ich dachte, ich erwähne es.0942v8653
zomgdavidbowie
ssh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'
0942v8653
zomgdavidbowie
'echo command not found
. Ich muss denken, dass ich das Skript so aufrufe ... Ich habe in das Verzeichnis, in dem es sich befindet, cd'd und rufe es damit aufsudo ./UpdateScript.sh
0942v8653
zomgdavidbowie
ssh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'
funktioniert wie ein Zauber, wenn ich alles in die Eingabeaufforderung eingebe.0942v8653