Shell-Skript-Hilfe

Ich bin neu im Schreiben von Shell-Skripten für Unix und brauche ein wenig Hilfe. Ich bin mir nicht sicher, warum cURL jetzt plötzlich nach dem Ausführen des Skripts beschädigte Pakete herunterlädt, die nicht gemountet werden können, und warum das separate Ausführen der Befehle im Terminal funktioniert, aber während des Skripts schlägt alles fehl, wie z

Für cURL kommt die Meldung zurück, dass der Befehl nicht gefunden wurde. Für den mv-Befehl heißt es, dass die Datei oder das Verzeichnis nicht gefunden werden kann, und natürlich schlägt das Mounten und alles danach fehl.

Könnten Sie sich bitte das Shell-Skript ansehen, um zu sehen, was fehlt oder was ich falsch mache?

#!/bin/sh
#Machines must have cURL installed as a prerequisite to download software from internet or FTP server 

# grab files from www.teamviewer.com or custom FTP server
curl -O http://download.teamviewer.com/download/TeamViewerHost.dmg

# grab TeamViewer from custom FTP server
curl -O https://www.dropbox.com/s/***********/com.TeamViewer8.Settings.plist

# Wait for download
sleep 30s

# Place customized plist file into Library/Preferences
mv ~/Downloads/com.TeamViewer8.Settings.plist /Library/Preferences/

# Mount and Install TeamViewer
hdiutil mount ~/Downloads/TeamViewerHost.dmg
installer -pkg /Volumes/TeamViewerHost/Install\ TeamViewerHost.pkg -target /

# Unmount package
hdiutil unmount /Volumes/TeamViewerHost/
set -euxFügen Sie am Anfang Ihres Skripts ein hinzu . Dies führt dazu, dass es stoppt, wenn der erste Befehl fehlschlägt.
Das ist kein FTP-Server, wenn die URL mit http/https beginnt.

Antworten (5)

Das sollte funktionieren. Ich habe derzeit keine Zeit, die Änderungen/Ergänzungen zu erklären, aber ich werde aktualisieren. Sie müssen dieses Skript als sudo ausführen, damit es funktioniert.

Noch einfacher, sudo chmod +s yourscript- wird als root ausgeführt, ohne dass ein Passwort erforderlich ist.

#!/bin/bash

#Machines must have cURL installed as a prerequisite to download software from internet or FTP server 

#Change to your working directory. 
cd ~/Downloads

#grab files from www.teamviewer.com or custom FTP server
curl -O http://downloadus3.teamviewer.com/download/TeamViewerHost.dmg

#grab TeamViewer from custom FTP server
curl -O https://www.dropbox.com/s/******/com.apple.TeamViewer8.Settings.plist

#Place customized plist file into Library/Preferences
mv ~/Downloads/com.apple.TeamViewer8.Settings.plist /Library/Preferences/

#Mount and Install TeamViewer
hdiutil mount ~/Downloads/TeamViewerHost.dmg
installer -pkg /Volumes/TeamViewerHost/Install\ TeamViewerHost.pkg -target LocalSystem

#Softkill process in order to unmount package
ps aux | grep -i TeamViewer | awk {'print $2'} | xargs kill

#Unmount package
hdiutil unmount /Volumes/TeamViewerHost/
Die einzige Sache ist, dass Sie als ~/Downloads cd müssen und Sie können auch einfach sleep 30s. Guter Softkill-Workaround
Danke für die Eingabe. Warum cd ~/downloads? Ich sehe keine Notwendigkeit, außer vielleicht eine Verschärfung. Die angegebenen Links werden automatisch in ~/Downloads heruntergeladen, ohne dass dies cderforderlich ist. Grüße.
Nun, sie werden /nicht/ automatisch in diesen Ordner heruntergeladen. Sie werden automatisch auf ~ heruntergeladen, zumindest auf meinem MacBook.
Dies funktioniert nicht in allen Fällen, außer in den engsten Fällen. Die Dateien werden in das aktuelle Arbeitsverzeichnis heruntergeladen. Ihre mvAufrufe gehen von einem festen Download-Standort aus. Sudo sollte nicht notwendig sein. Die Befehle, die erhöhte Privilegien benötigen, werden nach ihnen fragen, wenn sie hier erforderlich sind. Außerdem: Sie haben keine Fehlerprüfung. Was ist, wenn die Curl-Aufrufe fehlschlagen?
@IanC. Danke für die Eingabe. Ich habe auch basierend auf Steves Vorschlägen modifiziert. Sofort sudo aus dem Skript entfernt ... schnell gemerkt, dass das dumm war. Das Hinzufügen von bedingten Ausdrücken im Falle des Scheiterns von Curl-Aufrufen wäre sehr sinnvoll ... jetzt aber zu müde. Morgen! Vielen Dank für Ihr Feedback. Beifall.
Danke für all die Hilfe Jungs! Ich bin gerade dabei, das Skript zu aktualisieren und werde es erneut veröffentlichen, nachdem ich alle Ihre Kommentare berücksichtigt habe. @njboot was ist der Zweck der Zeile 'ps aux | grep -i TeamViewer | awk {'$2 drucken'} | xargs kill', denn als ich es manuell durch das Terminal lief, wurde der Bildschirm leer und ich konnte ihm nicht entkommen?
@gogo Wenn Sie das Image bereitstellen und die Software installieren, werden die App und die mit dem Image verknüpften Prozesse ausgeführt. Daher schlägt der letzte Schritt (Unmounten) fehl, ohne dass diese Prozesse zuerst beendet werden.

Für cURL kommt die Meldung zurück, dass der Befehl nicht gefunden wurde

Das musst du zuerst lösen. cURL wird standardmäßig mit OS X 10.9 ausgeliefert und sollte in Ihrer PATHAnnahme enthalten sein, dass Sie sich nicht mit Ihrer PATHUmgebungsvariablen beschäftigt haben. Versuchen Sie es direkt mit:

/usr/bin/curl

stattdessen im Skript. Auch:

which curl

in einem Terminal zeigt Ihnen den vollständigen Pfad zum curlBefehl in Ihrer aktuellen Umgebung.

Hinsichtlich:

curl -O http://download.teamviewer.com/download/TeamViewerHost.dmg

Die Option weist curl an, die Ausgabe in einer Datei im aktuellen Arbeitsverzeichnis-O zu speichern . Das heißt, wenn Sie beim Ausführen dieses Befehls nicht dabei sind , wird die Datei nicht im . Sie sollten Folgendes hinzufügen:~/Downloads~/Downloads

cd ~/Downloads

Zeile, bevor Sie die curl-Befehle aufrufen, oder verwenden Sie , -o <filename-with-a-path>um die Datei an einem bestimmten Ort mit einem bestimmten Namen zu speichern.

Sie sollten die URLs auch in Anführungszeichen ( ") setzen – dies verhindert, dass Shell-Sonderzeichen in den URLs wie &von der Shell interpretiert werden und dazu führen, dass die an curl gesendete URL falsch ist.

Das:

sleep 30s

in völlig unnötig. Die Curl-Aufrufe werden nicht zurückkehren, bis sie die Dateien vollständig heruntergeladen haben. Hinweis: Sie werden zurückkehren, wenn sie die Dateien ebenfalls nicht herunterladen können. Möglicherweise möchten Sie die Ext-Codes der Curl-Aufrufe oder die Existenz der Dateien nach dem Aufruf von Curl überprüfen, um sicherzustellen, dass sie ordnungsgemäß ausgeführt wurden. Oder erwägen Sie, set -eam Anfang des Skripts hinzuzufügen, sodass das Skript beendet wird, wenn ein Befehl einen Exit-Code ungleich Null zurückgibt .

Endlich:

Für den mv-Befehl heißt es, Datei oder Verzeichnis kann nicht gefunden werden, und natürlich schlägt das Mounten und alles danach fehl.

Ihr mvAnruf schlägt fehl, weil Ihre curl-Aufrufe fehlschlagen und die Dateien nicht wie erwartet heruntergeladen werden. Repariere die Curl-Calls und du reparierst den mvCall.

Er hatte ein Problem damit, mvdass er das Problem beheben würde, curlwenn es behoben wäre. Aber guter Beitrag!
@ Steve Ich habe seinen Beitrag in meiner Antwort zitiert. Er sagte "Für cURL kommt zurück und sagt, dass der Befehl nicht gefunden wurde".
Mein Kommentar wurde korrigiert, sorry, dass ich es falsch formuliert habe
Das Reparieren mvwürde immer noch nicht helfen, wenn er versucht, von seinem Skript aus command not foundanzurufen curl.

Das sollte funktionieren:

#!/bin/sh
#Machines must have cURL installed as a prerequisite to download software from internet or FTP server 

# grab files from www.teamviewer.com or custom FTP server
cd ~
curl -O http://downloadus3.teamviewer.com/download/TeamViewerHost.dmg

# grab TeamViewer from custom FTP server
curl -O https://www.dropbox.com/s/***********/com.TeamViewer8.Settings.plist

# Place customized plist file into Library/Preferences
mv ~/com.TeamViewer8.Settings.plist /Library/Preferences/

# Mount and Install TeamViewer
hdiutil mount ~/TeamViewerHost.dmg
installer -pkg /Volumes/TeamViewerHost/Install\ TeamViewerHost.pkg -target /

# Unmount package
hdiutil unmount /Volumes/TeamViewerHost/

Ihr Link zum Herunterladen von TeamviewerHost wurde zurückgegeben

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="http://downloadus3.teamviewer.com/download/TeamViewerHost.dmg">here</a>.</h2>
</body></html>

Als ich die Datei gelesen habe, habe ich den Link geändert.

Dieser erste curlAufruf lädt die Datei in das Verzeichnis herunter, in dem Sie sich zufällig befinden, wenn das Skript ausgeführt wird, und nicht in das Verzeichnis, das ~der mvBefehl erwartet. Besser cd ~/Downloadsam Anfang des Skripts, damit Sie sich an einem bekannten Ort befinden.
Außerdem: keine Fehlerprüfung.

Danke für all die Hilfe Jungs. Unter Berücksichtigung aller großartigen Vorschläge dank Steve, Ian, orkoden und njboot hier ist das Ergebnis des Skripts, das funktioniert. Ich wünschte, ich wüsste, wie man die von Ian vorgeschlagene Fehlerprüfung anwendet, also fügte ich das Set -eux hinzu.

#!/bin/sh
#sudo chmod +s "scriptname" - will run as root without requiring password
#Machines must have cURL installed as a prerequisite to download software from internet or FTP server 

#Stop script when first command fails
set -eux

#Change to your working directory. 
cd ~/Downloads

#grab TeamViewer version 8.dmg package and plist files from custom FTP server or TeamViewer website
curl -O "https://www.dropbox.com/s/*************/com.TeamViewer8.Settings.plist" #file located in location ~/Library/Preferences/
curl -O "https://www.dropbox.com/s/*************/com.teamviewer.teamviewer.plist" #file located in location ~/Library/LaunchAgents/
curl -O "https://www.dropbox.com/s/*************/com.teamviewer.teamviewer_desktop.plist" #file located in location ~/Library/LaunchAgents/

#version 8 download first for installation prior to version 9
curl -O "http://download.teamviewer.com/download/version_8x/TeamViewerHost.dmg"

#Place customized plist file into Library/Preferences and Library/LaunchAgents/
mv ~/Downloads/com.TeamViewer8.Settings.plist ~/Library/Preferences/
mv ~/Downloads/com.teamviewer.teamviewer.plist ~/Library/LaunchAgents/
mv ~/Downloads/com.teamviewer.teamviewer_desktop.plist ~/Library/LaunchAgents/

#Mount and Install TeamViewer version 8
hdiutil mount ~/Downloads/TeamViewerHost.dmg
installer -pkg /Volumes/TeamViewerHost/Install\ TeamViewerHost.pkg -target LocalSystem

#Softkill process in order to unmount package
ps aux | grep -i TeamViewer | awk {'print $2'} | xargs kill

#Unmount package
hdiutil unmount /Volumes/TeamViewerHost/

#version 9 upgrade 
cd ~/Downloads
curl -O "http://downloadus3.teamviewer.com/download/TeamViewerHost.dmg"

#Mount and Install TeamViewer version 9
hdiutil mount ~/Downloads/TeamViewerHost.dmg
installer -pkg /Volumes/TeamViewerHost/Install\ TeamViewerHost.pkg -target LocalSystem

#Softkill process in order to unmount package
ps aux | grep -i TeamViewer | awk {'print $2'} | xargs kill

#Unmount package
hdiutil unmount /Volumes/TeamViewerHost/

Der Zweck des Skripts besteht darin, einen Weg zu finden, TeamViewer 9 über ssh und Terminal im Hintergrund bereitzustellen, ohne Software von Drittanbietern installieren zu müssen, wie in den folgenden Links vorgeschlagen:

http://jdmsysadmin.wordpress.com/2013/09/27/configuring-teamviewer-host-to-be-deployable-via-managed-software-update-munki-on-mac-os-x/

http://jdmsysadmin.wordpress.com/2014/04/16/configuring-teamviewer-host-9-to-be-deployable-with-munki/

Ich würde zuerst versuchen, Ihre URLs für curlund die anderen Befehle in Anführungszeichen zu setzen. Innerhalb des Shell-Skripts kann die Interpunktion Probleme verursachen.

Ändern Sie auch die erste Zeile in #!/bin/bashanstatt sie an zu senden sh.

/bin/shist eine volle und richtige bashHülle. Das war zumindest für alle OS X-Veröffentlichungen so. Sehen Sie /bin/sh --version, wenn Sie dies bezweifeln. Keine Notwendigkeit, die Linie zu ändern #!.