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

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


понедельник, 21 декабря 2015 г.

mount для Windows или работа с дисками в Windows в стиле Unix

Как известно, одно из отличий файловых систем WinDOS и *nix в том, что в Windows каждый том обычно имеет буквенное обозначение - C:. D: и т.д., а в *nix - подключается к каталогу внутри файловой системы.
Но начиная с Windows 2000 есть возможность не только назначить тому букву или несколько, но и подключить его к пустой папке на разделе с NTFS:



Это открывает новые полезные возможности. Например, у меня на NTFS-разделе создан каталог (сюрприз!) \mnt, внутри которого куча подкаталогов - по одному на каждый сменный накопитель, когда либо подключавшийся к моему рабочему компу.

Всё бы ничего, но Windows предлагает преимущественно графические средства для подобных настроек, тогда как в *nix существует команда mount, которая умеет как показать подключенные тома, так и подключать новые.
Однако, в Windows есть команда diskpart, которая в чем-то сходна с mount. О ней и поговорим немного.

Diskpart может работать в интерактивном режиме: запускаем ее, она выводит свою подсказку и ждет ввода своей команды. А можно собрать нужные команды в файл сценария и с ключом /s запустить этот сценарий на выполнение.

Таблица взята из технета по ссылке выше. Перевод мой.

Команда Описание
list volume
Выводит список обычных и динамических томов на всех дисках.
select volume
Выбирает указанный том, volumenumber - номер тома, и "фокусируется" на нём, то есть, следующие команды будут применяться к этому тому. Если номер тома не задан, то команда select показывает, какой том выбран на данный момент. Том можно задать номером, буквой диска или путём к точке монтирования. На простых дисках (basic disk) выбор тома одновременно выбирает и соответствующий раздел на этом диске.
assign
Назначает текущему тому букву диска или каталог-точку монтирования. Если ни то ни другое не указано, то тому присваивается следующая свободная буква. Если выбранная буква или точка монтирование уже занята, то выводится сообщение об ошибке.
С помощью команды assign можно изменить букву, назначенную съемному носителю.
Нельзя присваивать буквы загрузочным томам или томам, содержащим файл подкачки. Кроме того, нельзя назначать буквы специальным разделам вроде ОЕМ-разделов, системным разделам EFI или любым разделам в GPT кроме основных разделов с данными.
mount= путь
Указывает пустой существующий каталог на разделе NTFS, куда будет подключен указанный том.

Кроме того, начиная с srv2003 есть команда mountvol, гораздо более близкая к mount. Она занимается именно тем, что подключает том к указанному каталогу.

понедельник, 14 декабря 2015 г.

Ubuntu: Chrome и FireFox не открывают SWF, предлагают сохранить их вместо этого

Довольно известные грабли: с какого-то момента оба основных браузера отказываются открывать локальные флешки, предлагая сохранить их на диск. Но на фига мне их сохранять, если я и так открываю их с диска. Не будем брать запущенный случай "офиспланктонизма головного мозга", когда для копирования файла с носителя на носитель его открывают в программе редактирования и пересохраняют в другое место.
Но что делать, если хочется поиграть в казуальную игрушку или посмотреть мультик в формате SWF?

Корень проблемы кроется здесь. Не вдаваясь в лишние подробности, поясню: с 2013 года тип данных application/x-shockwave-flash стал не самостоятельным MIME-типом, а псевдонимом (alias) для типа данных application/vnd.adobe.flash.movie.

Что это значит для нас? Для нас это значит, что браузер не понимает ответа от базы данных MIME-типов "а еще есть псевдонимы", когда обращается к ней за определением типа файла, который мы пытаемся открыть. База честно рапортует, это мол адобовский фильм, а вовсе не какой-то там флеш, хотя есть псевдонимы...

А вот что понимает встроенный flash в Chrome:

Adobe Flash Player - Версия: 20.0.0.228
Shockwave Flash 20.0 r0
Типы MIME:
Тип MIME Описание Расширения файлов
application/x-shockwave-flash Shockwave Flash
.swf
application/futuresplash FutureSplash Player
.spl

То есть, про application/vnd.adobe.flash.movie он ничего не знает, а значит и не пытается его открыть. Других плагинов, понимающих такой тип данных, тоже как-то не находится, вот и предлагают его сохранить, потому как неизвестно, что с ним еще делать.

Что ж, будем лечить. Как явствует из фрагмента по ссылке выше, надо где-то поменять местами application/vnd.adobe.flash.movie и application/x-shockwave-flash.

Где менять? 

Многочисленные источники подсказывают, что править надо файл

sudo nano /usr/share/mime/packages/freedesktop.org.xml

Лично я в своем экземпляре просто поменял местами то, что в кавычках:

$ diff /usr/share/mime/packages/freedesktop.org.xml 

/usr/share/mime/packages/freedesktop.org.xml.org
18432c18432
<   < mime-type type="application/x-shockwave-flash">
---
>   < mime-type type="application/vnd.adobe.flash.movie">
18488c18488
<     < alias type="application/vnd.adobe.flash.movie"/>
---
>     < alias type="application/x-shockwave-flash"/>
39338c39338
< < /mime-info>
---
> < /mime-info>
</сode>

После изменения файла необходимо актуализировать базу данных:

$ sudo update-mime-database /usr/share/mime

Всё, собственно.

Использованные материалы:

понедельник, 2 ноября 2015 г.

Samba: добавление группы в домен с помощью samba-tool

Помимо net [ads|rpc] group add можно использовать штатный скрипт samba-tool.

samba-tool group add имя_группы -H ldap://имя_DC.полный.дом.ен -U имя_админа --group-scope=Domain|Global|Universal --group-type=Security|Distribution --groupou="OU=под,OU=разд,OU=еле,OU=ние"

Имя_группы, как и имя_админа указывать без домена - информация берется из параметра -H.

Аргумент параметров --group-scope и --group-type пишется с ЗАГЛАВНОЙ буквы без сокращений. В противном случае будет сообщение об ошибке.


--group-scope=D - нельзя
--group-scope=domain - нельзя
--group-scope=Domain - правильно


В параметре --groupou указывается только "подразделенческая часть", в которой не должно быть доменного контекста "dc=что-то-там"

У этого скрипта есть и другие параметры, но к добавлению группы они отношения не имеют.

пятница, 23 октября 2015 г.

Ubuntu 15.10 и bluetooth адаптер AR3012

Купил себе ноутбук летом, Lenovo G710. Машинка не без недостатков, самым главным из которых я считаю отсутствие индикаторов обращения к диску и регистровых клавиш, но в целом вполне приличная.
К танцам с бубном для включения встроенного блютуса я был готов. Но в 15.04, которую поставил на этот ноут изначально, вроде бы он заработал искаропки. А может и нет - уже не помню.
А вот под 15.10 - ни в какую.

Спящий режим в ubuntu 15.04, 15.10

История повторяется и повторяется. То, что делал для 13.10, пришлось делать и для 15-ых версий. Почему же до сих пор hibernation не включено по умолчанию???

http://tm-experimental.blogspot.ru/2014/04/1310.html

понедельник, 12 октября 2015 г.

Немножко о циклах и nslookup

Просто для памяти: массовый nslookup последовательных имен хостов

for a in `seq 56 65`; do nslookup cont30prn0$a|grep "Name:" -A 1; done

С командой seq я уже разбирался ранее, объясню про grep в данной ситуации: nslookup выдает несколько строк информации по каждому хосту, но мне нужны только две - название и адрес искомого хоста, и совершенно не интересны строки с информацией о DNS-сервере и т.п. Поэтому ищу строчку со словом "Name:" и вывожу на экран её и еще одну строку после (-A 1)

Name:    cont30prn056.my.domain
Address: 172.21.123.20
Name:    cont30prn057.my.domain
Address: 172.21.126.157
Name:    cont30prn058.my.domain
Address: 172.21.123.13
Name:    cont30prn059.my.domain
Address: 172.21.123.37
Name:    cont30prn060.my.domain
Address: 172.21.124.203
Name:    cont30prn061.my.domain
Address: 172.21.124.204
Name:    cont30prn062.my.domain
Address: 172.21.123.62
Name:    cont30prn063.my.domain
Address: 172.21.123.63
Name:    cont30prn064.my.domain
Address: 172.21.123.64
Name:    cont30prn065.my.domain
Address: 172.21.123.65

С обратным nslookup несколько проще - вся нужная информация выводится в одной строке, но вот со списком непоследовательных адресов морока.

for a in 123.20 126.157 123.13 123.37 124.203 124.204 123.62 123.63 123.64 123.65; do nslookup 172.21.$a|grep in-addr; done

20.123.21.172.in-addr.arpa    name = cont30prn056.my.domain.
157.126.21.172.in-addr.arpa    name = cont30prn057.my.domain.
13.123.21.172.in-addr.arpa    name = cont30prn058.my.domain.
37.123.21.172.in-addr.arpa    name = cont30prn059.my.domain.
203.124.21.172.in-addr.arpa    name = cont30prn060.my.domain.
204.124.21.172.in-addr.arpa    name = cont30prn061.my.domain.
62.123.21.172.in-addr.arpa    name = cont30prn062.my.domain.
63.123.21.172.in-addr.arpa    name = cont30prn063.my.domain.
64.123.21.172.in-addr.arpa    name = cont30prn064.my.domain.
65.123.21.172.in-addr.arpa    name = cont30prn065.my.domain.

понедельник, 5 октября 2015 г.

mySQL: использование пробелов и специальных символов в именах столбцов

Год назад я писал о фильтровании результатов работы скрипта. Вынужденно пришлось вернуться к этой теме.

Итак, есть mySQL-база от OCS inventory, есть документы в O/L-офисе, есть в этом же офисе "база данных" (.odb)

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

Да вот беда! Обёртки прекрасно работают в O/L-офисе, но совершенно не работают, например, в mySQL Workbench.

То есть, конструкция типа select "ip адрес", "имя пользователя" from (результат работы скрипта) прекрасно работает в офисе, но возвращает либо ошибку, либо ерунду в Workbench. При этом столбцы без пробелов возвращаются прекрасно.

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

Вуаля! select `ip адрес`, `имя пользователя` from (результат работы скрипта) работает как минимум в Workbench, как и должно.

четверг, 1 октября 2015 г.

VMware ESXi 5.1.0 и зависания

Время от времени старый гипервизор, который вот-вот будет обновлен до ESXi 6, начинает вести себя по-хамски: то у него забивается под завязку виртуальный диск root, то VMwareTools на одной из ВМ теряют возможность обмена по RPC.

Порядок действий:

1. ssh до гипервизора (при необходимости - разрешить ssh с консоли)
2. логин подходящим пользователем с root-правами
3. проверяем место на дисках командой vdf -p
4. /etc/init.d/hp-ams.sh restart
этим убивается /var/log/hpHelper.log, который отъедает кучу места при долгом аптайме

Теперь по проблемным виртуальным машинам.

1. net stop "vmtools"
2. прибиваем, если сам не умрет, процесс vmtoolsd.exe
3. Удаляем или переименовываем плагин "C:\Program Files\VMware\VMware Tools\plugins\vmusr\unity.dll" - ESXi его не использует, но он, плагин, при этом имеет привычку гадить.
4. Создаем на всякий случай "C:\ProgramData\VMware\VMware Tools\tools.conf" с таким содержимым:

# http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2038263
[unity]
Pbrpc.enable=false

воскресенье, 27 сентября 2015 г.

Немного о структуре файлов .desktop

Gnome uses some of the .desktop files specification functions in the context of autostart to achieve it's control panel functionality, in short:

  - A user .desktop autostart file with the same name as one global, overrides it
  - A .desktop file can have a OnlyShowIn=GNOME;XFCE;OTHER_DE configuration entry, which defines the desktop environments this app will autostart.
  - A .desktop file can have a NotShownIn=GNOME,LXDE;OTHER_DE configuration entry, wich defines the desktop environments this app willl NOT autostart.
  - A .desktop file can have a Hidden=True configuration entry, wich "enables" or "disables" the autostart of this file.

Источник: http://forum.bittorrent.com/topic/28106-linux-desktop-gui-unofficial-packages-for-bittorrent-sync/

пятница, 18 сентября 2015 г.

bash: нумерация строк в файле

Утилитарная задача: прочесть текстовый файл, что-то поделать с его содержимым и вывести результаты в виде пронумерованных строк.
Пример реально работающего скрипта. Есть набор нумерованных каталогов, есть файл, в котором каждому номеру сопоставлена текстовое описание. Чтобы пользователям не вспоминать, чему соответствует какой номер, хочу создать симлинки на номерные каталоги в виде человеко-читаемых названий.

Структура файла данных /var/samba/secret/work (файл был несколько причёсан из исходного сырья):

NNN Текст[;]

Где NNN - трехзначное число. Если меньше 100, то дополненное ведущими нулями, хотя можно обойтись и без этого. (ведущие нули, кстати, сыграли злую шутку вроде той, о которой я уже писал в "особенностях арифметики")

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

#!/bin/bash
while read
    do
    a=$[a+1]
    deptSA=`echo "$REPLY"|cut -d \  -f 2-|sed "s/\;//"`
    depNSA=${REPLY:0:3}
    printf "%02d:%03d:$deptSA\n" $a $[10#$depNSA]
    if [ -d /var/samba/secret/$depNSA ]
    then
        ln -s /var/samba/secret/$depNSA /var/samba/secret/"$deptSA"
    fi
done</var/samba/secret/work

Файл будем читать построчно в цикле while командой read. Мне лень изощряться, поэтому читаем из stdin, куда файл вливается через переназначение. Вдвойне лень изощряться, поэтому не присваиваю никакую переменную, а использую дефолтную $REPLY.

среда, 9 сентября 2015 г.

bash: Возврат значений из функций и работа с файлами конфигурации

Удобно, когда скрипт берет настройки из некоего файла. Например, можно дать доступ к настройкам пользователю, не давая ему изменять собственно скрипт. Чтобы не повторять довольно длинный кусок кода в каждом скрипте каждый раз, когда надо получить какую-то настройку, лучше написать функцию, которая будет лезть в файл настроек и брать оттуда нужную переменную.
Тут вылезает другая грабля: функции в bash не умеют возвращать свои результаты. Максимум, на что они способны - вернуть код завершения. А как быть со строками?

вторник, 8 сентября 2015 г.

Zimbra: грамотно работаем с фильтрами сообщений в веб-клиенте и в командной строке

Содержание: как правильно экспортировать и импортировать фильтры обработки сообщений из учетных записей зимбры.

Веб-интерфейс позволяет создавать фильтры для обработки сообщений. Они сохраняются в параметре zimbraMailSieveScript.

Например:

$ zmprov ga учетка zimbramailsievescript

понедельник, 7 сентября 2015 г.

Zimbra: postfix, aliases и почтовые роботы

Содержание: как заставить postfix в составе Zimbra нормально принимать почту на псевдо-адреса в файле /etc/aliases или его аналоге.

Понадобилось мне обработать дополнительно письма, приходящие на конкретный адрес. Это было частью весьма эротичной (в смысле - поебаться с ней пришлось конкретно) задачи: письмо, отправленное на несколько абонентов "Мегафона", разбить на отдельные сообщения. То есть, "Мегафон" позволяет отправлять емайлы на "адреса" вида номер_телефона@sms.megafondv.ru (для Дальнего Востока). Но из строк to:/cc:/bcc: обрабатывается только последний адрес получателя, все остальные молча игнорируются. "Мегафон" предлагает услугу, что-то вроде пакетной рассылки смс таким способом, но за приличные таньга.
Проблема только в том, что если не удастся отправить своевременно короткие сообщения именно этим нескольким конкретным получателям, то "Мегафон" в нашей области может сдохнуть через несколько часов после наступления необходимости в такой отправке - диспетчер энергосистемы должен таким способом проинформировать начальство о серьезных сбоях вроде взрыва Фукусимы или пожаре на входном городском трансформаторе.
Тем не менее, такая общественно-полезная рассылка меньше чем на десяток корпоративных номеров всё равно осталась платной услугой, и мы решили её не покупать.

среда, 2 сентября 2015 г.

Особенности арифметики в bash: системы счисления

Краткое содержание: надо учитывать или явно указывать систему счисления.

Простая задача: найти, какой месяц был 7 месяцев назад.
Любым способом получаем текущий месяц, например:

(дальше использованы фрагменты рабочего скрипта, поэтому много излишеств, удалены некоторые другие команды, которые этими излишествами активно используются)

# лишняя переменная tSA только для удобства, чтобы не появились ошибки из-за
# неправильного экранирования вложенных команд
tSA=`date +%s`
# сегодня
todaySA=`date -d @$tSA +%Y%m%d`
# месяц сегодня
motSA=${todaySA:4:2}


Если месяц меньше 10, то в переменную motSA попадает значение вида 0N, где N - номер месяца с добавленным ведущим нулём. Всё красиво и гладко.Теперь находим искомое:

curmo=$motSA
echo curmo=$curmo
oldermo=$[curmo-7]
echo oldermo=$oldermo


Однако же... На дворе сентябрь, а значит curmo=09. По логике, 7 месяцев назад был февраль. Казалось бы, чего проще:

oldermo=$[curmo-7] ==> oldermo=$[09-7]

Однако, вместо oldermo=2 получаем ошибку:

$ curmo=09;echo $[curmo-7]
bash: 09: значение слишком велико для основания (ошибочная метка "09")


Мать моя женщина! Что за нафиг? Роемся в памяти и вспоминаем, что в некоторых языках программирования число с ведущим нулём считается заданным не в десятичной системе. В каком-то из ассемблеров ведущий ноль указывал на восьмеричную систему счисления (СС), и там вылезла бы подобная ошибка, потому как восьмеричные цифры от нуля до семёрки.
Начинаем курить мануал по bash и без проблем находим упоминание про base, hexadecimal, octal и т.п. В языке FORTH есть специальная конструкция, позволяющая временно изменить основание системы счисления (ОСС)в пределах текущего (под)выражения, что-то подобное должно быть и в bash. Точно, есть.

Для указания СС, в которой записано число, перед этим числом ставим префикс, в котором указываем десятичное значение ОСС. Например, 16 для шестнадцатиричной:

$ a=$[16#20];echo $a; a=$[8#20];echo $a;
32
16


По умолчанию bash распознает восьмеричную и шестнадцатеричную СС по префиксам 0 и 0x соответственно. Есть и некоторые другие особенности (знак "меньше" в сочетании "greater< than 9" не мой - скопировано из мануала к bash 4.3.11, для версии 4.2.25 такой ошибки нет):

Constants  with  a  leading 0 are interpreted as octal numbers.  A leading 0x or 0X denotes hexadecimal.  Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.  If base# is omitted,  then  base 10  is  used.  When specifying n, the digits greater< than 9 are represented by the lowercase letters, the uppercase letters, @, and _, in that order.  If base is less than or equal to 36, lowercase and uppercase letters may be used interchangeably to represent numbers between 10 and 35.

Ладно, с ОСС разобрались, тестовый пример работает:

$ echo $[10#09-7]
2


И тут снова вылезает злосчастное "однако":

$ curmo=09;echo $[10#curmo-7]
bash: 10#curmo: значение слишком велико для основания (ошибочная метка "10#curmo")


На этот раз ошибка в том, что с указанием ОСС имя переменной перестает восприниматься как имя, а считается просто числом, записанным в указанной СС. Но в десятичке нет цифр c, m, o, r или u. Придется разыменовывать переменную:

$ curmo=09;echo $[10#$curmo-7]
2


Ура!

понедельник, 24 августа 2015 г.

Рекурсивная md5sum

Встала неплановая задача: посчитать контрольные суммы в дереве каталогов. Как выяснилось, штатная md5sum этого не умеет - она работает только с текущим каталогом.

Пришлось изобрести велосипед:

rm путь-к-файлу-контрольных-сумм
find * -type f -exec md5sum {} \;>>путь-к-файлу-контрольных-сумм

Велосипед поехал нормально. Но великий и могучий подсказал, что уже есть как минимум мотоцикл:

MD5DEEP

       md5deep - Compute and compare MD5 message digests
       sha1deep - Compute and compare SHA-1 message digests
       sha256deep - Compute and compare SHA-256 message digests
       tigerdeep - Compute and compare Tiger message digests
       whirlpooldeep - Compute and compare Whirlpool message digests

       Computes  the  hashes,  or  message digest, for any number of files while
       optionally recursively digging through the directory structure.

Из недостатков:
1. не умеет отбирать файлы по расширению. Как сказано в мане, если выполнить
md5deep -r *.txt , то будут обработаны файлы в каталогах с расширением .txt, а не текстовые файлы
2. смущает надпись "United States Air Force" в заголовке мана. Будем считать это выпендрёжем

UPD: куча дополнительных способов здесь

четверг, 6 августа 2015 г.

О знаке № в андроиде и о "хакерской" клавиатуре

Не одного меня терзают смутные сомнения, что сей знак - № - отсутствует в раскладках штатных клавиатур как минимум до андроида 4.4 (более новых у меня нет), и это при том, что будучи введен или скопирован, он прекрасно отображается.

Более того, штатная (и многие другие) экранная клавиатура лишена многих возможностей штатной клавиатуры компьютера. Например, не всегда удобно перемещать курсор в поле ввода нажатиями пальца или стилуса.

Тот, кто пробовал управлять серверами по SSH, тот поймет все "прелести". Я их понял достаточно давно и остановился на отличной клавиатурке Hacker's Keyboard от Klaus Weidner. Последняя версия вышла в конце декабря 2013 года, но на данный момент я не вижу, что там еще можно улучшить. Хотя... да, интеграция со встроенной проверкой правописания не помешала бы - клавиатура ведет свой пользовательский словарь, что не всегда удобно, если пользуешься ей не постоянно.

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

Под катом большие скриншоты с пояснениями.

среда, 29 июля 2015 г.

Шуточки от ISC или донастройка bind9

Начиная с версии 9, сервер имен bind хранит зоны в двоичном формате.
Безусловно. так получается компактнее и удобнее для обработки. Машиной. А что делать человеку?

ISC предлагает пользоваться щтатной утилитой named-compilezone, но несколько напрягает невозможность хранить комментарии и т.д. Может это и правильно, не знаю, но в комментариях к той же статье упоминается про некий параметр masterfile-format=raw|text. Вот он-то нам и нужен. Задать его можно либо глобально в /etc/bind/named.conf.options, либо по отдельности для нужных зон в /etc/bind/named.conf.local.

Для себя я предпочел глобальный вариант.

/etc/bind/named.conf.options

options {
    directory "/var/cache/bind";
ВСЯКИЕ ДРУГИЕ ПАРАМЕТРЫ
    masterfile-format text;
};

И всё, собственно.

Теперь далее. Почему-то по умолчанию apparmor в Ubuntu 14.04 настроен не совсем удачно для совместной работы с bind и webmin, поэтому как-то хитро блокирует бинду доступ к /var/lib/bind, куда webmin предлагает складировать файлы зон по умолчанию. Из-за этого  не проходит трансфер  с невразумительными ошибками.

Лечение:

/etc/apparmor.d/usr.sbin.named


Убираем "l" (строчная "L")
  /var/cache/bind/** lrw,

Вебмин имеет дурную привычку неправильно назначать владельцев, поэтому может понадобиться вручную

chown bind:bind /var/lib/bind/*.hosts /var/lib/bind/*.rev

Короче, для файлов зон. После этого всё встаёт на свои места.

вторник, 21 июля 2015 г.

Отключение IPv6 в Ubuntu

Поднадоело, что по умолчанию новые серверы идут со включенным IPv6, которого нет в нашей локалке.
WebMin утверждает, что


IPv6 запрещен, однако...

пятница, 17 июля 2015 г.

bash: дополнение по работе с массивами

Новый ABSG (версия 10 от 20140310) можно взять на TLDP, источник выглядит вполне официально. Даю ссылку на страницу, а не на конкретный файл, поскольку там можно скачать ABSG в нескольких вариантах. Я себе скачиваю PDF и "плоский" (всё в одном файле) html, но кому-то может понравится и другой из предложенных вариантов.

Теперь собственно о массивах. Более подробно можно посмотреть в ABSG-10 на стр 869

четверг, 16 июля 2015 г.

bash: получить список файлов в переменную, работа с массивами

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

Рецепт:

переменная_скрипта=( шаблон_имён_файлов )

Дальше - согласно ABSG Ch. 27 "Arrays" и подробнее на стр. 415-416 (если у кого есть ссылка на официальный Advanced Bash Scripting Guide 2014 или 2015 года, буду признателен)
Количество элементов в массиве: ${#имя[@]}
Длина конкретного элемента: ${#имя[номер]}

понедельник, 6 июля 2015 г.

Групповая обработка файлов с похожими именами

Сервер OCS Inventory позволяет сохранять полученные от клиентов данные в виде отдельных файлов с расширением .ocs. Это может быть полезно для анализа истории изменений конфигурации. Но вот незадача: файлы плодятся гораздо быстрее кроликов и вскоре отведенный под них каталог забит файлами с именами вида "КОМП-дата-время-номер.ocs",  например, "computer017-2014-11-02-09-17-1.ocs", где "дата" и "время" - дата и время создания записи об этом компе. То есть, имена файлов с информацией об одном компьютере отличаются только полем "номер", причем в первом файле из серии это поле отсутствует.
Надо бы как-то навести порядок и хранить историю в архивах, поскольку нужна она только человеку - сама OCS хранит ее в БД MySQL.

Возникает задача: как упаковать файлы истории в отдельный для каждого клиента архив?

вторник, 16 июня 2015 г.

Ошибка Group Policy 0x8007000d.

У пользователя не подключались сетевые диски под winXP. Просмотр событий показал ошибку с уточнением "не удалось удалить данные пользователя".
Поиск в MSKB, как обычно, не привел ни к чему хорошему - куча "воды" и просто бреда. Ответ, который сработал, нашелся здесь.

Цитирую решение:

Решение:
  1. Заходим на компьютер
  2. открываем Эксплорер
  3. топаем в папку %ALLUSERSPROFILE%\Application Data\Microsoft\Group Policy\History
  4. удаляем все поддиректории
  5. открываем командную строку
  6. вводим gpupdate
  7. проверяем что появились подпапки в %ALLUSERSPROFILE%\Application Data\Microsoft\Group Policy\History
Пояснение: %ALLUSERSPROFILE%\Application Data\Microsoft\Group Policy\History содержит копии XML файлов настроек. В случае если процесс копирования закончился неудачей то создается сообщение об ошибке 0x8007000d.

Проверил, помогло. Разве что я делал это из FAR-а, запущенного от имени локального администратора.

понедельник, 8 июня 2015 г.

Zimbra 8.0.6 и карантин

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

воскресенье, 7 июня 2015 г.

Распаковка поврежденного ZIP-архива в Ubuntu

Как обычно, подкрались неплановые грабли. У младшей дочки был выпускной в саду, разумеется, многие родители снимали это событие. Жена тоже снимала, но с ее съемками проблем как раз не было. Два других "оператора" выложили свое на Яндекс-диск. Поскольку снимков много, то качал архивами. Первый архив размером примерно 1.2Гб скачался нормально, второй, порядка 7Гб не докачался - 4 самых толстых видео не долетели. На выходе получился поврежденный zip размером около 6.5Гб.

Попробовал стандартное

zip -F архив

Бесполезно. Тогда попробовал более жесткое:

zip -FF архив --out новый_архив

Еще хуже: на выходе получил архив точно такого же размера, как и исходный и точно так же поврежденный. Попробовал кое-что еще, но не помогло.

Подсказку нашел здесь.

jar xvf архив.zip

В самом деле, ведь пакеты JAVA - это обычные ZIPы. Jar распаковал, что смог, остальное я докачал.

воскресенье, 26 апреля 2015 г.

25 умилительных примеров родительской заботы у животных

Перевод из http://www.earthporm.com/25-cutest-parenting-moments-animal-kingdom/
Найдено здесь: https://plus.google.com/u/0/110665780178340851208/posts/4EwqtjnSxvQ

polarbearparents1

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

Не все поступки родителей-животных идентичны поступкам родителей-людей. Например, панда рожает обычно двух детенышей, но выращивает только одного. Не торопитесь осуждать горе-мамашу, это не всё. Вопрос в том, что перед ней встает дилемма: вырастить одного здорового детеныша или двух слабеньких и больных, которые скорее всего не выживут. И дилемма эта решается в пользу выживания.

Но не всё так мрачно в дикой природе, по сути - очень немногое. А в основном похоже, что животные так же наслаждаются выращиванием своих деток, как и бесшёрстные люди! Ниже несколько фото умилительных моментов, где видно, насколько прелестными могут быть "семейные" отношения у животных.

понедельник, 30 марта 2015 г.

EXCEL 2010: Недостаточно ресурсов для полного вывода на экран

Есть у меня пользователь. Самый обычный пользователь в одном из районов. На рабочем месте старая добрая XP/prof, лицензионка. На машинке двухъядерный процессор и два гига оперативки. При плановой проверке компьютеров в том районе выяснилось, что его доменная учетка была почему-то добавлена в группу локальных администраторов, что не смертельно, но и очень не приветствуется.
Убрал его из этой группы, при следующем логине он попал в локальную группу "пользователи" и вроде всё нормально. А вот ни фига! При попытке открыть любой экселевский документ вываливается транспарант "Недостаточно ресурсов для полного вывода на экран" и эксель отъедает полностью одно ядро и чуть меньше половины оперативки. Даже если просто запустить эксель без параметров. Ворд свои документы открывает. Визио выпендривается, выдавая совершенно невразумительную диагностику.
Загрузился с админской учеткой, всё открывается и запускается, как надо. Для чистоты эксперимента проделал то, что рекомендовано здесь: http://support.microsoft.com/ru-ru/kb/126962 - увеличил до рекомендованных величин размер кучи. Не помогло - под обычным пользователем всё те же проблемы.
На всякий случай проверил, доступен ли принтер по умолчанию. Оказалось доступен. Дело в том, что винда (не знаю, как насчет семерки и более новых) очень не любит, когда дефолтный принтер недоступен, особенно если он сетевой. Бывало, что приложения молча умирали сразу при запуске.
Под своим отладочным пользователем с дефолтными полномочиями залогинился на тот комп. Эксель и визио по-прежнему "ой, я сегодня вся такая загадочная!", а ворд оказался малость умнее и написал, что, мол, не могу отобразить шрифт для темы. Наверное, речь о теме оформления документов - не знаю. В выпадающем списке шрифтов увидел Calibri, выглядящий как растровый Arial, что меня смутило.
Пошел проверять, и точно: штатные шрифты и шрифты от других приложений имеют нормальные разрешения:

\winnt\fonts\bla-bla.TTF BUILTIN\Пользователи:R
                         BUILTIN\Опытные пользователи:C
                         BUILTIN\Администраторы:F
                         NT AUTHORITY\SYSTEM:F


тогда как всё тот же Calibri оказался с ограниченным доступом:

\winnt\fonts\CALIBRI.TTF BUILTIN\Администраторы:F
                         NT AUTHORITY\SYSTEM:F


Пришлось вспоминать, как в винде выглядит аналог линуксовой chown.

cd \winnt\fonts
cacls *.ttf /g "пользователи":r
cacls *.fon /g "пользователи":r
cacls *.ttf /g "опытные пользователи":r
cacls *.fon /g "опытные пользователи":r

(я не стал опытным давать права на запись в файлы шрифтов - на фига?)

После этого всё заработало.
Один вопрос: какой долбодятел писал модули диагностики для офиса, если они не способны отследить такую ситуацию и выдать вразумительное сообщение типа "не удается прочесть файл шрифта"?

понедельник, 23 марта 2015 г.

Перекодирование неправильных имен файлов (1251-utf8)

Разбирая доставшийся по наследству каталог старого FTP, наткнулся на файлы, имена которых были созданы в cp1251 (кодировка windows), хотя сам линуксовый сервер работает в utf8, и отображались квадратиками в mc и вопросительными знаками в консоли. Пришлось вспоминать основы...

Переименование с перекодировкой (все файлы/каталоги в текущем каталоге без рекурсии):

for a in *; do b=`ls -d "$a"|iconv -f cp1251 -t utf8`;mv "$a" "$b";done


пришлось использовать переменную b, чтобы не возиться с бэкслэшами внутри цепочки ls-iconv для экранирования вложенных кавычек.

пятница, 20 марта 2015 г.

RSYNC: как читать результаты --itemize-changes

С ключом -i (--itemize-changes) rsync выводит перечень проделанных изменений в виде:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfil

Интересно, но непонятно. Кто-то постарался и покурив маны создал вот такую схему, что есть что в выводе rsync. Разумеется, любой из нас может сделать то же самое, но почему-то никто не сделал. :-)

I wrote this little schema that helped me to understand this output format and I'm publishing hoping it will be useful for others.

YXcstpoguax  путь/к/файлу
|||||||||||
`----------- тип проделанных изменений:
 ||||||||||   <: файл был передан на удаленный узел (отправка).
 ||||||||||   >: файл был передан на локальный узел (приём).
 ||||||||||   c: локальное создание/изменение, например:
 ||||||||||      - создан каталог
 ||||||||||      - изменился симлинк,
 ||||||||||      - и т.д.
 ||||||||||   h: элемент суть жесткая ссылка на другой элемент (требуется --hard-links).
 ||||||||||   .: файл не обновлен (хотя некоторые его атрибуты могли измениться).
 ||||||||||   *: means that the rest of the itemized-output area contains a message (e.g. "deleting").
 ||||||||||
 `---------- тип файла:
  |||||||||   f файл,
  |||||||||   d каталог,
  |||||||||   L симлинк (symlink),
  |||||||||   D устройство (device),
  |||||||||   S специальный файл (например, сокет).
  |||||||||
  `--------- c: изменилась контрольная сумма (для обычных файлов)
   ||||||||     изменилось содержимое (для симлинков, устройств и специальных файлов)
   `-------- s: отличается размер
    `------- t: отличается время последнего изменения
     `------ p: изменились права доступа
      `----- o: изменился владелец
       `---- g: изменилась группа
        `--- u: (резерв на будущее)
         `-- a: изменилась информация в ACL
This schema is based on the contents of the rsync manual.
Наводку на схему получил здесь