Коснитесь файла к будущей метке времени

[113214]Во-первых, пояснение:

Для изменения разрешения на файл требуется наличие привилегии root.

Из [113689]man 2 chmod[113690] видно, что системный вызов chmod() вернет EPERM (ошибка разрешений), если:

Действующий UID не совпадает с владельцем файла, и процесс не является привилегированным (Linux: он не имеет возможности CAP_FOWNER).

alt text

Это обычно означает, что вы [113693]либо[113694] должны быть владельцем файла, либо пользователем root. Но мы видим, что ситуация в Linux может быть немного сложнее.

Итак, есть ли какие-нибудь отношения между root и ядром?

  • Как вы указали в тексте, который вы цитируете, ядро отвечает за проверку того, что UID процесса, выполняющего системный вызов (т.е. пользователя, от имени которого он запущен), разрешено делать то, о чем он просит. Таким образом, суперспособности корня исходят из того факта, что ядро запрограммировано на то, чтобы всегда разрешать операцию, запрашиваемую пользователем root (UID=0).
  • В случае Linux, большинство различных проверок разрешений, которые происходят, проверяют, имеет ли данный UID необходимую [113697] возможность [113698]. Система возможностей позволяет более точно контролировать, кому что разрешено делать.
  • Однако, чтобы сохранить традиционное для UNIX значение "корневого" пользователя, процесс, выполняемый с UID 0, имеет все возможности.
  • Обратите внимание, что хотя процессы, выполняемые с UID=0, имеют привилегии суперпользователя, они все равно должны делать запросы ядра через интерфейс системного вызова. Таким образом, пользовательское пространство процесса, даже запущенного от имени root, всё ещё ограничено в том, что он может делать, так как запущен в "[113699]user mode[113700]", а ядро запущено в "[113701]kernel mode[113702]", которые на самом деле являются различными режимами работы для самого процессора. В режиме ядра процесс может получить доступ к любой памяти или выдать любую инструкцию. В пользовательском режиме (на x86 процессорах существует несколько различных защищённых режимов) процесс может получить доступ только к своей памяти и выдать только некоторые команды. Таким образом, процесс, запущенный от имени root, имеет доступ только к тем возможностям режима ядра, которые предоставляет ему ядро. [113235]
2
11.02.2015, 14:53
2 ответа

Я получил эту работу в виртуальной среде, изменив этот метод .

Было два вопроса. Сначала пришлось специально использовать модуль gdal версии 1.9.1. 1.10.0 и 1.11.0 не будут работать с версией 1.9.2 основной библиотеки gdal, с которой поставляется redhat. Во-вторых, я должен был передать -I/usr/include/gdal в gcc. Последовательность такова:

# you might need to do a sudo -s if your virtualenv is owned by root.
scl enable python27 bash
cd $VIRTUENV_ROOT
source bin/activate
pip install --no-install gdal==1.9.1
cd build/gdal
python setup.py build_ext \
  --gdal-config=/usr/bin/gdal-config \
  --include-dirs=/usr/include/gdal/
python setup.py install

Виртуальная среда не является строго необходимой, но я не знаю, где находится глобальная папка построения питона.

-121--244370-

Да. Это можно сделать с помощью tr в языковом стандарте ASCII (который для GNU tr в любом случае относится только к его компетенции) . Можно использовать классы POSIX или ссылаться на значения байтов каждого символа восьмеричным числом. Можно также разделить их преобразования по диапазонам.

LC_ALL=C tr '[:upper:]\0-\101\133-140\173-\377' '[:lower:][\n*]' <input

Приведенная выше команда преобразует все символы верхнего регистра в строчные, полностью игнорирует строчные символы и преобразует все другие символы в новые строки. Конечно, потом ты наматываешь тонну пустых линий. Переключатель tr -s queeze repeat может быть полезен в этом случае, но если вы используете его рядом с преобразованием [: верхний:] в [: нижний:] , то вы также сжимаете прописные символы. Таким образом, он все еще требует второго фильтра, как...

LC... tr ... | tr -s \\n

... или...

LC... tr ... | grep .

... и поэтому это становится намного менее удобным, чем делать...

LC_ALL=C tr -sc '[:alpha:]' \\n <input | tr '[:upper:]' '[:lower:]'

... который сжимает -c объединение буквенных символов по последовательности в одну новую линию кусок, затем делает преобразование от верхней к нижней на другой стороне трубы.

Это не означает, что диапазоны такого характера не полезны. Такие вещи, как:

tr '\0-\377' '[1*25][2*25][3*25][4*25][5*25][6*25][7*25][8*25][9*25][0*]' </dev/random

... могут быть довольно удобными, так как он преобразует входные байты во все цифры по расширенному спектру их значений. Не трать, не хочешь, ты знаешь.

Другой способ выполнения преобразования может включать dd .

tr '\0-\377' '[A*64][B*64][C*64][D*64]' </dev/urandom |
dd bs=32 cbs=8 conv=unblock,lcase count=1

dadbbdbd
ddaaddab
ddbadbaa
bdbdcadd

Поскольку dd может выполнять как разблокирование , так и преобразование в один и тот же период времени, можно даже передать ему большую часть работы. Но это может быть действительно полезно, только если вы можете точно предсказать количество байтов на слово - или, по крайней мере, можете добавить каждое слово с местами заранее к предсказуемому количеству байтов, потому что разблокировать ест конечные места в конце каждого блока.

-121--37680-

Просто добавьте знак минус:

TZ=ZZZ0 touch -t "$(TZ=ZZZ-0:30 date +%Y%m%d%H%M.%S)" $HOME/reference

Или переверните свой трюк с часовым поясом:

TZ=ZZZ0:30 touch -t "$(TZ=ZZZ0 date +%Y%m%d%H%M.%S)" $HOME/reference

Если вам нужно выйти за пределы диапазона смещений часового пояса, стандартным утилитам оболочки, как известно, не хватает способа манипулировать датой. Различные люди проделали работу по реализации вычислений даты в оболочке Борна, поэтому один из вариантов - загрузить один из них (некоторые перечислены в Арифметика даты в сценариях оболочки Unix ). Другой вариант - установка coreutils GNU ,в частности, команда date , позволяющая набрать даты, такие как now + 30 minutes . Можно также установить более сложную среду создания сценариев, например Perl, и использовать ее библиотеки управления датами.

1
27.01.2020, 22:21

Используйте эту команду:

touch -t "$( printf '%(%Y%m%d%H%M.%S)T\n' 'now +30 minutes' )" file

С помощью -t из touch можно указать дату. А с помощью -t ksh также можно отформатировать дату. с помощью -t[дата-формат]T см. страницу руководства ksh.

0
27.01.2020, 22:21

Теги

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