如何从 Apple 系统分析器 SPHardwareDataType 获取特定字符串值

如何从 Apple 系统分析器 SPHardwareDataType 获取特定字符串值

我正在使用 Bash 使用序列号的一部分来批量重命名计算机,这非常简单,但我的客户要求将每台机器的制造年份附加到末尾。

有一个地址:

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

其中XXXX代表序列号的最后四位数字。这是一项 Apple 服务,返回一个较长的 XML 字符串,其中包含型号和年份。我无论如何也无法将 Apple.com 查询的 XML 结果中唯一的 4 位数字清理并转储到我的变量中。

我正在尝试这个,并且不明白为什么它什么都不返回——当我在终端中单独运行它时,它只是移动到下一行。

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

因此,我发现了我需要做什么,并找出了我的一行代码不起作用的原因。我需要进一步分解它。我终于能够将计算机的名称设置为客户端的前缀、序列号的最后六位数字(我知道这有点随意,但这是客户想要的)以及 Macbook 或 iMac 的制造年份,使用以下内容。我仍然不确定为什么我的一行代码不起作用,我认为这是因为某处有一个未耦合的令牌。我能够按照 Toto 的建议逐个功能地完成它:

#!/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 可能有一天会停止提供这项服务,或者重新格式化它,在 xml 行中添加另一个 4 位字符串,这将破坏这一点。

对于我来说,这些风险是可以接受的,但将来可能会出现问题。据我所知,这是在命令行中将 Apple 计算机的制造年份放入 var 中的唯一方法。

JC

答案2

在这里,我想说说我的看法,这是另一个变化的答案。我的答案基于上面的输入,并得到了以下内容,它可以用更少的代码行运行,并满足我们的需求:

# Assign variables to initialize computer name
MODEL=`sysctl hw.model | sed 's/[0-9, ]//g' | cut -c 10-`
YEAR=`curl -s https://support-sp.apple.com/sp/product?cc=JG5J | grep -o '\d\d\d\d' | cut -c 3-`
SERIAL=`system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 7-`

# Change computer name
COMPUTER_NAME=$MODEL$YEAR-$SERIAL
sudo scutil --set ComputerName $COMPUTER_NAME && \
sudo scutil --set HostName $COMPUTER_NAME && \
sudo scutil --set LocalHostName $COMPUTER_NAME && \
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName -string $COMPUTER_NAME
dscacheutil -flushcache # flush the DNS cache for good measure

希望这对某人有帮助!

相关内容