lofiadm:スクリプトでパスワードを入力してください

lofiadm:スクリプトでパスワードを入力してください

OmniOSを実行し、napp-itの上にZFSを管理するサーバーがあります。時にはZFSファイルシステムにデータを送信する必要があります。これを行うには、bashスクリプトとrsyncを使用します。

フォローするNapp-itのガイドライン、私はlofiadmを使用して複数の暗号化されたブロックデバイスを作成しました。ブロックデバイスを開くたびに、各デバイスにパスワードを2回入力する必要があります。少なくとも6つのブロックデバイスの場合、これは面倒な作業です。見ているlofiadm マニュアルパスワードをプレーンテキストで送信するオプションが見つかりません。

パスワードを手動で入力しないようにする方法はありますか?私のプライマリハードドライブは暗号化されているので、パスワードをプレーンテキストで保存しても大丈夫です。

ベストアンサー1

~によるとソースコードlofiadm使用pkcs11_get_pass以下からパスワードを入手してくださいlibcryptoutil.so

864 rv = C_OpenSession(cipher->slot, CKF_SERIAL_SESSION, NULL, NULL, &sess);
865 if (rv != CKR_OK)
866     goto cleanup;
867
868 /* get user passphrase with 8 byte minimum */
869 if (pkcs11_get_pass(NULL, &pass, &passlen, MIN_PASSLEN, B_TRUE) < 0) {
870     die(gettext("passphrases do not match\n"));
871 }
872
873 /*
874  * salt should not be NULL, or else pkcs11_PasswdToKey() will
875  * complain about CKR_MECHANISM_PARAM_INVALID; the following is
876  * to make up for not having a salt until a proper one is used
877  */
878 salt = pass;
879 saltlen = passlen;
880
881 klen = cipher->max_keysize;
882 rv = pkcs11_PasswdToKey(sess, pass, passlen, salt, saltlen, ktype,
883     cipher->max_keysize, &kvalue, &klen);

そしてpkcs11_get_pass使用getpassphrase():

72  if (token_name != NULL)
73      (void) snprintf(prompt, sizeof (prompt), DEFAULT_TOKEN_PROMPT,
74          token_name);
75  else
76      (void) snprintf(prompt, sizeof (prompt), DEFAULT_USER_PROMPT);
77
78  for (tries = MAX_PASS_TRIES; tries > 0; tries--) {
79      tmpbuf = getpassphrase(prompt);
80      if (tmpbuf == NULL)
81          return (-1);
82
83      if (strnlen(tmpbuf, min_psize) >= min_psize)
84          break;
85
86      if (token_name != NULL)
87          (void) printf(DEFAULT_TOKEN_MINSIZE, min_psize);
88      else
89          (void) printf(DEFAULT_USER_MINSIZE, min_psize);
90  }
91  if (tries == 0) {
92      (void) printf(gettext("Exceeded number of attempts.\n"));
93      return (-1);
94  }

これマニュアルページfor は、getpassphrase()端末にアクセスしないと動作しないことを意味します。

getpass() 関数はプロセスの制御端末を開き、デバイスに null 終了文字列プロンプトを書き込み、エコーを無効にし、次の改行文字または EOF まで文字列を読み取り、端末状態を復元し、端末を閉じます。

getpassphrase() 関数は、最大 257 文字の文字列を読み込んで返すことを除いて、 getpass() と同じです。

...

エンシー

プロセスに制御端末がありません。

したがって、パスワード入力をスクリプトで作成する簡単な方法はないようです。

おすすめ記事