Категории

четверг, 28 августа 2014 г.

Приводим документ к одному типу ident - expand, unexpand и немного про alignment.

user@ubuntu~$ echo -e "    1\n     2" | unexpand -t4 > 1.txt
Получим в 1.txt:
<-->1
<--> 2
user@ubuntu~$ expand -t4 1.txt > 2.txt
Получим в 2.txt:
    1
     2
Получаем некий аналог dos2unix и unix2dos, только для табов и пробелов.
Теперь о применении такого на практике, до недавнего времени я тоже не знал разницу между indentation и alignment. Приведу примеры о чем идет речь.
Это — indentation:
for (int i = 0; i < 10; i++) {
    if (a[i] == 0)
        do_something(i);
}
А вот это — alignment:
int some_variable = 0;
int v1            = 0;
Соль в том, что identation не поплывет в разных редакторах, где размер таба разный, а вот alignment с табами поплывет 100%. Следовательно, если хотим использовать табы, используем только в indentation, но alignment делаем исключительно пробелами. В таком случае использовать expand и unexpand нужно с особой осторожностью, чтобы не задеть aligement.
1. Пора завязывать использовать пробелы вместо табуляции в коде
2. Примиряем любителей пробелов и табов

Инвертируем поведение tail и head

Очень короткая заметка про tail и head. Как известно head и tail работают с началом и концом документа соответственно. Но бывает необходимость получить все строки, кроме, например первых трех, или наоборот кроме последних 3.
Приведу пример работы, вот простой файл:
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
Получим из него все строки, кроме первой:
user@Ubuntu:~$ tail -n+2 /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
А теперь все кроме последних двух:
user@Ubuntu:~$ head -n+3 /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
И живой пример использования, нужно получить из netstat количество соединений сгруппированных по типу, исключив первые 2 строки заголовка:
user@Ubuntu:~$ netstat -ant | tail -n +3 | awk '{print $6}' | sort | uniq -c
      1 CLOSE_WAIT
     34 ESTABLISHED
      8 LISTEN
      2 SYN_SENT
Или для удобства в цикле:
user@Ubuntu:~$ while true; do netstat -ant | tail -n +3 | awk '{print $6}' | sort | uniq -c; echo -----------; sleep 1; done
      1 CLOSE_WAIT
     32 ESTABLISHED
      8 LISTEN
-----------
      1 CLOSE_WAIT
     32 ESTABLISHED
      8 LISTEN
-----------
^C
Остановить цикл можно клавишами Ctrl+c.

среда, 6 августа 2014 г.

Remmina - ошибка "Невозможно подключиться к серверу RDP" при подключении к windows

Перестала подключатся Remmina по RDP, пишет "Невозможно подключиться к серверу RDP".
Решилось все просто, Remmina использует freerdp для работы по протоколу RDP, и все хосты добавляются в файл ~/.freerdp/known_hosts, наподобие как в ssh. Проблема аналогичная как и в ssh - сменился ключ/сертификат - невозможно подключиться к серверу - в ssh нам рекомендуют удалить запись о сервере куда подключаемся из файла known_hosts, аналогично делаем и с freerdp:
user@Ubuntu$ mcedit ~/.freerdp/known_hosts
Формат записей аналогичный - 1 строка - 1 сервер. Удаляем нужную нам запись, сохраняем файл и подключаемся.

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

Ubuntu GRUB2 отключить подтверждение при перезагрузке

В Ubuntu есть проблема - в случае нештатного отключения компьютера (вырубили свет, потом включили) GRUB2 доходит до меню и ждет выбора. Хотелось, чтобы компьютер рестартовал сам при включении света. Как оказалось за это отвечает переменная recordfail, которая по умолчанию выставляется recordfail=1, а после успешной загрузки системы она обнуляется через init.d скрипт /etc/init.d/grub-common.
При загрузке GRUB2 в файле /boot/grub/grub.cfg идет проверка:
if [ ${recordfail} = 1 ]; then
  set timeout=-1
else
  set timeout=0
Таким образом GRUB2 в случае если система была выключена не штатно принудительно выводит меню загрузки и ждет пока администратор в ручную выберет что грузить. Это делается для предотвращения зацикливания загрузки системы, если там что-то серьезно навернулось.
Прямое редактирование /boot/grub/grub.cfg смысла не имеет, т.к. все изменения затрутся, при запуске команды update-grub, поиск по скриптам GRUB2 показал, что в файле /etc/grub.d/00_header есть описание функции recordfail:
function recordfail {
  set recordfail=1
EOF
    FS="$(grub-probe --target=fs "${grubdir}")"
    case "$FS" in
      btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
 cat <<EOF
  # GRUB lacks write support for $FS, so recordfail support is disabled.
EOF
 ;;
      *)
 cat <<EOF
  if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
EOF
    esac
    cat <<EOF
}
Затем ниже проверка значения переменной recordfail:
make_timeout ()
{
    cat << EOF
if [ "\${recordfail}" = 1 ] ; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
else
EOF
Решение проблемы напрашивается сам собой - установить переменную GRUB_RECORDFAIL_TIMEOUT (таймаут при срабатывании recordfail) в конфигурационном файле GRUB2 /etc/default/grub:
GRUB_RECORDFAIL_TIMEOUT=15
После чего выполнить обновление конфигурации командой:
root@Ubuntu# update-grub

1. правильное выключение + GRUB2 отключить подтверждение при перезагрузке
2. recordfail в grub2 [РЕШЕНО]