Довідка сценарію оболонки

Я новачок у написанні скриптів оболонки для Unix і потребує невеликої допомоги. Я не впевнений, чому cURL зараз раптово після запуску скрипту завантажує пошкоджені пакунки, які неможливо встановити, і чому окремо виконують команди в роботі Terminal, але під час сценарію все виходить з ладу

Для cURL це повертається кажучи команди не знайдено Для команди mv сказано не може знайти файл або каталог і, звичайно, монтаж, і все після цього не вдасться.

Не могли б ви звернути увагу на скрипт оболонки, щоб побачити, що відсутнє, або я роблю неправильно?

#!/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/
3
Це не FTP-сервер, якщо URL-адреса починається з http/https.
додано Автор chollida, джерело
Додайте set -eux у верхню частину сценарію. Це призведе до його зупинки після невдалої першої команди.
додано Автор Martin, джерело

5 Відповіді

Для cURL повертається, що команда не знайдена

Ви повинні вирішити це першим. cURL виконує дефолт з OS X 10.9 і має бути у вашому PATH , якщо ви не мавпа з вашою змінною середовища PATH . Спробуйте зателефонувати безпосередньо з:

/usr/bin/curl

замість цього сценарію. Також:

which curl

у терміналі покаже вам повний шлях до команди curl у поточному середовищі.

Щодо:

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

Опція -O повідомляє curl зберегти вивід у файл у поточному робочому каталозі . Це означає, що якщо ви не вказуєте файл ~/Downloads під час запуску цієї команди, файл не буде збережено в ~/Downloads . Вам слід додати:

cd ~/Downloads

line before calling the curl commands or use -o to save the file to a specific location with a specific name.

You should also wrap the URLs in quotes (") -- this stops shell special characters in the URLs like & from being interpreted by the shell and causing the URL sent to curl to be incorrect.

Це:

sleep 30s

в абсолютно непотрібних. Виклики curl не повернуться, поки вони повністю не завантажуватимуть файли. Примітка: вони повернуться, якщо не вдасться завантажити файли. Можливо, ви захочете розглянути перевірку ext-кодів викликів curl або для існування файлів після виклику curl, щоб переконатися, що вони працюють правильно. Або подумайте про додавання set -e у верхню частину сценарію, щоб сценарій завершується, якщо будь-яка команда повертає ненульовий код виходу .

Нарешті:

Для команди mv неможливо знайти файл або каталог і звичайно монтування, і все після цього не вдалося.

Ваш виклик mv не виконується, оскільки виклики завитку не виконуються і файли не завантажуються, як очікувалося. Виправлення викликів завивки, і ви виправите виклик mv .

7
додано
@ Steve я процитував свою посаду в моїй відповіді. Він сказав: "Для CURL це повертається кажучи команди не знайдено".
додано Автор shsteimer, джерело
Виправлення mv все одно не допомогло б, якщо він не отримає команду , яка намагається викликати curl зі свого сценарію.
додано Автор shsteimer, джерело
Виправлено мій коментар, вибачте, що я написав це неправильно
додано Автор T888, джерело
У нього виникла проблема з mv , яка виправила б проблему з curl , коли вона була виправлена. Однак хороший пост!
додано Автор T888, джерело

Це має спрацювати. У мене зараз немає часу на пояснення змін/доповнень, але я буду оновлювати. Ви повинні запустити цей сценарій як sudo, щоб він працював.

Ще простіше, sudo chmod + s твору - буде виконуватися як root без необхідності введення пароля.

#!/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/
3
додано
Це не працює добре у всіх, крім найменших випадках. Файли завантажуються в поточний робочий каталог. Виклики mv припускають фіксоване місцезнаходження завантаження. Судо не повинно бути необхідним. Команди, які потребують підвищених привілей, підкажуть їм, якщо вони потрібні тут. Також: у вас немає перевірки помилок. Що робити, якщо виклики згортаються?
додано Автор shsteimer, джерело
Дякуємо за допомогу! Я перебуваю в процесі оновлення сценарію зараз і повторно розміщуватимуться після того, як прийму всі ваші коментарі до гри. @njboot Яка мета рядка ps aux | grep -i TeamViewer | awk {'print $ 2'} | xargs kill ', тому що, коли я запустив її через термінал вручну, він перевернув екран порожнім, і я не міг уникнути цього?
додано Автор pmcilreavy, джерело
@gogo Під час монтування зображення та встановлення програмного забезпечення, програми та процесів, пов'язаних із запуском зображення - в результаті, останній крок (розмотування) завершиться невдало, не вдавшись до першого процесу.
додано Автор linusthe3rd, джерело
@IanC. Дякуємо за інформацію. Я також змінювався на основі пропозицій Стіва. Відразу ж видалили sudo з скрипта ... швидко зрозуміли, що це було дурно. Додавання умовних виразів у разі невдачі викликів завитку зробить багато сенсу ... тепер вже дуже втомився. Завтра! Дякуємо за ваш відгук. Привітання.
додано Автор linusthe3rd, джерело
Дякуємо за інформацію. Чому cd ~/завантаження ? Я не бачу потреби, окрім, можливо, затягування. Зазначені посилання автоматично завантажуються у файл ~/Downloads, без будь-якого коду cd . З повагою.
додано Автор linusthe3rd, джерело
Ну, вони/не/завантажують автоматично в цю папку. Вони автоматично завантажуються в ~, принаймні на моєму macbook.
додано Автор T888, джерело
Єдине, вам потрібно записати як ~/Завантаження, а також ви можете просто позбутися sleep 30s . Хороший обхідний метод softkill
додано Автор T888, джерело

Це має працювати:

#!/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/

Ваше посилання для завантаження TeamviewerHost повернулося

<html><head><title>Object moved</title></head><body>

Object moved to here.

</body></html>

коли я прочитав файл, я змінив посилання.

2
додано
Цей перший виклик curl завантажить файл до каталогу, у якому ви перебуваєте, коли сценарій запущений, а не до ~ як команди mv очікує. Краще cd ~/Завантаження на початку сценарію, щоб ви знаходилися в відомому місці.
додано Автор shsteimer, джерело
Також: немає перевірки помилок.
додано Автор shsteimer, джерело
Yuuuuup спасибі за те, що ловили
додано Автор T888, джерело

Дякуємо за допомогу всім хлопцям. Беручи все під увагу з дивовижних пропозицій завдяки Steve, Ian, orkoden і njboot, це результат сценарію, який працює. Хотілося б, щоб я знав, як застосувати перевірку помилок, яку запропонував Ян, щоб я додав набір -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/

Мета скрипту - знайти спосіб розгортання TeamViewer 9 через ssh і термінал тихо, без необхідності встановлення стороннього програмного забезпечення, як це передбачено в наступних посиланнях:

os-x/

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

1
додано

Спочатку я спробую помістити лапки навколо URL-адрес для curl та інших команд. У скрипті оболонки пунктуація може викликати проблеми.

Також змініть перший рядок на #!/Bin/bash , а не на sh .

0
додано
/bin/sh - повна оболонка bash . Таким чином, для всіх OS X випущений принаймні. Див. /bin/sh --version , якщо ви сумніваєтеся в цьому. Не потрібно змінювати рядок #! .
додано Автор shsteimer, джерело