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/
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/
sleep 30s
. Guter Softkill-Workaroundcd ~/downloads
? Ich sehe keine Notwendigkeit, außer vielleicht eine Verschärfung. Die angegebenen Links werden automatisch in ~/Downloads heruntergeladen, ohne dass dies cd
erforderlich ist. Grüße.mv
Aufrufe 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?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 PATH
Annahme enthalten sein, dass Sie sich nicht mit Ihrer PATH
Umgebungsvariablen 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 curl
Befehl 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 -e
am 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 mv
Anruf schlägt fehl, weil Ihre curl-Aufrufe fehlschlagen und die Dateien nicht wie erwartet heruntergeladen werden. Repariere die Curl-Calls und du reparierst den mv
Call.
mv
dass er das Problem beheben würde, curl
wenn es behoben wäre. Aber guter Beitrag!mv
würde immer noch nicht helfen, wenn er versucht, von seinem Skript aus command not found
anzurufen 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.
curl
Aufruf 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 mv
Befehl erwartet. Besser cd ~/Downloads
am Anfang des Skripts, damit Sie sich an einem bekannten Ort befinden.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:
Ich würde zuerst versuchen, Ihre URLs für curl
und 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/bash
anstatt sie an zu senden sh
.
/bin/sh
ist eine volle und richtige bash
Hü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 #!
.
orkoden
set -eux
Fügen Sie am Anfang Ihres Skripts ein hinzu . Dies führt dazu, dass es stoppt, wenn der erste Befehl fehlschlägt.bfontaine