Как проверить, какой узел является основным в кластере БД HANA, работающем на 12 SLES?

Стандартного инструмента для этого не существует, нет. Эта задача довольно хорошо подходит для awk: читать строки одну за другой, сохранять первое поле и накапливать второе поле, и выводить результат, если первое поле изменилось. Основная (небольшая) трудность заключается в том, что результат также должен быть выведен при достижении последней строки.

awk -F, '
    1 {current = $1; sub(/^[^,]*,/,"")}
    current == previous {acc = acc " " $0; next}
    NR != 1 {print previous "," acc}
    1 {previous = current; acc = $0}
    END {if (NR) print previous "," acc}'
0
11.06.2019, 11:55
1 ответ

chgrp может работать как с числовыми GID, так и с символическими именами групп. Вы должны быть на 100% уверены, что совпадение вашего имени -и группы имен -абсолютно правильное. В зависимости от того, как вы решаете проблему, может также потребоваться убедиться, что числовые значения Linux находятся в диапазоне, полностью отделенном от числовых значений AD. Большинство администраторов AD делают это по очевидным причинам, но проверьте, чтобы убедиться. Затем вы можете использовать chgrpдля переназначения всех групповых владельцев, по одной группе за раз, со старых номеров GID Linux на новые номера GID AD. Но важно, чтобы между номерами GID Linux и номерами GID AD не было НУЛЕВОГО перекрытия.

Я бы предложил НЕ выполнять реальную работу в сценарии. Вместо этого напишите сценарий, который просто выводит (длинную )строку из chgrpкоманд. Таким образом, если ваш скрипт сломается, это ничего не повредит. Вы отлаживаете сценарий, а затем тщательно проверяете команды chgrp, которые он производит, и убеждаетесь, что они на 100 % верны. Исправьте все обнаруженные вами ошибки. Как только все будет выглядеть хорошо, направьте этот список chgrpв оболочку.

Как обычно в UNIX (или Linux ), есть несколько способов выполнить задачу. Вы можете перебирать каждую группу и выполнять один поиск в файловой иерархии для каждой группы. Это может быть нормально, если у вас мало групп или файлов в иерархии. Но это требует, чтобы старый и новый числовые GID НЕ перекрывались.

Более эффективным может быть поиск в иерархии только один раз и обработка всех файлов по одному за один проход. Это также имеет то преимущество, что не имеет значения, перекрываются ли ваши числа, если совпадение имен -и -правильно на 100%. Для этого начните с создания таблицы, которая сопоставляет старый числовой GID Linux со старым символическим именем Linux (, которое также является новым символическим именем AD ). Следующий,сделайте резервную копию вашего /etc/groupи отредактируйте его, чтобы удалить все имена групп Linux, которые вы собираетесь удалить.

Итак, теперь у вас есть файл, содержащий список сопоставлений GID -> имен, и набор файлов в вашей иерархии с числовым GID, но без определенного имени группы.

Следующее, что вам нужно сделать, это убедиться, что перечисление вашей группы AD работает от (до wbinfo, обычно ). Простой тест типа:

# wbinfo --group-info 'test AD group'
test AD group:x:1597:
# touch /tmp/foo
# chgrp 'test AD group' /tmp/foo
# ls -l /tmp/foo
-rw-r--r--  1 root  test AD group  0 Jun 13 11:06 /tmp/foo

должно быть достаточно. Там, где у меня есть 'test AD group', вы должны использовать имя группы AD, которое, как вы знаете, существует. Используйте кавычки, если имя группы содержит пробелы.

Следующая задача состоит в том, чтобы перебрать каждый файл в иерархии и использовать stat для нахождения его числового GID , который, конечно же, будет устаревшим GID Linux. Сопоставьте этот числовой GID с символическим именем группы (, которое является новым символическим именем AD ), и запишите команду chgrp, чтобы внести это изменение в этот файл. Обязательно заключайте имена групп в кавычки, поскольку группы AD часто содержат пробелы. Таким образом, не будет иметь значения, имеет ли ваша старая группа Linux foobarточно такой же GID, что и новая группа AD farkle, потому что ваш скрипт будет использовать старый GID, найдет старое имя foobarи выполнит chgrpкоманда для сброса группы по имени на foobar.

Вот совет о том, как создать сопоставление имен GID -и -. Он не полностью протестирован и не полностью оптимизирован. Он просто предназначен для того, чтобы вы подумали о том, как разбить проблему на более мелкие, более управляемые шаги. Обязательно сделайте полную резервную копию ваших данных, прежде чем запускать какие-либо тесты или окончательные сценарии.

Предположим, чтоcupscasnagiosи domain users— это группы, которые вы хотите перенести:

# getent group cups cas nagios "domain users" | awk -F: '{print $3 " " $1}'
193 cups
1001 cas
445 nagios
715 domain users

Сохраните это в файл, напримерnumeric-gid-map.txt

Теперь создайте функцию, которая принимает числовой GID и возвращает соответствующее имя из этого файла:

map_gid_to_name() {
  grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}

И еще одна очень простая функция, которая будет принимать имя группы и имя файла,и выведите команду chgrp:

do_chgrp() {
  printf 'chgrp "%s" "%s"\n' "$1" "$2"
}

Соедините все это вместе с помощью одной функции, которая может принимать одно имя файла, использовать statпоиск числового GID, найти соответствующее имя группы и записать команду chgrpв стандартный вывод:

do_one_file() {
  gid=$(stat -f%g "$1")
  gname="$(map_gid_to_name $gid)"
  do_chgrp "$gname" "$1"
}

Остался единственный шаг — перебрать вашу иерархию и передать файлы один за другим в вашу функцию.

chgrp _один _файл.sh:

#!/usr/bin/env bash

map_gid_to_name() {
  grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}

do_chgrp() {
  printf 'chgrp "%s" "%s"\n' "$1" "$2"
}

do_one_file() {
  gid=$(stat -f%g "$1")
  gname="$(map_gid_to_name $gid)"
  do_chgrp "$gname" "$1"
}

do_one_file "$1"

chmodчто 755, так что это исполняемый файл.

find /your/path -print0 | xargs -0 -n1 -Ixx./chgrp_one_file.sh "xx"

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

1
28.01.2020, 02:40

Теги

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