Ich habe ein Skript (meistens geliehen), mit dem scutil
Computer basierend auf Werten in einer CSV-Datei umbenannt werden. Es vergleicht die Seriennummer mit einem Computernamen, legt eine Variable fest und benennt dann ComputerName
, HostName
, und LocalHostName
mit der Variablen um. Als Referenz wird der Name seinSFO-C2900-MBP
Hier ist das Skript:
#!/bin/bash
echo "-----Starting-----"
# Get serial from ioreg and assign
serial="$(ioreg -l | grep IOPlatformSerialNumber | sed -e 's/.*\"\(.*\)\"/\1/')"
#Initialize compName to null
compName=''
#Loop through CSV looking for a match
while IFS=',' read ser loc; do
if [ "$serial" == "$ser" ]; then
compName=$loc
echo "Serial Matched with name: $compName"
fi
done < /Volumes/Macintosh\ HD/Users/Shared/Configuration/names.csv
#If compName is not null, use scutil to rename. Otherwise user must manually rename
if [[ -z $compName ]]; then
echo "This computer was not found on the list, you must manually rename it."
else
echo "Setting Host Name to $compName"
scutil --set HostName $compName
echo "Setting Computer Name to $compName"
scutil --set ComputerName $compName
echo "Setting Local Host Name to $compName"
scutil --set LocalHostName $compName
fi
echo "-----Finished Renaming-----"
Daraus ergeben sich zwei Dinge:
1) Ein Fehler wird ausgegeben, wenn das Skript versucht, Folgendes umzubenennen LocalHostName
:SCPreferencesSetLocalHostName() failed: Invalid argument
2) Das Terminal wird nach dem Beenden/Neustart/usw. Folgendes tun: Das Terminal zeigt ein Fragezeichen über dem Ordner, außerdem fehlt der Hostname
Das manuelle Festlegen dieser Werte über das Terminal scutil --set {def}
funktioniert einwandfrei und stellt das normale Verhalten des Terminals wieder her.
Ich habe folgendes versucht:
Meistens ist das Problem des Skripts, was es vor allem mit Terminal macht - ich kann das LocalHostName-Problem umgehen. Seltsamerweise scutil --get {def}
gibt Terminal die richtigen Werte aus, wenn Sie diese ausführen.
In den Kommentaren fragte sich @MorganR, ob der Code, der aus der CSV-Datei liest, ein seltsames Zeichen in enthielt $compName
.
Eine Möglichkeit, auf ungerade, vielleicht nicht druckbare Zeichen zu testen, ist die Verwendung von od
. Es hat einen obskuren Namen (steht für "octal dump"), ist aber nützlich. Es zeigt die Details jedes Zeichens in einem Eingabestrom.
Normalerweise beginne ich mit -c
argument, was dazu führt, dass od
jedes Zeichendetail als "Escape-Zeichen im C-Stil" ausgegeben wird ... es gibt andere Argumente, die als Hex, Oktal (noch gelegentlich nützlich!) usw. ausgegeben werden können.
Zum Beispiel (beachten Sie, dass das normalerweise Unsichtbare \n
angezeigt wird):
$ echo "foo" | od -c
0000000 f o o \n
0000004
Also, wenn das Sinn macht, ist mein Vorschlag: Versuchen Sie, die Zeile echo $compName | od -c
nach dem Abschnitt "Schleife durch die CSV" zum Skript hinzuzufügen.
In den Kommentaren hat sich herausgestellt, dass es sich bei dem Problem um einen unerwarteten \r
Charakter handelt. Ich denke, die wahrscheinliche Ursache dafür ist, dass die CSV-Datei CRLF (= \r\n
) Zeilenenden hat (wurde sie vielleicht auf einem Windows-System erstellt?), aber der read ser loc
Befehl im Skript erwartet nur LF (= \n
).
Ich habe das gleiche mit der folgenden Zeichenfolge abgeschlossen:
compName=${loc::9};
was tatsächlich das 9. Zeichen der gespeicherten Variablen entfernt.
Jan C.
$compName
Variable zu zitieren, falls sie als Option interpretiert wird? Versuchen:scutil --set LocalHostName "$compName"
glatt
scutil --set LocalHostName
Leitung. Ich möchte auch hinzufügen, dass das Verschwinden des Namens in Terminal behoben wird, indem esscutil --set HostName
manuell über Terminal anstelle des Skripts ausgeführt wird.Jan C.
sudo <name of the script>
Recht?glatt
MorganR
glatt
scutil --get HostName
es ausführen, wird es angezeigt, aber Terminal funktioniert nicht richtig, bis Sie esscutil --set HostName
mit der richtigen Variable ausführen, selbst nach dem Neustart.MorganR
glatt
Ashley
echo $compName | od -c
nach dem Abschnitt "Schleife durch die CSV" zum Skript hinzuzufügen. (Um mitod
was zu experimentieren, versuchen Sie es zBecho foo | od -c
im Terminal ...)glatt
od
zeigte das Problem und dannsed
entfernte ich das irrelevante Zeichen. Bitte posten Sie Ihre Antwort als Antwort und ich werde akzeptieren :)Ashley
MorganR