4 votos

script para cambiar Computername/hostname causando un comportamiento extraño de la Terminal

Tengo un script (mayoritariamente prestado) que utiliza scutil para cambiar el nombre de los ordenadores basándose en los valores de un archivo CSV. Hace coincidir el número de serie con un nombre de ordenador, establece una variable y luego renombra el ComputerName , HostName y LocalHostName con la variable Como 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/.*\"\(.*\)\"/\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-----"

De esto se desprenden dos cosas:

1) Se lanza un error cuando el scriptintenta renombrar el LocalHostName : SCPreferencesSetLocalHostName() failed: Invalid argument

2) La Terminal, después de salir/reiniciar/etc, hará lo siguiente: Terminal showing Question Mark over folder, also missing hostname El terminal muestra un signo de interrogación sobre la carpeta, también falta el nombre de host

La configuración de estos valores de forma manual a través del terminal mediante scutil --set {def} funcionan bien y restablecen el comportamiento normal del Terminal.

He probado lo siguiente:

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

Principalmente, el problema del script es lo que le hace a Terminal más que nada - puedo trabajar alrededor del problema de LocalHostName. Extrañamente, cuando se ejecuta scutil --get {def} en ellos, el Terminal produce los valores correctos.

0 votos

¿Ha pensado en citar a su $compName variable por si se interpreta como una opción? Inténtalo: scutil --set LocalHostName "$compName"

0 votos

@IanC. No, el mismo problema en el scutil --set LocalHostName línea. Me gustaría añadir también que la desaparición del nombre en Terminal se arregla con scutil --set HostName que se ejecuta manualmente a través del Terminal en lugar del script.

0 votos

Y estás llamando a tu script con sudo <name of the script> ¿verdad?

4voto

Ashley Puntos 2261

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

Una forma de comprobar si hay caracteres extraños, quizás no imprimibles, es utilizar od . Tiene un nombre oscuro (significa "octal dump"), pero es útil. Muestra el detalle de cada carácter en un flujo de entrada.

Suelo empezar utilizando -c que hace que od para dar salida a cada detalle de carácter como "caracteres escapados estilo C"... hay otros argumentos para dar salida como hexadecimal, octal (¡aún ocasionalmente útil!), etc.

Por ejemplo (fíjese en el normalmente invisible \n se muestra):

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

Así que, si eso tiene sentido, mi sugerencia es: intente añadir la línea echo $compName | od -c al script después de la sección "loop through the CSV".

En los comentarios, el tema ha resultado ser un inesperado \r carácter. Creo que la causa probable de esto es que el archivo CSV tiene CRLF (= \r\n ) (¿se creó en un sistema Windows quizás?), pero el read ser loc en el script está esperando sólo LF (= \n ).

0 votos

Lo siento, mi primera recompensa. No sabía que había un paso extra más allá de aceptar la respuesta. Ahora es todo tuyo :)

0voto

He completado el mismo con la siguiente cadena :

compName=${loc::9};

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X