Заметки с тегом «osx»

Исключаем node_modules из архивов Time Machine

Во время активной разработки проекта файлы в папке node_modules могут часто меняться. Архивировать их нет ни какого резона, так как всегда можно восстановить из npm. Чтобы пройтись по всем проектам и исключить эти папки, можно воспользоваться следующей комбинацией команд:

find $(pwd) -maxdepth 3 -type d -name 'node_modules' | xargs -n 1 tmutil addexclusion -p

Все исключённые папки появятся в настройках Time Machine, откуда их можно будет при необходимости удалить.

Оставте свой комментарий

Как удалить произвольную копию диска в Time Machine

Для управления Time Machine из командной строки существует утилита tmutil . Нас интересуют методы получения списка бэкапов и удаления выбранного бэкапа.

Чтобы получить список бэкапов, выполним команду:


tmutil listbackups

Теперь, зная путь до конкретного архива, его можно удалить командой


tmutil delete /Volumes/Backup/Backups.backupdb/Slim/2016-10-01-031248

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


tmutil listbackups | grep '2016-0[4-9]' | sort -r | xargs -n 1 sudo tmutil delete

Эта последовательность команд вначале получает список всех архивов. Потом оставляет в списке только архивы с апреля по сентябрь. Сортирует список от новых к старым, чтобы было меньше операций и процесс шёл быстрее. А затем удаляет их один за одним.

Оставте свой комментарий

Блокируем brute force атаки по SSH

Для решения этой задачи я использую скрипт denyhosts . Он периодически проверят указанный лог-файл на предмет записей о неудавшихся подключениях, и заносит IP-адреса в файл hosts.deny. Дальше ssh-демон при очередном подключении ищет IP-адрес в «черном» списке и разрывает связь, если он там есть.

Установка denyhosts

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

sudo python setup.py install

По умолчанию установка будет осуществлена в папку /usr/share/denyhosts. Там же будут пример конфигурационного файла. Копируем его.

cp denyhosts.cfg-dist denyhosts.cfg

Отредактируем denyhosts.cfg


SECURE_LOG = /private/var/log/secure.log
HOSTS_DENY = /etc/hosts.deny
LOCK_FILE = /var/run/denyhosts.pid
DAEMON_LOG = /var/log/denyhosts

Остальные параметры можете задать по своему усмотрению.

Теперь нужно скопировать и отредактировать управляющий скрипт


cp daemon-control-dist daemon-control

Переменные должны быть установлены следующие значения


DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"

Удостоверимся, что этот управляющий скрипт запускается.

chown root daemon-control
chmod 700 daemon-control

До запуска denyhosts нужно создать /etc/hosts.deny

touch /etc/hosts.deny

В целом все готово для запуска denyhosts.

daemon-control start

Если до этого вас уже недавно атаковали, то адреса злоумышленников будут тут же собраны и добавлены в hosts.deny.

Остановить denyhosts можно командой

daemon-control stop

В статье denyhosts on Mac OS X я нашел еще несколько полезных трюков.

Запуск при старте системы

В Mac OS X запуском различных программ и скриптов при старте системы занимается launchd . Проблема в том, что он не очень хорошо работает со скриптами, запускающими демонов. Launchd отслеживает момент, когда скрипт завершает свою работу и запускает его снова.

Модифицируем метод start управляющего скрипта daemon-control


def start(*args):
    cmd = "%s --daemon " % DENYHOSTS_BIN
    if args: cmd += ' '.join(args)

    print "starting DenyHosts:   ", cmd

    while True:
        os.system(cmd)
        time.sleep(5)

        while True:
            pid = getpid()
            if pid >= 0:
                time.sleep(300)
            else:
                break

Теперь его можно использовать в launchd. Создадим файл /Library/LaunchDaemons/net.hosts.deny.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>net.denyhosts</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/share/denyhosts/daemon-control2</string>
      <string>start</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>ServiceDescription</key>
    <string>Lauch denyhosts</string>
  </dict>
</plist>

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

launchctl load /Library/LaunchDaemons/net.hosts.deny.plist

Ротация лог-файлов

Все, что нужно для ротации лог-файлов – это создать файл со следующим содержимым


# logfilename [owner:group]   mode count size when  flags [/pid_file] [sig_num]
/var/log/denyhosts            640   5     *  $D0     BJ  /var/run/denyhosts.pid 15
#
Комментарии к заметке: 7

Установка и настройка git-репозитория на Mac OS X 10.6

Переустановка системы на домашнем сервере подтолкнула написать еще одну подробную инструкцию по настройке git-репозитория на Mac OS X 10.6 (Snow Leopard)

Установка и настройка gitosis

Предположим, что git-клиент уже установлен. В интернете можно с легкостью найти несколько готовых сборок. Он нам понадобится, чтобы загрузить gitosis

cd ~/Desktop
mkdir src
git clone git://eagain.net/gitosis.git
cd gitosis
sudo python setup.py install

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

Найдем не используемые uid и gui

sudo dscl . list /Users uid
sudo dscl . list groups gid

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

Создаем группу git


sudo dscl . create groups/git
sudo dscl . create groups/git gid 410

Создаем пользователя git


sudo dscl . create users/git
sudo dscl . create users/git uid 410
sudo dscl . create users/git NFSHomeDirectory /Users/git
sudo dscl . create users/git gid 410
sudo dscl . create users/git UserShell /bin/bash
sudo dscl . create users/git Password '*'

Создаем домашнюю директорию пользователя

sudo mkdir /Users/git
sudo chown git /Users/git
sudo chgrp git /Users/git

Теперь для текущего пользователя на локальном компьютере сгенерируем ssh ключ, если его еще нет. Если ключ есть, то этот шаг пропускаем


ssh-keygen -t rsa

И копируем его на удаленный сервер

scp ~/.ssh/id_rsa.pub repo.local:/tmp/my_key.pub

Если же репозиторий создается на рабочем компьютере, то эта команда немного упрощается

cp ~/.ssh/id_rsa.pub /tmp/my_key.pub

Теперь на сервере выполним инициализацию репозитория

cd /Users/git
sudo -H -u git gitosis-init < /tmp/my_key.pub

При удачном раскладе вы должны увидеть сообщения вроде этих


Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/

Устанавливаем переменную PATH для пользователя git

sudo su git
echo "export PATH=$PATH" > ~/.bashrc
exit

На этом настройку gitosis можно считать законченной. Проверим подключение к репозиторию из вне.

git clone git@repo.local:gitosis-admin.git

Если вы увидите сообщение


Cloning into gitosis-admin...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done.

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

Потенциальные проблемы

Когда я настраивал gitosis в первый раз, то долго бился над тем, что подключение по SSH для пользователя git ни как не устанавливалось. Причина этому, как выяснилось позже, послужило ограничение доступа по SSH только администраторам.

Общий доступ → Удаленный вход

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

Комментарии к заметке: 1

Сжатие файлов на томах HFS+ в Snow Leopard

В Snow Leopard появилась поддержка сжатия на уровне файловой системы — HFS+ compression . Сжатие и распаковка данных происходит полностью прозрачно для всех программ, которые обращаются к таким файлам.

Текущий интерфейс Файндера или какой-либо другой системной программы с GUI не позволяет управлять компрессией. Однако, Apple все же предоставила способ сжимать и распаковывать файлы через командную строку.

У команды ditto в 10.6 появилось несколько опций. Например,

—hfsCompression

When copying files or extracting content from an archive,if the destination is an HFS+ volume that supports compression, all the content will be compressed if appropriate. This is only supported on Mac OS X 10.6 or later, and is only intended to be used in installation and backup scenarios that involve system files. Since files using HFS+ compression are not readable on versions of Mac OS X earlier than 10.6, this flag should not be used when dealing with non-system files or other user-generated content.

Значит, чтобы включить сжатие HFS+, нужно всего лишь выполнить в командной строке

ditto --hfsCompression [src] [dst]

В качестве [src] указывается файл или папка, которая будет сжиматься, а [dst] — путь, где будут размещены сжатые файлы. Команда не заменяет файлы, а создает их сжатые копии в другом месте.

Внимание! Нельзя сжимать файлы, если необходимо подключать этот том в предыдущих версиях Mac OS X. Старые версии не повредят такие файлы, так как они просто не будут доступны для чтения.

На практике выходит не плохая экономия места. Например, сжав папку Developer с загруженной документацией, удалось высвободить около 3Гб (это около 40% от исходного объема) на диске.

Оставте свой комментарий