Я хочу заменить часть ^ m \ n частью пространством в файле CSV, используя SED-команду в Linux

Согласно исходному коду , lofiadm использует pkcs11_get_pass из libcryptoutil. поэтому для получения пароля:

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  }

Справочную страницу для getpassphrase () говорит, что он не будет работать без доступа к терминалу:

Функция getpass () открывает управляющий терминал процесса, записывает на это устройство строковое приглашение с завершающим нулем, отключает {{1} } эхо, считывает строку символов до следующего символа новой строки или EOF, восстанавливает состояние терминала и закрывает терминал.

Функция getpassphrase () идентична функции getpass (), за исключением того, что она считывает и возвращает строку длиной до 257 символов.

...

ENXIO

У процесса нет управляющего терминала.

Похоже, что нет простого способа создать скрипт для ввода пароля.

-1
09.03.2019, 00:00
2 ответа

Я столкнулся с этой проблемой даже после выполнения dos2unix. Я смог решить это с помощью приведенного ниже кода.

sed -i  "s/\r/ /g" <fileName>
  • ^Mэто ctrl+r, поэтому замените \rпробелом в файле
0
28.01.2020, 05:12

Заменить окончания строки -DOS пробелами в файлеfile:

dos2unix file
tr '\n' ' ' file >newfile

Это сначала преобразует файл в текстовый файл Unix, а затем заменяет каждую новую строку пробелом. Результат записывается в новый файл newfile.

За один шаг (без измененияfile):

dos2unix <file | tr '\n' ' ' >newfile

Немного небезопасно (, так как удаляет все возвраты каретки в файле, даже если они не являются частью строки DOS, заканчивающейся (не изменяет file, хотя)):

tr -d '\r' <file | tr '\n' ' ' >newfile
0
28.01.2020, 05:12

Теги

Похожие вопросы