Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


пятница, 22 февраля 2019 г.

МФУ Canon ir1022 / mf3110 и Windows 10/64

Интересное, знаете ли, кино. Есть у нас в конторе некоторое количество МФУ этой фирмы: ir1022 разных модификаций и один штука mf3110. Худо-бедно они дружили с XP и Win7, 32-битными. Но пришла пора обновлять рабочие станции. Обновили, стоит не топовое, но очень приличное железо, на котором очень резво крутится Win10/64 сборки 1809, разумеется, лицензионная, всё по-честному.

И вот тут начались проблемы. Драйвер UFR II для этой ОС для моделей 1022 (с факсом и без) нашелся без особых проблем, и эти каноны заработали - и как сетевые и как локальные принтеры. Как сетевые сканеры мы их не использовали: не умеют они сканировать с сохранением на SMB-шары, как это прекрасно делают многочисленные Kyocera. Да и бог с ними, там, где эти каноны стоят, они всегда использовались только как локальные сканеры по USB.

суббота, 9 февраля 2019 г.

md5 под Windows

Довольно долго использовал найденную незнамо где утилиту md5sum.exe, явно портированную из никсов. Но неожиданно обнаружилось, что при работе с большими файлами под WinServer 2016 она начинает жрать память, как свинья помои.
Не уверен, что проблема именно в утилите, которая прекрасно работала под серверами 2008 и 2012, но решать ее надо.

Посмотрим, как себя поведет штатная утилита от Microsoft fciv. Сразу скажу, что с русскими именами файлов это ископаемое (2004) работать не умеет:


Видно, что слово "образ" (5 букв) превратилось в 4-буквенную абракадабру, и такой файл утилита найти не может. Тот же самый файл с названием из латинских букв обрабатывается на ура.


Результат совпадает с результатами от /usr/bin/md5sum. Замеры расхода памяти в процессе показывают, что лишнюю память fciv не потребляет.

На странице по ссылке указано, что fciv работает под 2000, ХР и 2003. Но у меня оно без проблем заработало под Win10 сборка 1809. Ну и, как обычно, при перенаправлении результатов в файл в конце строки появляется "вк/пс" вместо стандартного никсового "пс", так что созданные с помощью fciv файлы md5sums надо преобразовывать, убирая лишний символ, чтобы /usr/bin/md5sum могла сверять по ним проверяемые файлы.

пятница, 8 февраля 2019 г.

Клиент Windows под VirtualBox не может обратиться к \\vboxsvr

Дано: есть Windows 10, установленная в VirtualBox под Ubuntu.
Требуется: обратиться к "общей папке"
Ситуация: не получается, "не найдено сетевое имя \\vboxsvr", хотя раньше всё работало.

Ответ: обновление винды имеет дурную привычку ломать установленные системные программы. Например, напрочь сносится штатный виндовый RSAT. Судя по всему, то же самое происходит и с компонентами Virtualbox Guest Additions.

Решение: переустановить VBGA. Даже если ранее была установлена та же самая их версия. После этого "общие папки" снова прекрасно находятся.

пятница, 26 октября 2018 г.

bash: список имеющихся расширений файлов в каталоге и подкаталогах

Есть у меня сервер на самбе, вполне себе рабочий. В нем есть поддержка "корзины" (в отличие от микрософтовских серверов). Но вот какая штука: в корзину валятся всякие файлы, в т.ч. и временные. И за рабочий день их может набраться очень много.
Каждую ночь из "корзин" удаляются файлы старше 30 дней и просто очень толстые, а также - временные. Но иногда временных очень уж много. Стало быть, надо не помещать их в корзину вовсе.
Решение очевидно:

(/etc/samba/smb.conf или его инклюд)
[global]
    vfs objects = recycle
    recycle:keeptree=yes
    recycle:repository= .recycle/%U
    recycle:exclude=*.tmp,~*,*.~*

Однако, кроме трёх указанных типов (расширений имён) файлов могут удаляться и самые разные другие, в т.ч. и такие, которым незачем занимать место в "корзине". Просматривать всё вручную - не труЪ. Логично будет сначала составить список имеющихся расширений, а уже от него плясать. Но наконец-то я нашел ситуацию, для которой в никсах, кажется, нет подходящей утилиты - для выделения только расширения файла. Выделить имя - есть basename, выделить путь - dirname, а вот для выделения суффикса ничего нет.

Покопался, нашел замечательно:

(чего-то там) |awk -F . '{print $NF}'

Пример самоочевиден: объявляем точку разделителем полей и выводим то, что есть в имени файла правее последней точки. Не очень надежно, если есть файлы без расширения, и не очень быстро из-за лишних обращений к awk, но для моих целей подошло:

# cd /var/samba/share
# find -depth -type f -wholename *recycle/* |awk -F . '{print $NF}'|sort|uniq

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

Кроме того, на любимом StackExchange нашел еще приятное обсуждение по этому поводу.

Ну а для любителей башизмов, использующих встроенные возможности по максимуму, есть вот такая прелесть:

# Из начала строки убираем самое длинное вхождение "*/", получаем имя файла с расширением 
filename="${fullpath##*/}";
# Берем подстроку от начала строки (поз. 0) до позиции, где начинается собственно имя файла
### TM: по сути, именно это делает команда dirname
directory="${fullpath:0:${#fullpath} - ${#filename}}";
# Отрезаем самую короткую подстроку, состоящую из точки и как минимум одного "обычного" символа, с конца имени файла
### TM: по сути, именно это делает команда basename
base="${filename%.[^.]*}";
# Берем подстроку от позиции "длина базового имени" до конца полного имени файла
extension="${filename:${#base} + 1}";
# Если на выходе у нас есть что-то в $extension, но ничего нет в $base, то файл был без расширения
if [[ -z "$base" && -n "$extension" ]]; then
  base=".$extension";
  extension="";
fi
echo -e "Оригинал:\t'$fullpath':\n\tПуть:\t'$directory'\n\tПолное имя файла:\t'$filename'\n\tБазовое имя:\t'$base'\n\tРасширение:\t'$extension'"
Специально оставил даже форматирование, как оно было в оригинале, только комментарии перетолмачил.

среда, 3 октября 2018 г.

bash: Получение читаемой информации о пользователе из ADDS

Понадобилось мне проверить, что случилось с пользователем. Под рукой только домашняя убунта, лезть терминалом на сервер на работе не комильфо.

Но есть настроенный ldapsearch, которым мы и воспользуемся. Изначально фрагмент писался для получения данных о компах, поэтому переменная, которую ищем, называется $comp

NB! В итоговом массиве есть только одна переменная с индексом memberof, хотя пользователь может входить в несколько групп. Список групп я получаю более другими способами, поэтому ситуация в этом скрипте не анализируется. Возможно надо проверять значение индексера, и если он есть memberof, то дописывать значение параметра к переменной с таким индексом. Лично мне это просто не требуется.

#!/bin/bash
# похоже, что без промежуточного файла не обойтись - вывод ldapsearch напрямую не перехватывается
comp=$1
unset ldapData
# ldapData - ассоциативный, а не нумерованный массив!
declare -A ldapData
ldapsearch -o ldif-wrap=no -D ПОЛЬЗОВАТЕЛЬ -x -w "ПАРОЛЬ" "(cn=$comp)">/tmp/ldifDataFile
# список полей с датами, которые надо декодировать
# ведущий и хвостовой пробелы обязательны
datesList=" lastlogon pwdlastset badpasswordtime accountexpires "
while read ldiffPar ldiffData;do
  if [ "${ldiffPar:0:1}" == "#" ] || [ ${#ldiffPar} -eq 0 ]; then continue; else

# приводим ldiffPar к нижнему регистру
    ldiffPar=${ldiffPar,,}

# а для переменной-индекса убираем все двоеточия, сколько бы их там ни было
    indexer=${ldiffPar//:/}

# если два последних символа имени атрибута два двоеточия, значит он кодированный и нуждается в декодировании
    if [ ${ldiffPar: -2} == "::" ]; then
      ldapData[$indexer]="$( echo $ldiffData|base64 -d )"
    else
      ldapData[$indexer]="$ldiffData"
    fi
# если название атрибута в ADDS есть в списке $datesList, то переводим дату из
# формата MS в человекочитаемый
# не очень надежный способ поиска, поэтому ищем "пробел-индексер-пробел", а не просто "индексер"
    if  [[ "$datesList" = *" $indexer "*  ]]
    then
      ldapData[$indexer]=$( date -d @$(( ${ldapData[$indexer]}/10000000-11644473600 )) +%Y-%m-%d\ %H:%M:%S)
    fi
# отдельное внимание состоянию пользователя
    if [ $indexer == "useraccountcontrol" ]
    then
      isActive=$(( ${ldapData[$indexer]} & 2 ))
      if [ $isActive -eq 0 ]; then uacState="АКТИВЕН "; else uacState="не активен ";fi
      ldapData[$indexer]=$uacState${ldapData[$indexer]}
    fi
    echo ldapData[$indexer]=${ldapData[$indexer]}
  fi
done


На выходе получаем список всех непустых атрибутов пользователя.

среда, 8 августа 2018 г.

Замена GKSU в 18.04

Итак, кто-то решил, что gksu сильно устарела и более не требуется, поэтому она не входит ни в Debian, ни в его потомков, включая Ubuntu.

Порывшись по форумам, я узнал, что частичной заменой может служить использование pkexec:

pkexec имя_программы

При этом выводится стандартный графический запрос авторизации. Однако, этого недостаточно, потому что pkexec не передает вызываемой программе и не устанавливает переменные DISPLAY и XAUTHORITY, из-за чего графические программы в большинстве своем не запустятся.

$ env|grep -E "XAU|DISP"
DISPLAY=:0.0
XAUTHORITY=/home/troublemaker/.Xauthority

$ sudo su
...

# env|grep -E "XAU|DISP"
DISPLAY=:0.0
XAUTHORITY=/home/troublemaker/.Xauthority
# exit

$ pkexec bash
...

# env|grep -E "XAU|DISP"
#

Из протокола видно, что pkexec, в отличие от sudo, не передает эти переменные окружения.

Исключение - XUbuntu, где для большинства штатных программ есть правила для policy kit, частью которого является pkexec. Но как быть, если нет соответствующих правил для нужной программы?

Пока что я нашел такой выход из положения (имитируем gksu/gksudo, запуская приложение с правами root из-под обычного пользователя, который входит в sudoers)

pkexec env DISPLAY="$DISPLAY" XAUTHORITY="$XAUTHORITY" имя_программы

Что происходит? Мы принудительно отдаем значения действующих переменных и запускаем программу от имени root не напрямую через pkexec, а косвенно, как один из аргументов команды env.
Коряво, наверное, но лучше, чем ничего. Возможно, удастся это дело запихать в alias, но проверять лень.

Да, еще есть какой-то хитрый способ запуска примерно так:

программа admin://полный_путь_к_файлу

Например:

gedit admin:///etc/fstab

Но у меня под 16.04 он не сработал, а включать ноут, где уже 18.04, для проверки тоже лень :-)

среда, 13 июня 2018 г.

И снова о просмотре логов squid и выводе полей в awk.

Очередной способ получить человеко-читаемое время в логах прокси-сервера.

awk '{print strftime("%Y-%m-%d %H:%M:%S",$1) " " substr($0, index($0,$2))}' FILENAME

Основная идея: по умолчанию поля в этом логе отделяются пробелами. Awk преобразует первое поле (дата и время в юникс-формате) в читаемый вид и выводит его. Далее печатается пробел, после которого печатается всё от начала второго поля до конца строки.

Как выяснилось, это самый быстрый способ заставить awk вывести "всё остальное", не перебирая поля последовательно в цикле.

Решение найдено здесь.