Soy nuevo en escribir scripts de shell para Unix y necesito un poco de ayuda. No estoy seguro de por qué cURL ahora, de repente, después de ejecutar el script, está descargando paquetes dañados que no se pueden montar y por qué ejecutar los comandos por separado en la Terminal funciona, pero durante el script todo falla, como
Para cURL, vuelve diciendo comando no encontrado Para el comando mv dice que no se puede encontrar el archivo o directorio y, por supuesto, el montaje y todo lo demás falla.
¿Podría echar un vistazo a la secuencia de comandos de Shell para ver qué falta o si lo estoy haciendo mal?
#!/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/
Esto debería funcionar. Actualmente no tengo tiempo para explicar los cambios/adiciones, pero actualizaré. Debe ejecutar este script como sudo para que funcione.
Aún más fácil, sudo chmod +s yourscript
se ejecutará como root sin requerir contraseña.
#!/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
. Buena solución blandacd ~/downloads
? No veo la necesidad, aparte de quizás apretarlo. Los enlaces indicados se descargan automáticamente en ~/Downloads, sin cd
necesidad de nada. Saludos.mv
llamadas asumen una ubicación de descarga fija. Sudo no debería ser necesario. Los comandos que necesitan privilegios elevados los solicitarán si son necesarios aquí. Además: no tienes comprobación de errores. ¿Qué pasa si las llamadas curl fallan?Para cURL vuelve diciendo comando no encontrado
Tienes que resolver esto primero. cURL se envía de forma predeterminada con OS X 10.9 y debería estar en su PATH
suposición de que no se ha burlado de su PATH
variable de entorno. Intenta llamarlo directamente con:
/usr/bin/curl
en el guión en su lugar. También:
which curl
en una Terminal le mostrará la ruta completa al curl
comando en su entorno actual.
Acerca de:
curl -O http://download.teamviewer.com/download/TeamViewerHost.dmg
La -O
opción le dice a curl que guarde la salida en un archivo en el directorio de trabajo actual . Eso significa que si no está dentro ~/Downloads
cuando ejecuta ese comando, el archivo no se guarda en ~/Downloads
. Debes agregar un:
cd ~/Downloads
línea antes de llamar a los comandos curl o usar -o <filename-with-a-path>
para guardar el archivo en una ubicación específica con un nombre específico.
También debe envolver las URL entre comillas ( "
); esto evita que los caracteres especiales de shell en las URL &
sean interpretados por el shell y provoquen que la URL enviada a curl sea incorrecta.
Este:
sleep 30s
en completamente innecesario. Las llamadas curl no volverán hasta que hayan descargado completamente los archivos. Nota: también volverán si no pueden descargar los archivos. Es posible que desee considerar verificar los códigos de extensión de las llamadas a curl o la existencia de los archivos después de llamar a curl para asegurarse de que se ejecutaron correctamente. O considere agregar set -e
a la parte superior de la secuencia de comandos para que la secuencia de comandos salga si algún comando devuelve un código de salida distinto de cero .
Finalmente:
Para el comando mv, dice que no se puede encontrar el archivo o el directorio y, por supuesto, el montaje y todo lo demás falla.
Su mv
llamada está fallando porque sus llamadas curl están fallando y no están descargando los archivos como se esperaba. Arregla las llamadas curl y arreglarás la mv
llamada.
mv
el que solucionaría el problema curl
cuando se rectificara. Sin embargo buen post!mv
aún no ayudaría si está tratando command not found
de llamar curl
desde su guión.Esto debería funcionar:
#!/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/
Su enlace para descargar TeamviewerHost devuelto
<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>
cuando leí el archivo, cambié el enlace.
curl
llamada descargará el archivo al directorio en el que se encuentra cuando se ejecuta el script, no como espera ~
el comando. mv
Es mejor hacerlo cd ~/Downloads
al comienzo del guión para que esté en una ubicación conocida.Gracias por toda la ayuda chicos. Tomando todo en cuenta desde las increíbles sugerencias gracias a Steve, Ian, orkoden y njboot, aquí está el resultado del script que funciona. Desearía saber cómo aplicar la verificación de errores que Ian había sugerido, así que agregué el conjunto -eux.
#!/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/
El propósito de la secuencia de comandos es encontrar una manera de implementar TeamViewer 9 a través de ssh y terminal de forma silenciosa sin tener que instalar software de terceros, como se sugiere en los siguientes enlaces:
Primero intentaría poner comillas alrededor de sus URL curl
y los otros comandos. Dentro del script de shell, la puntuación puede causar problemas.
También cambie la primera línea a #!/bin/bash
en lugar de enviarla a sh
.
/bin/sh
es un caparazón completo y adecuado bash
. Ha sido así para todos los OS X lanzados al menos. A ver /bin/sh --version
si lo dudas. No es necesario cambiar la #!
línea.
orkoden
set -eux
en la parte superior de su secuencia de comandos. Esto hará que se detenga cuando falle el primer comando.bfontaine