Исправление полей в неправильно сгенерированном файле

auth [success=done default=ignore] pam_access.so accessfile=/etc/security/access-local.conf

Кажется, это ответ. Редактирую это, когда узнаю больше.

Изhttp://linux-pam.org/Linux-PAM-html/sag-configuration-file.html

успех=готово

done equivalent to ok with the side effect of terminating the module stack and PAM immediately returning to the application.

по умолчанию=игнорировать

ignore when used with a stack of modules, the module's return status will not contribute to the return code the application obtains.

из-https://serverfault.com/questions/134471/success-n-control-syntax-in-pam-conf-pam-d-files#134488

success=1 пропускает строку.

Если кто-то еще захочет написать лучший ответ, объясняющий, что происходит -, я с радостью соглашусь.

Спасибо Hostfission за указание на нужную часть.

5
04.12.2019, 00:26
5 ответов

Вы действительно ищете 2-е и 3-е поле, поэтому, если в файле есть одна строка:

IFS='|' read _ f1 f2 _ < file
field="$f1 $f2"
0
27.01.2020, 20:31

С GNU sedвы можете использовать:

sed ':1;s/|/|/9;T;s/|//2;t1'

, который объединяет второе с третьим полем, (удаляет второе вхождение|)столько раз, сколько необходимо, пока в выводе не будет больше 9 полей.

На входе типа:

1|a|3|4|5|6|7|8|9
1|a|b|3|4|5|6|7|8|9
1|a|b|c|3|4|5|6|7|8|9

Дает:

1|a|3|4|5|6|7|8|9
1|ab|3|4|5|6|7|8|9
1|abc|3|4|5|6|7|8|9

В системах, отличных от -GNU, вы можете использовать @RakeshSharma's POSIX sedвариант или perlвместо:

perl -F'[|]' -lae 'BEGIN {$" = ""; $, = "|"}
                   print $F[0], "@F[1..$#F-7]", @F[-7..-1]'
14
27.01.2020, 20:31

Создать массив, проанализировав файл с разделителями:

IFS='|' read -r -a fields thefile

Условия соединения с #2 по #8-е до конца:

field=${fields[1]} ;  
i=2 ; 
max=$((${#fields[*]}-8));  
while [[ $i -le $max ]] ; 
do 
    field="$field ${fields[$i]}" ; 
    (( ++i )) ; 
done  ; 
echo $field
3
27.01.2020, 20:31

Использование GNU awk

awk '{ 
   while ( gsub(/\|/, "|") > 8 )
      $0 = gensub(/\|/, "", 2)
}1' file 

Использование Posix sed:

sed -e '
    :a
    s/|/&/9;tb
    b
    :b
    s///2;ta
' file 
4
27.01.2020, 20:31

Другой способ сделать это с помощьюpython

<file python3 -c '
import sys
for line in sys.stdin:
    first, _, rest = line.strip().partition("|")
    rest_fields = rest.rsplit("|", 8)
    print(first, rest_fields[0].replace("|", ""), *rest_fields[1:], sep="|")
'
0
27.01.2020, 20:31

Теги

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