コンピュータ名/ホスト名を変更して、奇妙なターミナル動作を引き起こすスクリプト


4

scutilCSVファイルの値に基づいてコンピューターの名前を変更するために使用するスクリプト(ほとんどが借用)があります。これは、コンピュータ名にシリアル番号と一致する変数を設定し、名前の変更ComputerNameHostNameおよびLocalHostName変数で。参考のために、名前はSFO-C2900-MBP

スクリプトは次のとおりです。

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

これから次の2つのことが起こります。

1)スクリプトが次の名前を変更しようとすると、エラーがスローされますLocalHostNameSCPreferencesSetLocalHostName() failed: Invalid argument

:2)端子は、後に終了/再起動時に/ etc、次の操作を行います フォルダーに疑問符が表示されているターミナル、ホスト名もありません ターミナルでも、ホスト名が欠落して、フォルダの上に疑問符を示すが

scutil --set {def}正常に動作するターミナルを使用してこれらの値を手動で設定し、ターミナルを通常の動作に戻します。

私は次を試しました:

  • LocalHostName行をスクリプトから削除する
  • LocalHostName値を、CSVファイルではなく、スクリプト内で設定された変数に設定する

ほとんどの場合、スクリプトの問題は何よりもターミナルに対して行うことです-LocalHostNameの問題を回避できます。奇妙なことに、scutil --get {def}それらで実行すると、ターミナルは正しい値を出力します。


$compName変数がオプションとして解釈される可能性のない変数を引用することを検討しましたか?試してください:scutil --set LocalHostName "$compName"
イアンC.

@IanC。いや、scutil --set LocalHostName回線上の同じ問題。ターミナルでの名前の消失scutil --set HostNameは、スクリプトではなくターミナルを介して手動で実行することで修正されることも付け加えておきます。
smoooosher

そして、あなたはあなたのスクリプトをsudo <name of the script>正しく呼び出していますか?
イアンC.

@IanC。
うん

1
@smoooosher @MorganR変な文字が変数値に埋め込まれているかどうかを確認する1つのアイデア:echo $compName | od -c「CSVをループする」セクションの後にスクリプトに行を追加してみてください。(何odを試すか、例えばecho foo | od -cターミナルで試してみてください...)
アシュリー

回答:


4

コメントでは、@ MorganRはCSVファイルから読み取るコードに内に奇妙な文字が含まれているのではないかと考えました$compName

奇妙な、おそらく印刷できない文字をテストする1つの方法は、を使用することodです。あいまいな名前(「8進ダンプ」の略)がありますが、便利です。入力ストリームの各文字の詳細が表示されます。

通常-c、引数を使用して開始します。これによりod、各文字の詳細が「Cスタイルのエスケープ文字」として出力されます。16進数、8進数(場合によっては便利です!)などとして出力する他の引数があります。

例(通常\nは非表示になっていることに注意してください):

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

したがって、それが理にかなっている場合はecho $compName | od -c、「CSVをループする」セクションの後にスクリプトに行を追加してみてください。

コメントでは、問題は予想外の\r性格であることが判明しました。この原因として考えられるのは、CSVファイルにCRLF(= \r\n)行末がある(おそらくWindowsシステムで作成されたのでしょうか?)がread ser loc、スクリプト内のコマンドはLF(= \n)だけを期待しているためだと思います。


申し訳ありませんが、私の最初の賞金。答えを受け入れる以上の追加のステップがあったことを知りませんでした。それは今あなたのすべてです:)
smoooosher

0

私は以下の文字列で同じことを完了しました:

compName=${loc::9};

格納された変数の9番目の文字を実際に削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.