Шестнадцатеричные байты мусора в wtmp файле

Единственный способ присвоить значения позиционным параметрам в bash - использовать встроенный set :

set a b

назначает a до $ 1 и b до $ 2 (обратите внимание, что он сбрасывает весь список позиционных параметров, поэтому $ 3 , $ 4 ... потеряны).

Итак, здесь вы можете сделать:

set -- "$(($1 / 1000))"

Чтобы присвоить значение $ 1 , разделенное на 1000, на $ 1 .

Напротив, с zsh (более продвинутая оболочка, подобная Bourne, не являющаяся частью проекта GNU, присутствует во всех Unix, но часто не по умолчанию), вы можете назначать индивидуальные позиционные параметры, например:

1=$(($1 / 1000))

Или:

argv[1]=$(($1 / 1000))

Или:

(( argv[1] /= 1000 ))

( $ argv - это специальный массив, привязанный к позиционным параметрам)

Вы по-прежнему не можете сделать:

let 1/=1000
(( 1/=1000 ))

.

zsh также поддерживает арифметику с плавающей запятой, поэтому вы можете:

((argv[1] /= 1000.))

(использование a константы с плавающей запятой (1000.) вызывает арифметику с плавающей запятой).

Вы можете отобразить его так:

printf "%.2f$kilo\n" $1
1
19.11.2014, 12:46
3 ответа

Я в конечном итоге отслеживал его.

В системе есть сторожевое значение, которое перезагружает систему, если она не может связаться с определенными процессами. Проблема заключалась в том, что мое приложение было убито SIGTERM или SIGKILL и сначала не отключалась от сторожевого значения, что он делает, если используется SIGINT.

Эта перезагрузка во время отключения записывает эти ожеременные байты в WTMP. Теперь я написал скрипты запуска и выключения в /etc/init.d и ссылки на настройку в RC # .d, используя chkconfig, и проблема ушла /

0
27.01.2020, 23:51

Вам нужно решить эту проблему в целом или только один раз? Если вам просто нужно решить его один раз, иногда простое решение лучше всего. Мы можем использовать раскосы расширения в Bash:

rm vtm_data_12month_2014{09,10}{01..29}.txt

Это может работать в вашем случае, так как:

  • Количество аргументов, которые мы отправим rm вряд ли пошлет нас через ARG_MAX, и
  • День, на котором вы хотите остановиться, одинаков как в октябре, так и в сентябре.

Если вам нужно решить эту проблему в более общем плане, вы должны учитывать тот факт, что разные месяцы заканчиваются в разные дни (октябрь, например, заканчивается 31 числа, но в вашем примере есть данные только до 30 числа).

Если на схему именования файлов в вашем примере можно положиться, то в следующем случае будут удалены все, кроме последнего файла, доступного для каждого месяца (на основе имени файла, а не фактических временных меток, связанных с созданием или изменением файла):

get_years() {
  find ./ -type f | cut -d'_' -f4 | cut -c1-4 | sort | uniq
}

get_months_for_year() {
  year=$1
  find ./ -iname "vtm_data_12month_${year}*.txt" -type f | cut -d'_' -f4 | cut -c5-6 | sort | uniq
}

get_latest_for_year_month() {
  year=$1
  month=$2
  find ./ -iname "vtm_data_12month_${year}${month}*.txt" -type f | cut -d'_' -f4 | cut -c7-8 | sort | tail -1
}

for year in $(get_years); do
  for month in $(get_months_for_year $year); do
     latest=$(get_latest_for_year_month $year $month)
     end=$(($latest - 1))
     for i in $(seq 1 $end); do 
      day=$(printf '%02d' $i)
      rm vtm_data_12month_${year}${month}${day}.txt
     done
  done
done

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

-121--205523-

Проверка действительности даты и генерируемого диапазона дат затруднена и может привести к ошибкам с помощью сценария bash. Лучшим выбором было бы использовать python или perl или любые другие языки сценариев более высокого уровня, которые могут выполнять углубленные проверки. Я обновил сценарий, чтобы он мог удалять файлы в пределах диапазона дат и исключая диапазон дат.

Параметры будут такими же, как

Удаление файлов из диапазона

./dfile.py --from 20140929 --to 20141001  --range

Удаление файлов из диапазона

./dfile.py --from 20140929 --to 20141001  --out-range

Эта программа также создает полезное сообщение справки, если аргументы приведены неверно.

#!/usr/bin/env python3


import os
import sys
import argparse
import datetime

parser = argparse.ArgumentParser()
parser.add_argument('--from', dest="fromd", type=str, required=True, help="From date")
parser.add_argument('--to', dest="tod", type=str, required=True, help="To date")
parser.add_argument('--range', dest='drange', action='store_true', help="Delete files between the given date")
parser.add_argument('--out-range', dest="orange", action='store_true', help="Delete files apart form the given date")

args = parser.parse_args()

if args.drange and args.orange:
    print('Enter either --range or --out-range option')
    sys.exit(1)
elif not (args.drange or args.orange):
    print('You must select either --range or --out-range option')
    sys.exit(1)

from_date = args.fromd
to_date = args.tod
path='/tmp/tmp.54JUy4ZP6x/'


try:
    from_date = datetime.datetime.strptime(from_date, '%Y%m%d').date()
    to_date   = datetime.datetime.strptime(to_date, '%Y%m%d').date()
except ValueError:
    print('Check if the date has been given in YYYYMMDD format')
    sys.exit(1)

files = [ x for x in os.listdir(path) if x.endswith('.txt') ]


for file in files:

    file_date = datetime.datetime.strptime(file[17:25], '%Y%m%d').date()

    if args.orange:
        # Delete files out of date range
        if not from_date < file_date < to_date:
            print('Deleting file {}'.format(file))
            os.remove(path + '/' + file)
    else:
        # Delete files within date range
        if from_date < file_date < to_date:
            print('Deleting file {}'.format(file))
            os.remove(path + '/' + file)

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

Надеюсь, это поможет вам.

-121--205524-

Это двоичный файл, который считывается, например, last (по умолчанию /var/log/wtmp , можно также указать другой целевой объект с помощью -f ).

Таким образом, существует ли последняя разумная запись, полностью зависит от того, как последний реализует доступ к файлу и как он их использует (фиксированное количество записей с фиксированной длиной, к которым осуществляется доступ в раунде, например, один вариант).

1
27.01.2020, 23:51

WTMP и NOTMP файлы - двоичные файлы - не ASCII. Поэтому вы ожидаете увидеть данные не-ASCII. Если вы хотите прочитать их, используйте команду последнего команда . Если эта команда работает, то файл в порядке.

Пример формата можно найти в Человек 5 WTMP , который можно прочитать здесь .

Эта страница также упоминает это:

Обратите внимание, что структура UTMP из libc5 изменилась в libc6. Из-за этого двоичные файлы, использующие Star Libc5 struck, будут повреждены / var / run / utmp и / или / var / log / wtmp.

Если последний не удается, может быть, это могло объяснить ваш гирдук Hexdump?

0
27.01.2020, 23:51

Теги

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