lofiadm: 스크립트를 통해 비밀번호를 입력하세요

lofiadm: 스크립트를 통해 비밀번호를 입력하세요

OmniOS를 실행하고 napp-it 위에 ZFS를 관리하는 서버가 있습니다. 때때로 ZFS 파일 시스템으로 데이터를 보내야 합니다. 이를 수행하기 위해 bash 스크립트와 rsync를 사용합니다.

따르다Napp-it에 대한 지침, 나는 lofiadm을 사용하여 암호화된 블록 장치를 여러 개 만들었습니다. 블록 장치를 열 때마다 각 장치에 비밀번호를 두 번 입력해야 합니다. 최소 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()와 동일합니다.

...

엔시

프로세스에 제어 터미널이 없습니다.

따라서 비밀번호 입력을 스크립트로 작성하는 쉬운 방법은 없는 것 같습니다.

관련 정보