The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"Удалить и вставить часть строки до слова"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Системное и пользовательское ПО / Linux)
Изначальное сообщение [ Отслеживать ]

"Удалить и вставить часть строки до слова"  +/
Сообщение от alex_nolinux (ok) on 21-Авг-17, 17:14 
Привет всем.
Помогите справиться с задачкой.
Хочу ходить по файлам authorized_keys пользователей и проверять наличие нужных мне аргументов (хочу чтоб по ключам только с локалки авторизовались).
Формат файла следующий:
ОПЦИИ sha-rsa КЛЮЧ
реально так выглядит
from="192.168.0.0/24" sha-rsa aAhjLknLKAsjdjalsdqwqolPO

ключей может быть несколько и каждый начинается с новой строки.
Я хочу идти по файлу и сверять ОПЦИИ со своим шаблоном (template) и если они не совпадают, то менять на тот, который есть в шаблоне. И вот затык у меня выходит с sed -
никак не могу победить его и заставить получить часть строки до sha-rsa для сравнения и замены. Подскажите, люди добрые, как можно это сделать?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Удалить и вставить часть строки до слова"  +/
Сообщение от ALex_hha (ok) on 21-Авг-17, 17:59 
Как вариант bash/sed. На python/ruby/perl можно конечно и элегантнее решить


#!/bin/bash

STRICT_PATTERN='from="192.168.0.0/24"'

cat ~/.ssh/authorized_keys | while read curr_line
do
    curr_options=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\1|')
    curr_key=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\2|')

    if [[ ${curr_options} != "${STRICT_PATTERN}" ]]; then
        sed -i -r "s|${curr_line}|${STRICT_PATTERN}${curr_key}|" ~/.ssh/authorized_keys
    fi
done


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Удалить и вставить часть строки до слова"  +/
Сообщение от alex_nolinux (ok) on 23-Авг-17, 08:32 
>[оверквотинг удален]
> cat ~/.ssh/authorized_keys | while read curr_line
> do
>     curr_options=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\1|')
>     curr_key=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\2|')
>     if [[ ${curr_options} != "${STRICT_PATTERN}" ]]; then
>         sed -i -r "s|${curr_line}|${STRICT_PATTERN}${curr_key}|"
> ~/.ssh/authorized_keys
>     fi
> done
>

Спасибо, Alex_hha
В части касающейся sed все работает прекрасно. Однако в части касающейся цикла while read - не отрабатывает последнюю строку, если нет после неё символа новой строки. Есть идею как побороть эту проблему? или надо также идти сначала проверкой по файлам с поиском символа перевода новой строки в конце файла и если его нет, то добавлять.

На Perl я темнота вообще(.

И собственно скрипт как он у меня


#!/bin/bash
#string="\"from=192.168.110.0/24\""
STRICT_PATTERN='from="192.168.110.0/24"'
users=`ls /home/`
echo $STRICT_PATTERN

for i in $users
do
# Проверяем существование файла ключей
echo "Работаем с пользователем $i"
[ -f "/home/$i/.ssh/authorized_keys" ]&&m="1"||m="0"
    if [ $m -eq "1" ]
    then
echo "Файл ключей существует у ###$i###"
        # Проверяем в файле наличие нешего STRICT_PATTERN перед каждым ключом
        while read curr_line
        do
echo "Берем строку -- $curr_line --- и работаем с ней"
            curr_options=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\1|')
echo "Выделяем опцию curr_options -- $curr_options ---"
            curr_key=$(echo ${curr_line} | sed -r 's|(.*)( sha-rsa.*)|\2|')
echo "Выделяем сам ключ --$curr_key ---"
            if [[ "${curr_options}" != "${STRICT_PATTERN}" ]]
            then
                echo "!!!Есть различия шаблоне!!!"
                sed -i -r "s|${curr_line}|${STRICT_PATTERN} ${curr_key}|" /home/$i/.ssh/authorized_keys
                echo "!!!Уже различий нет!!!"
            else
echo "В результате сравнения с шаблоном не выявлено различий"
            fi
        done < /home/$i/.ssh/authorized_keys
        echo "Закончили работу с файлом ключей пользователя $i"
    else
        echo "У этого вообще нет файла-ключей"
    fi
done


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "Удалить и вставить часть строки до слова"  +/
Сообщение от михалыч (ok) on 22-Авг-17, 19:22 
на perl
perl -pe 's|^.*(\ssha.*$)|from="192.168.0.0/24"$1|g'

да и на sed так же
sed -r 's|^.*( sha.*$)|from="192.168.0.0/24"\1|g'

хмм.. а зачем сверять? "левых" не должно быть?
тогда тупо меняем ВСЁ и ВСЯ, и свои и чужие ))

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Удалить и вставить часть строки до слова"  +/
Сообщение от shadow_alone (ok) on 23-Авг-17, 00:03 
А зачем так изващаться вручную, в век когда "космические корабли ....."

Есть же Ansible, он с этим справиться на раз-два.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Удалить и вставить часть строки до слова"  +1 +/
Сообщение от Pahanivo (ok) on 23-Авг-17, 00:30 
> А зачем так изващаться вручную, в век когда "космические корабли ....."

когда это примитивное скриптописание стало извращением? ))


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Удалить и вставить часть строки до слова"  –1 +/
Сообщение от shadow_alone (ok) on 23-Авг-17, 00:35 
>> А зачем так изващаться вручную, в век когда "космические корабли ....."
> когда это примитивное скриптописание стало извращением? ))

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

8. "Удалить и вставить часть строки до слова"  +/
Сообщение от ALex_hha (ok) on 23-Авг-17, 19:25 
> А зачем так изващаться вручную, в век когда "космические корабли ....."
> Есть же Ansible, он с этим справиться на раз-два.

да? Т.е. ansible сам сможет все поменять? playbook в студию

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Удалить и вставить часть строки до слова"  +/
Сообщение от pavlinux (ok) on 23-Авг-17, 18:28 
> (хочу чтоб по ключам только с локалки авторизовались).
> Подскажите, люди добрые, как можно это сделать?

Через xinetd пускай, с разными конфигами и портами. Редирект из подсети через iptables.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9. "Удалить и вставить часть строки до слова"  +/
Сообщение от ALex_hha (ok) on 23-Авг-17, 19:26 
> users=`ls /home/`

а вы уверены, что у пользователя хомяк всегда будет там?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Удалить и вставить часть строки до слова"  +/
Сообщение от alex_nolinux (ok) on 24-Авг-17, 08:11 
>> users=`ls /home/`
> а вы уверены, что у пользователя хомяк всегда будет там?

В целом, да уверен. Но возможны варианты. А какая альтернатива?

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Удалить и вставить часть строки до слова"  +/
Сообщение от alex_nolinux (ok) on 24-Авг-17, 08:13 
> cat ~/.ssh/authorized_keys | while read curr_line
> do

Ещё вопрос по циклу while read - он читается пока есть следующая строка. Пока все ок, в каждом файле есть последняя пустая строка, НО если пользователь удалит её, то последняя строка не читается, соответственно не приводится к шаблону. Что тут можете посоветовать?

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "Удалить и вставить часть строки до слова"  +/
Сообщение от Andrey Mitrofanov on 24-Авг-17, 09:03 
>в каждом файле есть последняя пустая строка,

Ты всё перепутал, маладой падаван!

Во-первых, не в каждом, ты сам обэтом написал и даже не заметил:

> НО если пользователь удалит её, то

А во-вторых, это не пустая строка, а передод строки от предыдущей, _настоящей_ последней строки.

>последняя строка не читается, соответственно
> не приводится к шаблону. Что тут можете посоветовать?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Удалить и вставить часть строки до слова"  +/
Сообщение от Andrey Mitrofanov on 24-Авг-17, 09:19 
> НО если пользователь удалит её, то последняя строка не читается, соответственно
> не приводится к шаблону. Что тут можете посоветовать?

Она читается, просто `while read` не передаёт её в тело цикла.
  https://www.opennet.ru/openforum/vsluhforumID9/10168.html#1

$ seq 101 103 |od -t x1a0000000  31  30  31  0a  31  30  32  0a  31  30  33  0a
          1   0   1  nl   1   0   2  nl   1   0   3  nl
0000014
$ seq 101 103 |head -c 11|od -t x1a
0000000  31  30  31  0a  31  30  32  0a  31  30  33
          1   0   1  nl   1   0   2  nl   1   0   3
0000013
$ seq 101 103 |head -c 11 |while read L; do echo $L; done
101
102
$ seq 101 103 |head -c 11 |( while read L; do echo $L; done; echo ">>>$L" )
101
102
>>>103

$ seq 101 103 |head -c 11 |( E=1; while read L || E=; do echo $L; [ "$E" ] || break; done )
101
102
103
$ _

Ну, чтоб не добавляло последний перевод строки -- сам.
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

14. "Удалить и вставить часть строки до слова"  +/
Сообщение от ALex_hha (ok) on 24-Авг-17, 15:40 
> Ещё вопрос по циклу while read - он читается пока есть следующая
> строка. Пока все ок, в каждом файле есть последняя пустая строка,
> НО если пользователь удалит её, то последняя строка не читается, соответственно
> не приводится к шаблону. Что тут можете посоветовать?

ну как вариант

заменить cat | while на echo "$(cat file.txt)" | while read line

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру