Script per cambiare il nomecomputer / hostname che causa un bizzarro comportamento del terminale

4

Ho uno script (per lo più preso in prestito) che utilizza scutil per rinominare i computer in base ai valori in un file CSV. Corrisponde al numero seriale al nome di un computer, imposta una variabile, quindi rinomina ComputerName , HostName e LocalHostName con la variabile. Per riferimento, il nome sarà SFO-C2900-MBP

Ecco lo script:

#!/bin/bash 

echo "-----Starting-----"

# Get serial from ioreg and assign
serial="$(ioreg -l | grep IOPlatformSerialNumber | sed -e 's/.*\"\(.*\)\"//')" 

#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-----"

Da ciò stanno accadendo due cose:

1) Viene generato un errore quando lo script tenta di rinominare LocalHostName : SCPreferencesSetLocalHostName() failed: Invalid argument

2) Il Terminale, dopo aver chiuso / riavviato / etc, farà quanto segue: Terminale che mostra il Punto interrogativo sulla cartella, anch'esso mancante del nome host

L'impostazione manuale di questi valori tramite terminale utilizzando scutil --set {def} funziona correttamente e ripristina il normale funzionamento di Terminal.

Ho provato quanto segue:

  • Rimozione delle linee LocalHostName dallo script
  • Impostazione del valore LocalHostName su una variabile impostata all'interno dello script e non sul file CSV

Per lo più, il problema dello script è quello che fa a Terminal più di ogni altra cosa: posso aggirare il problema LocalHostName. Stranamente, quando si esegue scutil --get {def} su quelli, Terminal restituisce i valori corretti.

    
posta smoooosher 28.05.2015 - 22:19
fonte

2 risposte

4

Nei commenti, @MorganR si chiedeva se il codice che legge dal file CSV includesse uno strano carattere all'interno di $compName .

Un modo per testare caratteri dispari, forse non stampabili, è usare od . Ha un nome oscuro (sta per "dump ottale"), ma è utile. Mostra i dettagli di ogni carattere in un flusso di input.

In genere inizio usando l'argomento -c , che fa sì che od visualizzi ogni dettaglio di carattere come "caratteri di escape in stile C" ... ci sono altri argomenti da produrre come hex, ottale (ancora occasionalmente utile!) , ecc.

Ad esempio (si noti che il% non visibile normalmente co_de è mostrato):

$ echo "foo" | od -c
0000000    f   o   o  \n                                                
0000004

Quindi, se ciò ha senso, il mio suggerimento è: prova ad aggiungere la riga \n allo script dopo la sezione "loop through the CSV".

Nei commenti, il problema si è rivelato un inaspettato carattere echo $compName | od -c . Penso che la causa probabile per questo è che il file CSV ha terminazioni di riga CRLF (= \r ) (è stato creato su un sistema Windows forse?), Ma il comando \r\n nello script si aspetta solo LF (=% codice%).

    
risposta data 04.06.2015 - 09:37
fonte
0

Ho completato lo stesso con la stringa seguente:

compName=${loc::9};

che rimuove effettivamente il nono carattere della variabile memorizzata.

    
risposta data 26.05.2016 - 16:12
fonte

Leggi altre domande sui tag