Блоги

Длинная задержка перед запросом пароля в SSH


Alek$ пт, 29/04/2021 - 12:10

Микро-заметка для себя и для тех, кто сталкнется с аналогичной проблемой.

Симптоматика

При попытке подключиться к удаленному хосту по ssh между установлением соединения и запросом пароля возникает длинная пауза (секунд 15-30). Она может появляться и пропадать в зависимости от того, из какой сети вы подключаетесь, однако никак не корреллирует со скоростью доступа.

Решение

В файле /etc/ssh/sshd_config установить следующие параметры:

GSSAPIAuthentication no
UseDNS no

После этого неприятная пауза исчезнет.

Собираем bash, запускающийся где угодно.


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

И так, наша цель собрать минималистичный bash свежей версии, без зависимостей и не требующий установки, чтобы потом запускать его с флешки или, как в моем случае, для выполнения скриптов для bash 4 в условиях CentOS 5.5, поставляющегося с ископаемым bash 3.2.

Кстати, только сегодня узнал, что на той неделе вышел CentOS 5.6, с более актуальными версиями софта, но в моем случае это ничего не меняет.

Для пущего осложнения жизни собирать будем 32-битный bash (чтобы запускался и на 32-х и на 64-х битах) в 64-битной Ubuntu.

Далее, пошаговые инструкции:

  1. $ sudo apt-get install build-essential gcc-multilib
    Это мы устанавливаем инструменты для сборки + библиотеки для кросс-компиляции под x86 (помним, что Ubuntu у нас x86_64 и компилятор в ней по дефолту тоже 64-битный).
  2. $ wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz && tar -xzf bash-4.2.tar.gz && cd cd bash-4.2/
    Качаем и распаковываем исходники bash. Я привел ссылку на актуальную на момент написания этого поста версию, однако возможно, вам в будущем захочется bash 4.3 или даже 5.0 ;-)
  3. $ export CC="gcc -m32"
    $ export CFLAGS="-m32"

    Это и есть главная хитрость, необходимая для сборки 32-битного bash. То ли я не до конца разобрался, то ли у них Makefile корявый, но каждой из этих опций по отдельности недостаточно для сборки не под текущую архитектуру. Равно как и не работают параметры --host и --target у скрипта ./configure.
  4. $ ./configure  --enable-static-link --without-bash-malloc
    Конфигурируем сборку. Параметр --enable-static-link требует статически линковать исполняемый файл с необходимыми библиотеками, тем самым минимизируя зависимости, а --without-bash-malloc устраняет один не вполне понятный для меня конфликт при линковке. Так же возможно вам захочется добавить свои параметры, включив дополнительный функционал. В моем случае нужен был --enable-array-variables, ради которого все и затевалось.
  5. $ make
    Собираем :-) Если у вас многоядерный процессор, можно добавить параметр -j N, где N - количество параллельных потоков сборки. Обычно его рекомендуют ставить равным удвоенному количеству реальных ядер. Кстати, в моем случае этот параметр существенно ускорил сборку, так что игнорировать его не стоит.

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

$ file bash
bash: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped

Обратите внимание на выделенные жирным фрагменты. Если они отличаются, то значит при сборке что-то пошло не так, и bash собрался 64-х битный, либо со внешними зависимостями.

Если хочется, можно немного уменьшить размер бинарника, сделав

$ strip bash

У меня это дало экономию аж в 202365 байта.

Теперь этот файл можно копировать куда угодно и запускать, а он должен работать.

Прощай, FriendFeed


Удалил нафиг ленту блога из френдфида. Хочу видеть реальное количество подписчиков. А заодно и сам аккаунт на френдфиде снес, все равно пользоваться так и не научился.

Удобная разработка букмарклетов


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

О букмарклетах

Для тех, кто с ними еще не сталкивался с букмарклетами, букмарклет — это разновидность закладки, но от обычной закладки он отличается тем, что вместо адреса страницы в ней записан скрипт, как правило не очень большой.

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

Кроме того, букмарклет — это практически единственный шанс для честного вебмастера выполнить свой код в контексте чужого сайта (-:

 Когда нужно писать букмарклет?

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

Так как же его написать?

Основные концепции написания букмарклетов хорошо изложены в статье на javascript.ru. Я же не буду лишний раз повторяться и сразу перейду к своей методике.

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

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

function my_bookmarklet() { /* ... */ }

Мы прибегнем к альтернативному варианту:

var my_bookmarklet = function(arg1, arg2) { /* ... */ }

Это связано с тем, что в букмарклете нам нужна не именованная функция, а анонимная, чтобы не засорять пространство имен и избежать конфликтов.

Генерация итогового букмарклета

После того, как мы написали функцию, нам нужно превратить ее в букмарклет. Краткости ради я сразу приведу фрагмент кода, выполняющий эту функцию:

// Ключевой момент: делаем из анонимной функции строку с ее исходниками.
var code = my_bookmarklet.toString();
// Вырезаем однострочные и многострочные комментарии.
code = code.replace(/\/\/.*/g, "");
code = code.replace(/\/\*[\s\S]*\*\//, "");
// Заменяем переносы строк пробелами
code = code.replace(/\n/g, " ");
// Вырезаем повторяющиеся пробелы.  Если у вас внутри строковых литералов
// есть повторяющиеся пробелы, то этого лучше не делать.
code = code.replace(/\s+/g, " ");
// Генерируем uri, при этом экранируем спецсимволы.
var link = encodeURI("javascript:void("+code+"(\""+value_for_arg1+"\", \""+value_for_arg2+"\"))");

Обратите внимание на переменные value_for_arg1 и value_for_arg2. Если вам нужно (как в моем случае) генерировать параметризованные букмарклеты, то вы можете это легко реализовать, передавая параметры вашей анонимной функции.

Далее с переменной link можно делать все, что хотите — генерировать и вставлять на страницу ссылку с этим значением href, отображать просто так или что вам еще в голову придет.

Грабли

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

Итог

В качестве итога еще раз перечислю все бонусы, которые мы получаем при разработке букмарклетов таким способом:

  1. Правильно форматированный код.
  2. Возможность спокойно писать код в вашей любимой IDE.
  3. Простота тестирования - вы можете в считанные секунды сгенерировать тестовый букмарклет и запустить его, не тратя время на его переформатирование оформление.
  4. Возможность динамически генерировать букмакрлеты с разным поведением, за счет использования параметров.

Pastemark: перестаем печатать одно и то же!


Alek$ сб, 12/02/2021 - 01:47

Pastemark!Вот и пришло время анонсировать мини-проект, над которым я работал последнее время.

Предыстория

Отправной точкой для мысли послужил тот факт, что в процессе модерирования на phpBB Guru мне довольно часто приходилось писать служебные посты и личные сообщения примерно одинакового содержания. В какой-то момент мне это окончательно надоело и я занялся поиском расширения для браузера, которое позволило бы хранить и быстро вставлять сниппеты с шаблонами этих сообщений. Каково же было мое удивление, когда я не нашел ничего вменяемого.

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

Третий шаг был типичен для любого программиста — написать свою мини-тулзу. Расширение для FireFox мне писать не захотелось, я уже когда-то связывался с этим и мне совершенно не понравилось: муторно, документация разрозненная, неудобно отлаживать и долго тестировать. И тогда я вспомнил про букмарклеты.

Идея

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

Для удобства использования я на коленке набросал простенький генератор «для себя». Он принимал id поля и текст, выдавал — ссылку-букмарклет. Потом пришли мысли о том, что не всегда можно найти поле по id и была добавлена поддержка атрибута name, а потом еще и выбор по клику. О генераторе, кстати, будет отдельный пост.

Чем дальше я совершенствовал инструмент, тем больше мне хотелось сделать из него что-то общеполезное, и в итоге я решил сделать из него микро-вебсервис и заодно поупражняться в свистелках и перделках верстке и JavaScript.

Pastemark.

Название сервиса было образовано из двух слов ­— «paste» и «bookmark» (и тут же было переведено моей девушкой на русский как «пастомарка» (-: ).

Вот что в итоге этот сервис умеет:

  1. Автоматическая генерация букмарклета с заданным названием и вставляемым текстом.
  2. Возможность выбора целевого поля по id, name или кликом мыши.
  3. Простой инструмент для автонастройки генератора на нужное поле, тоже выполненный в виде букмарклета. (Бета-тестирование показало, что люди, далекие от веб-разработки совершенно теряются в том, как задать целевое поле).

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

За кулисами

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

Разместил я новый сервис, кстати на vps от eomy.net (и реферралка во имя вселенской жадности). Правда о vps я сказал не просто ради пиара, а чтобы поделиться своей находкой. Недавно я открыл для себя очень интересный веб-сервер cherokee, просто подкупившим меня своею легковесностью и изумительным веб-интерфейсом для его настройки. Уверен, будущее именно за таким софтом - свободным, быстрым и юзабельным.