LINUX.ORG.RU
решено ФорумAdmin

Как одной командой проверить наличие строки и если её нет - добавить

 , ,


0

1

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

ssh -t $uname@192.168.122.157 sudo cat /etc/sudoers

но я не этого хочу, хочу что-то вроде

ssh -t $uname@192.168.122.157 sudo grep "%uname ALL=(ALL:ALL) NOPASSWD: ALL" /etc/sudoers || sudo echo "%uname ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers

Смысл в том, чтоб в скрипте, одной командой (не хочу больше одного раза пароль вводить), сначала /etc/sudoers проверить на наличие строки и, если её там нет - добавить.

Часа четыре уже, если не больше, бьюсь над этой затеей. В интернете обыскался, но там всё как-то проще и не то, ну или искать не умею.



Последнее исправление: dhaenoor (всего исправлений: 1)

возьми ansible + templates и не мучай баш с сш.

PunkoIvan ★★★★
()

Зачем непременно проверить, а потом добавить, если можно просто добавить: echo '%uname ALL=(ALL:ALL) NOPASSWD: ALL' | ssh -t $uname@192.168.122.157 sudo tee /etc/sudoers.d/uname

Но лучше взять ansible.

dexpl ★★★★★
()
Ответ на: комментарий от aol

'blah || blah'

Это правильно в общем виде, но в частном, когда в результате надо получить входной и выходной файл один и тот же, то правильно просто написать редактирование этого файла. Ну например для данного случая:

sed -i -e '$a%uname ALL=(ALL:ALL) NOPASSWD: ALL' -e '/%uname ALL=(ALL:ALL) NOPASSWD: ALL/d' /etc/sudoers

vodz ★★★★★
()

За 4 часа можно было уже успеть в ансибл въехать и решить задачу на нем (чего тебе и желаю). По жизни это более полезные знания, чем непонятный говнокод на bash по ssh.

v9lij ★★★★★
()

Как по мне можно в одну строку, но без веосипедов - никак.

Потому, что - при изменениях в /etc/sudoers нужно:
а) использовать visudo т.к. данная утилита проверяет синтаксис файла, перед выходом или сохранением. Точно не скажу.
Утилита echo, sed, awk, nano - так не делает.
И изменения могут затормозить или поламать sudo в случае ошибок.
б) либо использовать Ansible (приоритетнее) в модуле lineinfile есть параметр validate
Который тоже может выполныть проверку с помощью visudo

i3wm
()
Ответ на: нужно:использовать visudo от DonkeyHot

если с кавычками удастся не накосячить.

Ну кавычки и для sed-овских аргументов понадобятся, так что косячить потренируется, никуда не денется. :) visudo скорее надо для блокировки от одновременного редактирования, а не проверки синтаксиса, ибо одно дело кода редактирует человек, другое дело, когда скрипт добавляет правильную строку. Иначе это будет похоже, а правильно ли вычислилось 2+2?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

Может такой вариант подойдет?:

sshpass -p ПарольРута ssh -o «ConnectTimeout=3» -o «UserKnownHostsFile=/dev/null» -o «StrictHostKeyChecking=no» root@192.168.122.157 «grep «%uname ALL=(ALL:ALL) NOPASSWD: ALL» /etc/sudoers || sudo echo «%uname ALL=(ALL:ALL) NOPASSWD: ALL» >> /etc/sudoers»

В этом примере ключи не нужны.

Bootmen ☆☆☆
()
Ответ на: комментарий от vodz

Шикарный способ, но есть "Но"

Сделал вот такой скрипт для проверки:

LRUSERNAME=uname
LRUSERPASS=uname
SEDADD="'\$a%${LRUSERNAME} ALL=(ALL:ALL) NOPASSWD: ALL'"
SEDDEL="'/%${LRUSERNAME} ALL=(ALL:ALL) NOPASSWD: ALL/d'"
echo "sed -i -e ${SEDADD} -e ${SEDDEL} /etc/sudoers"
ssh -t $LRUSERNAME@192.168.122.157 sudo bash -c "sed -i -e ${SEDADD} -e ${SEDDEL} /etc/sudoers"

Возвращает вот такую строку:

sed -i -e '$a%uname ALL=(ALL:ALL) NOPASSWD: ALL' -e '/%uname ALL=(ALL:ALL) NOPASSWD: ALL/d' /etc/sudoers

Всё соответствует вашему примеру, но, при выполнении этой команды через SSH, выдает вот такое сообщение:

Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

Т.е. строка команды формируется верно, но почему-то sed её не воспринимает. Если же я её, в том виде как echo выводит, запускаю в терминале - работает нормально.

Можете что-нибудь посоветовать?

dhaenoor
() автор топика
Ответ на: Шикарный способ, но есть "Но" от dhaenoor

Можете что-нибудь посоветовать?

Могу.

SEDADD="\"\\\$a%${LRUSERNAME} ALL=(ALL:ALL) NOPASSWD: ALL\""
SEDDEL="\"/%${LRUSERNAME} ALL=(ALL:ALL) NOPASSWD: ALL/d\""
ssh -t $LRUSERNAME@10.68.0.2 sed -i -e "${SEDADD}" -e "${SEDDEL}" /etc/sudoers

vodz ★★★★★
()
Ответ на: комментарий от v9lij

Вот и выросло поколение, которое чтобы изменить одну строку в файле один раз, будет разворачивать целый комбайн-монстр

anonymous
()
Ответ на: нужно:использовать visudo от DonkeyHot

Теоретически можно выполнять EDITOR="sed -i ..." visudo

Что-то руки опускаются. Если передавать без кавычек, то пробелы в строковых аргументах естественно всё портят, а если с кавычками, то получаем sed: неизвестная команда " Никак не придумаю способа. :(

vodz ★★★★★
()
Ответ на: комментарий от vodz

\x20 в качестве пробела ему кормить, sed тогда это разгребёт.

EDITOR, похоже, разбивается на куски по пробелам и сразу execve, без всякого шелла (по крайней мере visudo так делает).

LeninGad
()
Последнее исправление: LeninGad (всего исправлений: 1)
Ответ на: комментарий от LeninGad

\x20 в качестве пробела ему кормить, sed тогда это разгребёт

А блин, это то я пробовал, оказалось, что проблема не в этом, а в том, что без \ в начале строки \$ оно вообще кушает $ при таком вызове через EDITOR, а с \$ так и передается sed-у, то есть выбирает адрес \cregexpc и ругается на неоконченный формат адреса :(

vodz ★★★★★
()
Ответ на: комментарий от vodz

Никак не придумаю способа

самый простой и надёжный == «sed -f», но это неспортивно.

DonkeyHot ★★★★★
()
Ответ на: комментарий от legolegs

В свою очередь не понимаю, почему ты спрашиваешь об этом у меня.

dexpl ★★★★★
()

Раздули тему гуру. Афтору нужно:(не хочу больше одного раза пароль вводить) ВСего.

Я предложил лишь sshpass. И никаких visudo и развертывания Глобально ansible. :)

Bootmen ☆☆☆
()
Ответ на: комментарий от Bootmen

Афтору нужно:(не хочу больше одного раза пароль вводить) ВСего.

IP адрес намекает, что и серверов может быть много и на все надо добавить $user для работы с sudo без пароля. Сегодня ему надо одной командой sudoers поправить, завтра два других скрипта выполнить. Что вы все беситесь, когда люди рассказывают как заюзать удочку, показывая общее решение, а не получить рыбу до следующего вопроса? Боитесь, что у вас хлеб молодёжь отберет? :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

Что вы все беситесь, когда люди рассказывают ка

Ну Вы уж совсем. Афтор спрашивал конкретно. Когда начнет пищать: Как синхронизировать компы… Тут гуру и помогут.

Bootmen ☆☆☆
()
Ответ на: комментарий от vodz

$user для работы с sudo без пароля.

Причем мой пример ssh дан с опциями исключающими глюки в соединении. (для использования в скриптах)

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.