Auto-Update-Skript

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.

Antworten (2)

Die ;und werden von auf dem lokalen Rechner &&interpretiert . bashSie können dies sehen, indem Sie Folgendes ausführen ssh 127.0.0.1 -t env && env: Beim zweiten Mal gibt es keine SSH_CONNECTIONVariable.

Sie können den gesamten Befehl zitieren, damit er ordnungsgemäß funktioniert:

ssh -t $host 'sudo softwareupdate -ia && sudo shutdown -r now'

Meiner Meinung nach -tsollte 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.

Seltsamerweise bekomme ich dabei den Fehler '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.
Bist du sicher, dass du genau diese Zeile hast?
Das tue ich in der Tat. Ich habe die for-Schleife vorübergehend eliminiert, nur um dieses Skript auszuarbeiten, also lautet mein aktueller Codessh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'
Kannst du es mit einem Dummy-Befehl wie Echo versuchen? Das ist wirklich seltsam…
Es ist definitiv seltsam. Echo gibt den gleichen Fehlertyp zurück '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
Sie sollten sudo nicht verwenden müssen, um das Skript auszuführen. Passiert etwas anders, wenn Sie die Zeile einfach von der Eingabeaufforderung aus ausführen?
Richtig, hätte erwähnen sollen, dass ich das vor einiger Zeit getestet hatte, und ja, der ursprüngliche Befehl ssh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'funktioniert wie ein Zauber, wenn ich alles in die Eingabeaufforderung eingebe.

Ich bin mir über das Neustartproblem nicht sicher, aber das Einrichten eines Skripts zum Ausführen von sudoBefehlen 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 sudoohne 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 sudoohne 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 specificationAbschnitt 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.

Hübsch. Ich gehe davon aus, dass dies auf dem Server geschehen soll, ja? Nicht die Kunden.
Das ist richtig.
Hm. Es erkennt den Befehl nicht, es sei denn, ich verwende 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?
Wenn ich die Datei /etc/sudoers öffne, sagt sie mir: "Diese Datei MUSS mit dem Befehl 'visudo' bearbeitet werden". Glauben Sie immer noch, dass Pico sicher zu verwenden ist?
@Fyrefly: Setzen Sie die VISUALUmgebungsvariable auf pico.
Danke, keinen Krieg zu beginnen, aber ich versuche, vi zu vermeiden, wann immer es möglich ist!