3

Я использую Bash для массового переименования компьютеров, используя часть серийного номера, что довольно легко, но мой клиент попросил добавить год выпуска каждой машины до конца.

Есть адрес:

curl -s https://support-sp.apple.com/sp/product?cc=XXXX

Где XXXX представляет последние четыре цифры серийного номера. Это сервис Apple, который возвращает длинную строку XML с номером модели и годом. Я не могу на всю жизнь получить единственное 4-значное число в XML-результате запроса Apple.com, очищенного и выгруженного в мою переменную.

Я пытаюсь это сделать, и зашла в тупик, почему он вообще ничего не возвращает - когда я запускаю его один в терминале, он просто переходит на следующую строку.

curl -s https://support-sp.apple.com/sp/product?cc=`system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-` | grep -o '(?<!\d)\d{4}(?!\d)'

Действительно ли очевидно, что я делаю не так? Может быть, есть просто лучший, менее сложный способ сделать это?

1 ответ1

2

Итак, я обнаружил, что мне нужно было сделать, и выяснил, почему мой один лайнер не работал. Мне нужно было сломать это немного дальше. Мне удалось наконец установить имя компьютера в качестве префикса для клиента, последние шесть цифр серийного номера (я понимаю, что это немного произвольно, но это то, что хотел клиент) и год, когда был создан Macbook или iMac. используя следующее. Я до сих пор не уверен, почему мой единственный лайнер не работает, я думаю, это потому, что где-то есть несвязанный токен. Я был в состоянии сделать это функция за функцией, как Тото вроде:

#!/bin/bash 

# Logging
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>>/private/var/log/"$(basename $0)"_"$(date "+%Y%m%d_%H%M%S")".log 2>&1

# Variables
theSerial=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 7-)
theModel=$(system_profiler SPHardwareDataType | grep 'Model Name:' | awk -F': ' '{print $2;}')
lastFour=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-)
theYear=$(curl -s https://support-sp.apple.com/sp/product?cc=$lastFour | grep -o '\d\d\d\d')

#XXX is a client code slug
# Begin script
echo "Begin script: $(theNow)"

# Write: ComputerName, HostName, LocalHostName, NetBIOS
touch /private/var/log/fv2.log

    scutil --set ComputerName "XXX-$theSerial-$theYear" #XXX is a client code slug
    scutil --set HostName "XXX-$theSerial-$theYear"
    scutil --set LocalHostName "XXX-$theSerial-$theYear"
    defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName "XXX-$theSerial-$theYear"
    echo "XXX-" > /private/var/log/fv2.log


# Finish up
echo "Finish Script: $theNow"
exit 0

Две вещи - 1 - старые машины Apple могут иметь серийные номера с различным количеством символов. Я не думаю, что они попадут в сферу жизни моего сценария, поэтому мне не нужно сначала считать символы - тогда Apple может когда-нибудь прекратить предоставлять эту услугу или переформатировать ее, добавив еще одну строку из 4 цифр в строку xml , который сломает это.

Это приемлемые риски для меня, но может сломать это в будущем. Это единственный способ получить год выпуска компьютера Apple в виде переменной в командной строке, о которой я знаю.

JC

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .