Похоже, веб-сайт ожидает сертификат клиента, поэтому он может специально поддерживать режим PIV (Smart Card )только YubiKey, а не режим FIDO U2F.
Для этого необходимо установить пакеты ccid
и opensc
, а также пакет nss
для инструмента modutil
, а затем настроить браузер Chrome для использования /usr/lib/opensc-pkcs11.so
. Для этого сначала закройте все экземпляры браузера и используйте команду, подобную этой:
modutil -dbdir sql:$HOME/.pki/nssdb/ -add "Smart card/YubiKey PKCS#11" -libfile /usr/lib/opensc-pkcs11.so
По сути, режим YubiKey PIV эмулирует комбинацию считывателя смарт-карт, совместимого с CCID -, и смарт-карты, совместимой с PKCS #11.
(Источники:эта часть страницы ArchWiki YubiKey и инструкции по аутентификации смарт-карты CAC .)
CCID — это аппаратный стандарт для взаимодействия с вещами, похожими на -USB-устройства чтения смарт-карт, а PKCS #11 — программный стандарт для связи со смарт-картами PIV. Чтобы преодолеть разрыв между ними, драйвер ccid
для службы pcscd
предоставляет программный интерфейс ПК/SC для низкоуровневой связи -с любой смарт-картой -, подобной устройствам для любая цель,и opensc
предоставляет библиотеку, которая использует низкоуровневый -интерфейс PC/SC и предоставляет программный интерфейс более высокого -уровня, совместимый с PKCS #11, специально для целей PIV. (Да, это сложная, многослойная -система.)
Chrome, как и Chromium, использует общую базу данных NSS по адресу $HOME/.pki/nssdb
для управления сертификатами. Команда добавляет ссылку на библиотеку OpenSC PKCS #11, которая используется для доступа к совместимым считывателям смарт-карт и аналогичным устройствам :, по сути, сообщает любому устройству, использующему общую базу данных NSS (, включая Chrome )«вы можете использовать смарт-карту --как устройства в качестве потенциального источника клиентских -сертификатов для аутентификации, и вот как вы можете взаимодействовать с подсистемой чтения смарт-карт этого компьютера».
Эта команда не требует подключения YubiKey во время ее запуска, но важно, чтобы браузер Chrome не работал, когда вы запускаете команду :, если браузер запущен, он уже прочитает базу данных NSS и перезапишет ее старыми значениями при выходе, фактически отменив команду.
По какой-то причине Chrome не включает графический интерфейс для настройки этого параметра, поэтому для его настройки требуется инструмент modutil
из пакета nss
.
Если вам нужно устранить неполадки с этим набором -, сначала подключите YubiKey и используйте opensc-tool --list-readers
, чтобы убедиться, что уровень OpenSC видит YubiKey. Ответ должен быть похож на этот:
$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr. Card Features Name
0 Yes Yubico YubiKey OTP+FIDO+CCID 00 00
Если это не работает, убедитесь, что процесс-демон pcscd
запущен.
Затем используйте opensc-tool --reader N --name -v
, где N — «номер считывателя карт» YubiKey слева -самый крайний столбец вывода предыдущей команды (должен быть равен 0, если у вас нет другого считывателя смарт-карт -как устройства ), чтобы убедиться, что OpenSC распознает наличие PIV-контента на YubiKey.Ответ на последнюю команду должен включать эту строку:
Card name: Personal Identity Verification Card
Второй этап устранения неполадок заключается в запуске браузера Chrome и переходе в «Настройки» -> «Дополнительно» -> «Конфиденциальность и безопасность» -> «Управление сертификатами». На этом этапе система должна открыть окно с запросом PIN-кода YubiKey :. Это побочный эффект необходимости доступа к YubiKey для отображения информации о нем. Это подтверждает, что Chrome теперь может использовать библиотеку PKCS #11 для доступа к функциям YubiKey PIV через OpenSC.
После ввода PIN-кода на странице «Ваши сертификаты» экрана «Управление сертификатами» должно быть указано, что доступен как минимум один сертификат клиента с аппаратной -поддержкой. Вы можете выбрать просмотр сертификата на этом этапе :. Информация должна соответствовать тому, что должно быть на вашем YubiKey, то есть, если у вас есть вопросы о содержимом, вы должны обратиться к лицу или организации, выдавшей вам YubiKey.
Если сертификат, хранящийся в YubiKey, виден Chrome, теперь вы должны быть готовы получить доступ к аутентифицированному сайту YubiKey PIV -. Как только браузер запросит PIN-код YubiKey, он сможет получить доступ к YubiKey до тех пор, пока вы не выйдете из браузера или не отключите YubiKey, поэтому он не должен запрашивать PIN-код более одного раза за сеанс браузера.
Если у вас уже запущен браузер, когда вы подключаете YubiKey, может потребоваться несколько секунд, чтобы распознать, что YubiKey подключен. Поэтому после подключения ключа вам следует подождать несколько секунд, прежде чем переходить по ссылке. ведущий на аутентифицированный сайт.
украсить/сортировать/использовать/не украшать с помощью любой версии обязательных инструментов POSIX и любых символов в вашем вводе (, если ваш ввод на самом деле не является CSV с полями в кавычках, которые могут содержать запятые и/или символы новой строки, но тогда все остальные ответы также потерпит неудачу )и сохранит порядок строк ввода для вывода и откроет ввод только один раз, поэтому он будет работать, если ввод поступает из канала или файла и без сохранения всего ввода в памяти:
$ awk 'BEGIN{FS=OFS=","} NR>1{print ++cnt[$1], NR, $0}' file |
sort -nt, -k1,1r -k2,2 |
awk -F, '(!seen[$3]++) && ($1==1)' |
cut -d, -f3-
f,g,h
x,t,k
Это удаляет первую строку(col1,col2,col3
)и всегда выводит строки в том же порядке, что и ввод:
perl -nlE'/.*?,/;$.-1&&push@a,[$&,$_];$a{$&}++;say$$_[1] for grep$a{$$_[0]}<2&eof,@a' data
Здесь используются bash
и BSD sed
и может потребоваться настройка для систем, отличных от -Berkeley:
$ cat << EOF > input
col1,col2,col3
a,b,c
a,d,f
d,u,v
f,g,h
d,u,g
x,t,k
EOF
$ grep -f <(sed -Ee '1d;s/([^,]*),.*/^\1,/' < input | sort | uniq -u ) input
f,g,h
x,t,k
Это работает, сначала используя sed
для удаления строки 1 входного файла input
, а затем записывая первое поле с разделителями-запятыми -каждой строки, которому предшествует ^
, а затем следует ,
. Этот вывод sed
затем редактируется sort
и uniq
таким образом, что в выводе появляются только строки, не имеющие дубликатов. Вывод uniq
затем передается в grep
и используется как последовательность регулярных выражений для поиска во входном файле.
Это решение, скорее всего, не работает, если ваш входной файл содержит определенные метасимволы регулярного выражения -в первом столбце.
awk -F "," '
{
a[$1] = $1 in a ? "" : ($0 ORS)
}
END {
for (i in a) printf "%s", a[i]
}
' file
awk -F "," '
{
if ($1 in a) a[$1] = ORS
else a[b[++k]=$1] = $0 RS
}
END {
while(++i in b) print a[b[i]]
}
' ORS= file
sed -Ee ':b;$!{N;bb;}
/^(([^,]+,).*)\n\2[^\n]+/!{P;D;}
:a;s//\1/;ta;D
' file
Метод groupby в itertools используется для группировки по первому полю, а затем выбираются группы, содержащие один элемент.
python3 -c 'import sys, itertools as it
## anonymous function defined here
Gx = lambda fh,col: it.groupby(sorted(fh,key=col),col)
k1 = lambda x: x.split(",")[0]
fx = lambda t: "".join(t[1])
gx = lambda y: y.count("\n") == 1
with open(sys.argv[1]) as f:
print(*filter(gx,map(fx,Gx(f,k1))),sep="",end="")
' file
awk -F "," '
BEGIN { s[1] = ORS }
{
sep = s[$1 in a]
a[$1] = a[$1] sep sprintf("%dd",NR)
}
END {
for (var in a)
if (split(a[var],t,ORS) >= 2)
print a[var]
}
' < file | sed -f - file
Использование Raku (, ранее известного как Perl _6)
~$ raku -e ' \
my @csv_array = $*ARGFILES.lines.skip(1).map: *.split(","); \
my $col1 = @csv_array.map( *.[ 0,3...*]); \
my @col1_nodups = $col1.cache.Bag.grep( *.value == 1).map: *.keys; \
$_.join(",").put for @csv_array[ $col1.grep(/@col1_nodups/, :k)];' file
Пример ввода:
col1,col2,col3
a,b,c
a,d,f
d,u,v
f,g,h
d,u,g
x,t,k
Пример вывода:
f,g,h
x,t,k
Несмотря на то, что в заголовке этого вопроса появляется слово «uniq», ОП не запрашивает возврат всех строк на основе различных значений в столбце 1, а скорее удаляет все строки с повторяются значения в столбце 1.
Выше приведено решение, написанное на Raku, члене семейства языков программирования Perl.:
file
, заданной (, как показано выше ), для достижения желаемых результатов. return_singleton_rows_only.p6
. Измените первую строку $*ARGFILES
на "/path/to/csv_file.txt".IO
и удалите обратную косую черту в конце -из -строки (продолжения ). Затем сценарий может быть выполнен в командной строке bash с ~$ raku return_singleton_rows_only.p6
. $*ARGFILES
как -, вы можете сохранить четыре строки кода в скрипт, например return_singleton_rows_only.p6
(, удалив конец -из -продолжение строки с обратной косой чертой ), добавьте соответствующую строку #!
shebang вверху (, например #!/usr/bin/env raku
), и сделайте файл исполняемым. Затем запустите в командной строке ~$ return_singleton_rows_only.p6 file
. Вкратце, строка 1 считывает csv_file
в массив Raku с именем @csv_array
, разделяя на " ,
" (запятые )и пропуская строку заголовка. Строка 2 извлекает столбец 1 в скалярный список с именем $col1
. Строка 3 удаляет любое значение, присутствующее в $col1
, с помощьюBag
-ging и сохраняет только *.keys
, которые имеют *.value == 1
. Наконец, строка 4 подмножает исходный @csv_array
с помощью индекса, созданного с помощью grep
-, пингующего номер строки нужных строк.
[Я уверен, что есть более эффективные подходы, но этот код имеет преимущество 1 ). чтение lines
лениво, а 2 ). имеющие одноэлементные значения, доступные как отдельный объект массива @col1_nodups
, если они потребуются для дальнейшей обработки данных].