Script para cambiar Computername / hostname causando un comportamiento extraño en la Terminal

4

Tengo un script (en su mayoría prestado) que utiliza scutil para cambiar el nombre de las computadoras basadas en valores en un archivo CSV. Hace coincidir el número de serie con el nombre de una computadora, establece una variable y luego cambia el nombre de ComputerName , HostName y LocalHostName con la variable. Para referencia, el nombre será SFO-C2900-MBP

Aquí está el 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-----"

Dos cosas están sucediendo a partir de esto:

1) Se produce un error cuando el script intenta cambiar el nombre de LocalHostName : SCPreferencesSetLocalHostName() failed: Invalid argument

2) La Terminal, después de salir / reboot / etc, hará lo siguiente: Terminal que muestra el signo de interrogación sobre la carpeta, también falta el nombre de host

La configuración manual de estos valores a través del terminal usando scutil --set {def} funciona bien y restaura el funcionamiento normal del terminal.

He intentado lo siguiente:

  • Eliminando las líneas de LocalHostName del script
  • Establecer el valor de LocalHostName en una variable establecida dentro del script y no en el archivo CSV

Principalmente, el problema de la secuencia de comandos es lo que le hace a Terminal más que nada: puedo solucionar el problema LocalHostName. Por extraño que parezca, cuando ejecuta scutil --get {def} en esos, el terminal genera los valores correctos.

    
pregunta smoooosher 28.05.2015 - 22:19

2 respuestas

4

En los comentarios, @MorganR se preguntó si el código que se lee del archivo CSV incluía un carácter extraño dentro de $compName .

Una forma de probar caracteres impares, tal vez no imprimibles, es usar od . Tiene un nombre oscuro (significa "volcado octal"), pero es útil. Muestra los detalles de cada personaje en un flujo de entrada.

Por lo general, comienzo con el argumento -c , lo que hace que od genere los detalles de cada carácter como "caracteres escapados de estilo C" ... hay otros argumentos que se muestran como hexadecimal, octal (¡aún así es útil! , etc.

Por ejemplo (observe que normalmente se muestra \n invisible):

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

Entonces, si eso tiene sentido, mi sugerencia es: intente agregar la línea echo $compName | od -c a la secuencia de comandos después de la sección "recorrer el CSV".

En los comentarios, el problema ha resultado ser un carácter inesperado \r . Creo que la causa probable de esto es que el archivo CSV tiene finales de línea CRLF (= \r\n ) (¿se creó en un sistema Windows quizás?), Pero el comando read ser loc en el script está esperando solo LF (=% código%).

    
respondido por el Ashley 04.06.2015 - 09:37
0

He completado lo mismo con la siguiente cadena:

compName=${loc::9};

que realmente elimina el noveno carácter de la variable almacenada.

    
respondido por el Bhavesh Panchal 26.05.2016 - 16:12

Lea otras preguntas en las etiquetas