You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS shell脚本设置LocalHostName报Invalid argument错误排查

macOS 10.14+ 设置LocalHostName报无效参数错误解决

报错根因

三类主机名在macOS里的校验规则不一致:

  • ComputerName:系统界面展示的电脑名,支持中文、空格、特殊符号,无严格格式限制
  • HostName:终端、SSH等场景使用的主机名,规则相对宽松
  • LocalHostName:Bonjour局域网服务(隔空投送、局域网设备发现)使用的名称,对应局域网内的xxx.local域名,严格遵循DNS主机名规范,仅允许小写字母、数字、连字符,连字符不能出现在首尾,总长度不能超过63个字符,只要传入值包含空格、中文、下划线、标点等非合规字符,就会抛出SCPreferencesSetLocalHostName() failed: Invalid argument错误。

原脚本直接将用户输入的原始值传入LocalHostName设置接口,只要输入内容不符合上述规则就会触发报错,删除对应代码行后自然不会触发校验错误。

修复方法

获取用户输入后,新增一步格式转换,生成符合LocalHostName规则的字符串,用这个合规值设置LocalHostName、HostName和NetBIOS名即可,原始输入值保留给ComputerName使用,兼顾用户自定义显示和系统规则要求。

修复后完整脚本

#!/bin/bash
defaults=/usr/bin/defaults

# 获取当前控制台登录用户
CurrentUser=$(/usr/sbin/scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ && ! /loginwindow/ {print $3}')
# 弹窗采集用户输入的新计算机名
MacName=$(sudo -u "$CurrentUser" /usr/bin/osascript -e 'tell application "System Events" to set MacName to text returned of (display dialog "Enter the new Computer Name:" buttons "Continue" default button "Continue" default answer "" with icon 1)')

# 转换生成LocalHostName合规值:非字母数字字符统一替换为连字符,合并连续连字符,移除首尾连字符,截断到最大允许长度63位
CleanHostName=$(echo "$MacName" | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-z0-9-]/-/g' -e 's/-\+/-/g' -e 's/^-*//' -e 's/-*$//' | cut -c 1-63)
# 处理用户输入全为特殊字符导致转换后为空的极端场景,设置默认值
if [ -z "$CleanHostName" ]; then
    CleanHostName="mac"
fi

# 执行主机名配置
scutil --set ComputerName "$MacName"
scutil --set HostName "$CleanHostName"
scutil --set LocalHostName "$CleanHostName"
# NetBIOS名最大支持15字符,单独截断避免SMB服务兼容问题
$defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server NetBIOSName -string "$(echo $CleanHostName | cut -c 1-15)"

# 刷新缓存使配置生效
/usr/bin/dscacheutil -flushcache

注:脚本需要使用sudo权限执行,否则scutil的系统级配置会因权限不足失败。

内容的提问来源于stack exchange,提问作者TiggerTazz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:06:51