Какие-либо проблемы с использованием высоких чисел UID (3000 +) на RHEL5 +?

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

find . -perm -o=rwx -printf "%m %p_\0" 2>/dev/null | 
  while read -r -d '' perms path; do
    path="${path%_}"
    echo "${perms} '${path}'" >&2
    printf "%s\0" "$path"
  done | xargs -0 chmod o=rx
4
22.03.2015, 05:52
2 ответа

Простой подход - это список файлов и Игнорируйте те, которые находятся в файле списка. Обратите внимание, что я организующуюся для переменной IGNORE_LIST , чтобы начать и заканчиваться новой строкой, чтобы я мог проверить, включен $ x простым способом (просто проверяя, что IGNORE_LIST содержит $ x не работает, поскольку он также будет соответствовать файлам, имя которых представляет собой подстроку элемента списка игнорирования).

newline='
'
ignore_list="$newline$(cat list.txt)$newline"
cd target_folder
for x in * .[!.]* ..?*; do
  case "$x" in *"$newline"*) continue;; esac   # sanity check: if the file name contains a newline, leave it alone
  case "$ignore_list" in
    *"$newline$x$newline"*) echo "Skipping $x";;
    *) rm -rf -- "$x";
  esac
done
-121--59324-

Ядро 2,6 Linux 2.6 и выше поддерживает 32-битные целые числа unsigned, в качестве UID и GID. Это означает, что максимальный UID должен быть 4294967294 (4294967295 зарезервирован) для RHEL4 +, но он может зависеть от установленных системных настроек и установленных утилит, специально Shadow-Utils. Вы можете проверить его, попробовав большую UID, единственное, что произойдет, это откажется от него (попробуйте что-нибудь между 65536 и 4294967294 на RHEL5). На RHEL6 что-то выше 4294967294 будет просто отклонено:

# useradd -u 4294967295 test
useradd: invalid user ID '4294967295'

RHEL6 и RHEL7 определенно поддерживают 32-битные с их утилитами. Я не могу говорить за RHEL5, потому что у меня нет коробок, которые все еще находятся на RHEL5.

Итак, если ваша цель - избежать любых возможных конфликтов, вы можете начать с чего-то вроде 100000.

Просто дополнительная информация: С самыми последними релизами ядра, используя 4 миллиарда UID, разве это не выходит из-за пространств имен пользователей и бездействующих контейнеров (справочник Docker, OpenVZ и LXC). Насколько я знаю, RHEL еще не поддерживает пространства имен пользователей, но они объявили, что они планируют с RHEL7, поэтому я представляю, что он будет в ближайшее время в ближайшее время.

2
27.01.2020, 20:52

При наличии htop можно нажать Shift + k для переключения дисплея потоков ядра. При нажатии F5 в режиме дерева все они должны отображаться как нижестоящие элементы kthreadd .

Существуют некоторые видимые различия между потоком ядра и user-space thread:

  • /proc/$ pid/cmdline пуст для потоков ядра - это метод используется ps и top для различения потоков ядра.

  • Символьная ссылка /proc/$ pid/exe не имеет цели для потоков ядра - что имеет смысл, поскольку у них нет соответствующего исполняемого файла на файловой системы.

Более конкретно, системный вызов readlink () возвращает ENOENT ("Нет файл или каталог "), несмотря на то, что сама ссылка существует, указывают на то, что исполняемый файл для этого процесса не существует (и никогда не делал).

Поэтому надежным способом проверки потоков ядра должно быть вызовите readlink () на /proc/$ pid/exe и проверьте его код возврата. Если успешно, то $ pid является пользовательским процессом. При сбое ENOENT extra stat () на /proc/$ pid/exe должен отличать случай ядра поток от только что завершившегося процесса. В

  • /proc/$ pid/status отсутствуют несколько полей для большинства потоков ядра - более конкретно, несколько полей, относящихся к виртуальной памяти.

Приведенный выше ответ от Идентификация потоков ядра

Другой способ отличить потоки ядра от другого процесса - запустить top -c . В руководстве вверху:

3. COMMAND -- Имя команды или Командная строка
Дисплей командной строки, используемой для запуска задачи или имени связанная программа. Переключение между командной строкой и именем с помощью 'c', который является как параметром командной строки, так и интерактивным com ‐ Мэнд.

Если выбрано отображение командных строк, процессы без команды строка (как и потоки ядра) будет отображаться только с именем программы в скобки, как в этом примере:
[mdrecoveryd]

Запуск ps aux также дисплеи процессы, запущенные без команды в квадратных скобках (и имеющие пустой файл /proc/[ pid ]/cmdline ).

Пример:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 

См. пакет procps-3.2.8 file /proc/readproc.h .

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h
-121--105357-

Для tcp просто проверьте $? . В случае сбоя соединения $? не будет 0 :

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

Потребуется время, чтобы bash понял, что соединение не удалось. Тайм-аут можно использовать для запуска bash :

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

Тестирование порта udp является более сложным.

Строго говоря, нет открытого состояния (конечно, udp - протокол без гражданства ) с udp.Существует только два состояния с udp, прослушивание или не . Если состояние не , вы получите ICMP Destination Unreachable .

К сожалению, брандмауэр или маршрутизатор часто отбрасывают эти пакеты ICMP, поэтому вы не будете уверены, в каком состоянии находится порт udp.

-121--30369-

Все системы Unix имеют по крайней мере 16-битные идентификаторы пользователей, которые могут принимать значения от 0 (зарезервировано для корня) до 65535 (зарезервировано как недопустимое значение). Многие современные ароматизаторы (включая Linux) поддерживают большие значения, но в смешанной сети, вы должны избегать их, если вы не уверены, что все операционные системы, файловые системы и сетевые протоколы поддерживают их (например, старые версии NFS не). В Unix существует общее соглашение о том, что «малые» значения предназначены для системы, а «большие» - для администратора. «Малый» и «большой» не определены точно; порог обычно составляет 100, 1000 или где-то между ними. Кроме того 65534 по соглашению пользователь никто , который не владеет ни одним файлом и не запускает ни одну системную службу (она используется для задач, которые не должны иметь никаких привилегий, таких как поиск реализаций, которые индексируют только файлы, доступные по всему миру).

Результат состоит в том, что любое значение между 1000 и 65533 является безопасным. Это относится и к идентификаторам групп.

В сетях обычно используется низкая часть этого диапазона для специфичных для машины учетных записей и высокая часть для сетевых учетных записей. Если несколько органов власти создают учетные записи пользователей, они могут использовать различные диапазоны, например 10000-19999 и 20000-29999. В вашем случае, хорошо решить, что, скажем, диапазон 1000-2999 для прежней системы и 3000-4999 для новой системы. Или 1000-9999 для прежней системы и 10000-19999 для новой системы.

4
27.01.2020, 20:52

Теги

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