Como obter um valor de string específico de um criador de perfil do sistema da Apple SPHardwareDataType

3

Estou usando o Bash para renomear os computadores em massa usando uma parte do número de série, o que é bastante fácil, mas meu cliente solicitou que o ano de fabricação de cada máquina fosse anexado ao final.

Existe um endereço:

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

Onde o XXXX representa os últimos quatro dígitos do número de série. É um serviço da Apple que retorna uma string XML longa com o número do modelo e o ano lá. Não posso, para minha vida, obter o único número de 4 dígitos no resultado XML da consulta do Apple.com, limpo e despejado no meu var.

Estou tentando isso e fiquei perplexo a respeito de por que ele não retorna nada - quando eu o executo sozinho em um terminal, ele simplesmente passa para a próxima linha.

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)'

É realmente óbvio o que estou fazendo de errado? Existe apenas uma maneira melhor e menos complicada de fazer isso?

    
por case 07.09.2018 / 18:54

1 resposta

2

Então, eu descobri o que precisava fazer e descobri por que meu forro não estava funcionando. Eu precisava quebrar um pouco mais. Consegui finalmente definir o nome do computador como um prefixo para o cliente, os últimos seis dígitos do número de série (percebo que isso é um pouco arbitrário, mas é o que o cliente queria) e o ano em que o Macbook ou o iMac foi construído usando o seguinte. Eu ainda não tenho certeza porque meu forro não funciona, eu acho que é porque há um token desacoplado em algum lugar. Eu pude fazer isso funcionar por função como Toto sugeriu:

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

Duas coisas - 1 - máquinas Apple mais antigas podem ter números de série com um número diferente de caracteres. Eu não acho que eles estarão no escopo da vida do meu roteiro, então eu não preciso contar os caracteres primeiro - então a Apple pode algum dia deixar de fornecer este serviço, ou reformatar adicionando outra string de 4 dígitos à linha de xml , que vai quebrar isso.

Estes são riscos aceitáveis para mim, mas podem quebrar isso no futuro. Esta é a única maneira de obter o ano de fabricação de um computador Apple em um var na linha de comando que eu conheço.

JC

    
por 11.09.2018 / 16:30