25

Unix ライクなシステム (可能であれば) から、アプリケーションが同じマシンで実行されるたびに永続化される一意の ID を取得したいと考えています。可能であれば、Linux、FreeBSD、Solaris などから同じ ID を取得したいのですが、マシンごとに新しい ID を生成するのではなく、既存の ID を取得したいと考えています。オペレーティング システムに由来するものであり、MAC アドレスのようなものは使用したくありません。

他に利用可能なオプションがない場合は、MAC を他のものと組み合わせて使用​​できます。たとえば、id は、MAC アドレスと他のものを組み合わせた md5 ハッシュにすることができます。

あなたの提案を聞きたいです。

役に立つ場合、私のアプリケーションは C/C++ で書かれています。

これらすべての目的は、ユーザーがアプリケーションを 2 回以上実行するのを防ぐことです。一度だけ走りたい。

4

15 に答える 15

30

ルートファイルシステムの UUID はどうですか? /etc/fstabファイルを手動で解析するか、 または を使用して、getfsent (3)からルート ファイルシステム デバイスを取得できますgetfsfile (3)。デバイスを取得したら、リンクをチェックインするか/dev/disk/by-uuidblkidコマンドから UUID を取得できます。

于 2008-12-05T17:55:13.857 に答える
9

いつものように、他の人が同じ問題をどのように解決したかを確認するのが最善の方法です。

FLEXlmは、ノードロックライセンスにもホスト識別子を使用します。使用する最も一般的なホスト識別子は、ネットワークインターフェイスの1つのイーサネットMACアドレスであり、セパレータなしでまとめられています。

また、(Windowsでは)C:ドライブのボリュームシリアル番号(これもセパレータなしでまとめられます)を使用でき、Solarisではhostidコマンドの出力(IIRC、Sunコンピュータでは、この番号は実際には一意であり、システム基板上の小さな取り外し可能なEEPROM)。

MACアドレスは非常に簡単に偽造できますが、最近ではほぼ普遍的なIDであり(ほとんどすべての新しいコンピューターには少なくとも1つのイーサネットポートがあり、オンボードであることが非常に一般的です)、実際にはグローバルに一意であることが意図されています(実際、イーサネットプロトコルはこの一意性に依存しています)。このアプローチで発生する主な問題:

  • 一部のコンピューターには複数のイーサネットアドレスがあります。それらのいくつかはメインボード上にあり、いくつかは別々のリムーバブルカード上にあります。
  • それらは非常に簡単に偽造できます(一部のプロトコルはそれらを変更できることに依存しています)。
  • 一部の仮想化環境では、起動ごとにランダムなイーサネットアドレスが生成されます(ただし、通常、固定値を強制する方法があります)。
于 2008-11-30T16:20:31.773 に答える
9

SolarisとLinuxの両方がhostid(1)ユーティリティを提供します

于 2008-11-30T15:50:01.617 に答える
6

もう 1 つのオプションは、Linux に存在するコマンドであるdmidecodeから派生した情報を使用することです。この情報は /dev/mem からデコードされるため、root アクセスが必要です。

dmidecode が読み取る情報には欠陥があることがわかっており、一部のマザーボード メーカーは一部のフィールドについて嘘をついたり偽造したりしています。

于 2008-12-03T18:10:22.487 に答える
5

必要なものを取得するための一般的で信頼できる方法はありません。

于 2008-11-30T21:31:24.953 に答える
2

多くのセットアップでは、個別にセットアップするのではなく、ファイルシステムイメージが作成され、多くのマシンに複製されている可能性があることを考慮する必要があります。その他の場合、マシンは何度も再セットアップされる可能性があります。つまり、提供されたOSは信頼できません。

ただし、CPUは一意のシリアル番号を保持しますが、CPUへのアクセスはシステムによって異なる必要があります。

于 2008-11-30T15:52:11.317 に答える
2

ありえないと思います。最も近い方法は、非常に長いランダムな文字列 (MS が GUID で行うように) を作成し、システムのどこかに保存することです。

于 2008-11-30T15:18:37.343 に答える
2

ルート ファイルシステムの UUID を取得できますが/、これはかなり信頼できますが、同じディスク上で実行されている chroot とおそらく vms を区別しません。

特定の OS の実行専用の内部または静的 HDD を主に扱っている場合は、ルート ファイルシステムの UUID を使用してシステムを検出できるはずです。

次のような方法でルート fs の UUID を取得できます。 alias sys_guid='sudo /sbin/blkid | grep "$(df -h / | sed -n 2p | cut -d" " -f1):" | grep -o "UUID=\"[^\"]*\" " | sed "s/UUID=\"//;s/\"//"'

同じ OS のカーネル バージョン、または同じディスク上で実行されている異なる OS をさらに区別する必要がある場合はuname、root fs UUID からのデータを使用したり、それらを組み合わせたりすることができます。

于 2015-04-02T15:16:28.113 に答える
1

一意の識別子がどれほど安定している必要があるかについては言及していません-コードが実行されるたびに、同じホストが同じIDを生成することを常に望んでいますか?

いいえの場合は、ファジーモンクの uuidgen の提案が必要です。

はいの場合、ホストに関する限り「同じ」とは何かを判断する必要があります。1つの方法は、最初のイーサネットインターフェースのMACと「何か」のMD5合計です。その場合の「何か」については、「同じホスト」の概念に FQDN の変更が含まれていない限り、FQDN を検討します...

于 2008-11-30T15:56:56.300 に答える
0

UUIDを探しているようですね。これは一般的なユニバーサル一意IDです(実際には、GUIDと同じものです)

さまざまなライブラリにこれの多くのC++実装があります。または、uuidgenコマンドを使用して出力をキャプチャすることもできます。

于 2008-11-30T15:54:13.200 に答える
0

Jason Day と A.Danischewski からの回答は正しい方向に進んでいるように見えますが、OSX には存在しないため/sbin/blkid、 「Unix のようなシステム」の基準を満たしていません。/etc/fstab

100% 移植可能な唯一の方法は、独自のアプリケーションが作成するファイルの標準的な場所を選択することです。たとえば/etc/YOURAPP.cfg、UUID が存在しない場合はそこに保存します。

別の人やアプリケーションがファイルを削除または変更したり、ユーザーがルート ファイル システムを変更した場合に、現在のマシンから ID を失ったり、別のマシンで ID が作成されたりする可能性があるため、理想とはほど遠いものです。読み取りおよび書き込み権限などの問題は言うまでもありません。

でも結局「同じ機械」なんてない。どのコンピュータも、そのコンポーネント + 現在の構成以上でも以下でもありません。移植性に関しては、これ以上のことはできないと思います。

于 2016-03-22T22:41:26.140 に答える
0

ほとんどの UNIX ライクなマシンには、/dev/randomからアクセスできる乱数ジェネレーターがあります。MAC アドレスのようなものと、GUID ジェネレーターに真の一意性を与えるための時間が必要になります (これは、Windows の GUID ジェネレーターが行うことです)。これに加えて、/dev/random から何かを取得すると、かなり適切な GUID タイプの構成が得られます。実際には、UUID ライブラリはこの種のことを舞台裏で行います。

マシンごとに 1 つの番号だけが必要な場合は、MAC アドレスで十分でしょう。これらは中央機関によって管理されており、2 つの MAC アドレスが同じになることはないと合理的に推測できます。ただし、これを使用してソフトウェアのインストールを MAC アドレスに結び付けようとしている場合は、一部のコンポーネントにはプログラム可能な MAC アドレスまたは MAC アドレスのプログラム可能なコンポーネントがあることに注意してください。Unix ライクなオペレーティング システム、特にオープン ソースのオペレーティング システムには、シリアル番号が組み込まれていない傾向があります。このアプローチは、VM でソフトウェアの複数のインスタンスを実行する際にも問題を引き起こす可能性があります。

1 つの選択肢として、複数のメーカーから入手できるUSBドングルがあります。もう 1 つのオプションは、一意のコードがサーバーに提供されるライセンス サーバーです。繰り返しますが、これに対する定型ソリューションがさまざまなソースから入手できます。

于 2008-11-30T16:05:34.393 に答える
0

WindowsではいくつかのGUIDを使用するとおっしゃいました...それがどのように作成されるかについての詳細はありますか?

それとは別に、CPU ID やハードディスク ID などを試すこともできます...それらは変更できないと思います (ただし、故障したハードディスクを交換すると問題が発生します)。

于 2008-12-04T14:56:37.370 に答える
-2

次のような場所でロックファイルを使用できます。

  • /var/run/yourapp.pid (プログラムがルートによって実行されている場合)
  • $HOME/.yourapp.pid (ユーザーおよびローカル ファイルシステムによって実行される場合)
  • $HOME/.yourapp.$(hostname -f).pid (nfs 上のホーム)

プログラムが実行されると、次のようなことが行われます。

lock = open(filename, O_CREAT | O_EXCL);
dprintf(lock, "%u", getpid());

開くことができない場合は、プロセスがまだ実行されているかどうかを確認し、そうでない場合は、ファイルを削除して再試行してください。

于 2008-12-05T17:18:10.377 に答える