Ayuda de script de shell

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/
Agregue un set -euxen la parte superior de su secuencia de comandos. Esto hará que se detenga cuando falle el primer comando.
Eso no es un servidor FTP si la URL comienza con http/https.

Respuestas (5)

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 yourscriptse 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/
Lo único es que necesita cd como ~/Downloads y también puede deshacerse de sleep 30s. Buena solución blanda
Gracias por la entrada ¿ Por qué cd ~/downloads? No veo la necesidad, aparte de quizás apretarlo. Los enlaces indicados se descargan automáticamente en ~/Downloads, sin cdnecesidad de nada. Saludos.
Bueno, no se descargan automáticamente en esa carpeta. Se descargan automáticamente a ~, al menos en mi macbook.
Esto no funciona bien en todos los casos excepto en los más estrechos. Los archivos se descargan en el directorio de trabajo actual. Sus mvllamadas 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?
@IanC. Gracias por la entrada También he modificado según las sugerencias de Steve. Inmediatamente eliminé sudo del script... rápidamente me di cuenta de que era estúpido. Agregar expresiones condicionales en caso de falla de las llamadas curl tendría mucho sentido... sin embargo, demasiado cansado ahora. ¡Mañana! Gracias por tus comentarios. Salud.
¡Gracias por toda la ayuda chicos! Estoy en el proceso de actualizar el guión ahora y lo volveré a publicar después de tomar en cuenta todos sus comentarios. @njboot ¿cuál es el propósito de la línea 'ps aux | grep-i TeamViewer | awk {'imprimir $2'} | xargs kill' porque cuando lo ejecuté a través de la terminal manualmente, la pantalla quedó en blanco y no pude escapar de ella.
@gogo Cuando monta la imagen e instala el software, la aplicación y los procesos asociados con la imagen se ejecutan; como resultado, el último paso (desmontaje) falla sin eliminar primero estos procesos.

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 PATHsuposición de que no se ha burlado de su PATHvariable 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 curlcomando en su entorno actual.

Acerca de:

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

La -Oopció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 ~/Downloadscuando 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 -ea 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 mvllamada 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 mvllamada.

Tenía un problema con mvel que solucionaría el problema curlcuando se rectificara. Sin embargo buen post!
@Steve Cité su publicación en mi respuesta. Dijo: "Para cURL vuelve diciendo comando no encontrado".
Arreglé mi comentario, lo siento, lo redacté mal.
Arreglar mvaún no ayudaría si está tratando command not foundde llamar curldesde 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.

Esa primera curlllamada descargará el archivo al directorio en el que se encuentra cuando se ejecuta el script, no como espera ~el comando. mvEs mejor hacerlo cd ~/Downloadsal comienzo del guión para que esté en una ubicación conocida.
Además: no hay comprobación de errores.

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:

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/

Primero intentaría poner comillas alrededor de sus URL curly los otros comandos. Dentro del script de shell, la puntuación puede causar problemas.

También cambie la primera línea a #!/bin/bashen lugar de enviarla a sh.

/bin/shes un caparazón completo y adecuado bash. Ha sido así para todos los OS X lanzados al menos. A ver /bin/sh --versionsi lo dudas. No es necesario cambiar la #!línea.