понедельник, 27 апреля 2009 г.

http://ualinux.com/desktop/
http://www.ulteo.com/home/en/home
http://nethuman.blogspot.com/2009/04/exim4-postmastera-ubuntu-810.html
http://sk1project.org/modules.php?name=Products&product=uniconvertor
http://habrahabr.ru/blogs/linux/58218/
http://www.opennet.ru/opennews/art.shtml?num=21462
http://www.funnestra.org/ubuntu/intrepid/
https://launchpad.net/ubuntu/+source/qucs
http://it-open.ru/srv

среда, 22 апреля 2009 г.

...

http://contact.meta.ua/users/evgeniya-ryabchenko-1152778/ 66-086-5654

Делаем свой дистрибутив

C помощью Remastersys можно сделать две вещи:

1. Полный бекап своей системы, включая персональные данные,и создать его в виде LiveCD или DVD для последующей инсталляции.
2. Сделать свой дистрибутив на основе Ubuntu для себя или поделиться им с кем-нибудь.


Установка Remastersys в Ubuntu

Добавляем репозиторий в /etc/apt/sources.list

sudo gedit /etc/apt/sources.list

и вносим следующую строчку:

# Remastersys
deb http://www.remastersys.klikit-linux.com/repository remastersys/

Сохраняем файл.

Обновляем source list

sudo apt-get update

Устанавливаем

sudo apt-get install remastersys

Дожидаемся полной инсталляции.

Запуск Remastersys

sudo remastersys


Remastersys команды
sudo remastersys backup|clean|dist [cdfs|iso] [filename.iso]

Remastersys примеры

1) создаем livecd/dvd бекап нашей системы
sudo remastersys backup

2) создаем livecd/dvd бекап и образ диска custom.iso
sudo remastersys backup custom.iso

3) чистим временные файлы remastersys
sudo remastersys clean

4) создаем дистрибутив livecd/dvd из нашей системы
sudo remastersys dist

5) создаем дистрибутив livecd/dvd только из файловой системы
sudo remastersys dist cdfs

6) создаем дистрибутив с именем custom.iso, если cdfs уже сделали
sudo remastersys dist iso custom.iso

Создание ISO образа
sudo remastersys dist

Эта команда создаст образ iso с называнием customdist.iso в каталоге / home / remastersys .
Опция dist позволяет не включить в образ ваши личные папки (например, / home / user).
Возможно в ходе процесса вам придется вставить установочный диск Ubuntu.

процесс создания образа идет примерно так:

[…]
92.16% done, estimate finish Wed DEC 28 15:31:25 2007
93.39% done, estimate finish Wed DEC 28 15:31:25 2007
94.62% done, estimate finish Wed DEC 28 15:31:24 2007
95.85% done, estimate finish Wed DEC 28 15:31:24 2007
97.08% done, estimate finish Wed DEC 28 15:31:25 2007
98.31% done, estimate finish Wed DEC 28 15:31:25 2007
99.54% done, estimate finish Wed DEC 28 15:31:25 2007
Total translation table size: 2048
Total rockridge attributes bytes: 3950
Total directory bytes: 9094
Path table size(bytes): 54
Max brk space used 0
406890 extents written (794 MB)

В каталоге /home/remastersys/ создастся образ customdist.iso, который можно буде записать на болванку.
Если размер образа более 700Мб, то его можно записать на DVD болванку

Чистим

После того как образ протестирован, записан и он больше не нужен выполняем

sudo remastersys clean

удалятся все временные файлы и образ диска в директории /home/remastersys.

Доменное имя на динамический IP адрес

Регестрируемся на сайте типа dyndns
Ставим демона обновления

apt-get install ddclient

Вам нужно будет ввести логин и пароль для сайта dyndns, имя хоста, с которым нужно связывать ip и имя сетевого интерфейса, на котором этот ip назначен. Это будет имя той сетевой карточки, через которую проходит интернет,например eth0 или ppp0.

Советы по Linux

1. Как быстро получить информацию о системе?

Быстро получить информацию о системе можно используя команду procinfo. Если этого недостаточно - смотрите файловую систему /proc.
Например: /proc/interrupts, /proc/cpuinfo...

2. Еще один способ получить полезную информацию о системе

Еще один способ получить полезную информацию о системе - команда vmstat. Она выводит информацию использовании памяти, процессора, областях swap и т.п.
Команда free выдает информацию о памяти и swap.

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

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

4. Нужно посмотреть параметры и возможные опции для модуля ядра Linux?

Воспользуйтесь командой modinfo. Например, Информация о авторе:
modinfo -a модуль
Список возможных параметров: modinfo -p модуль

5. Полезная информация о ядре

Левый или правый CTRL, ALT, или SHIFT + scrollock покажут вам полезную информацию о ядре.

6. Как долго ваша система была запущена?

Чтобы увидеть, как долго ваша система была запущена, наберите uptime.

7. Как посмотреть какие порты открыты?

netstat -a позволит вам увидеть все tcp и udp порты, которые открыты на вашей системе.

8. Нужно узнать какой сокет заняла программа?

lsof -i -U
fuser port_num/tcp
а также:
netstat -pvlA inet

9.Как посмотреть информацию о запущенных процессах?

Обычно используется "ps -aux", и потом "kill <номер процесса>". Так же есть специальные программы - такие, как top, gtop и ktop.

10. Как посмотреть свободное место на диске?

Чтобы посмотреть свободное место на диске, используйте команду df. Так же в KDE есть программа kdf (KDiskFree).

11. Как узнать размер всех директорий в данном каталоге?

Чтобы узнать размер всех директорий в данном каталоге, выполните команду:

find . -maxdepth 1 -type d -print | xargs du -sk | sort -rn

12. Как разбить один большой файл на несколько маленьких?

Чтобы разбить один большой файл на несколько маленьких используйте команду:

split --bytes=SIZE filename

13. Как добавить конфигурации по умолчанию для программ?

Если вы хотите добавить конфигурации по умолчанию для своих программ (которые размещаются в каждой домашней директории), копируйте эти конфигурационные файлы в /etc/skel. Каждый раз, когда вы добавляете нового пользователя, эти файлы будут скопированы в домашние директории пользователей.

14. Как убрать возможность перезагрузки по нажатию клавиш CTRL-ALT-DEL?

Убрать возможность перезагрузки по нажатию клавиш CTRL-ALT-DEL можно закомментировав строку

ca::ctrlaltdel:/sbin/shutdown -t5 -rf now

в файле /etc/inittab.

15. Быстрый метод завершения перезапускаемого(respawning) процесса?

Очень быстрый метод завершения перезапускаемого(respawning) процесса в вашем /etc/inittab - это переключение уровней исполнения. Например, если вы имеете строку:

1:1235:respawn:/usr/sbin/mgetty /dev/ttyS1

переключение на уровень 4 остановит перезапускаемый процесс.

16. Как ограничить потребление ресурсов системы пользователями?

Если вы запустили большую систему с большим количеством пользователей, может быть очень важно ограничить потребление ресурсов системы пользователями. Вы можете контролировать эти ограничения с помощью модуля PAM и файла /etc/pam.d/limits.conf. Большинство современных дистрибутивов используют PAM для аутентификации. Пример ограничений для группы users sample of limits for the users group.

@users hard core 0

@users hard nproc 50

@users hard rss 5000

Это не позволяет создавать файлы core, ограничивает пользователя до 50 процессов и по использованию памяти до 5МБ

17. Как сделать дамп N-консоли?

Команда cat /dev/vcsN сбрасывает дамп N-консоли.

18. Как запретить вход всех пользователей в систему?

Чтобы запретить вход всех пользователей в систему (кроме root) без перезагрузки создайте файл /etc/nologin. Содержимое этого файла будет отображаться когда пользователь попытается войти в систему.

19. Ограничение на выполнение команды su

Чтобы разрешить определенным пользователям делать su, что лучше чем всем по умолчанию, редактируйте /etc/login.defs и установите строку SU_WHEEL_ONLY в yes. Затем вам нужно добавить пользователей, которым нужно делать su в группу 0, что делается редактированием файла /etc/groups.

20. Как примонтировать директорию из одной части файловой системы в другую?

В linux 2.4.x ядрах:

mount --bind какую_директорию_монтировать куда_монтировать

21. Как установить точное время?

Отличный способ установить на машине точное время - использовать каманду ntpdate:

ntpdate

Конечно, нужно иметь установленный пакет ntp и возможность соединения с сервером NTP. Вместо лучше использовать ip-адрес, чтобы избежать преобразования доменного имени в ip-адрес.

22. Как установить время CMOS?

Чтобы установить время CMOS системному используйте hwclock --systohc, а hwclock --hctosys - установит системное время, как время CMOS clock.

23. Как быстро скомпилировать ядро

Самый простой способ скомпилировать ядро это выполнить все команды make на одной строке набрав:

make dep clean bzImage modules modules_install

Если вы просто пропатчили свое ядро тогда просто сделайте:

make oldconfig dep clean bzImage modules modules_install.

24. System.map

Вешь, о которой иногда забывают упомянуть, когда вы обновляете свое ядро - это файл System.map (обычно располагающийся в каталоге /boot), который не соответствует новому ядру. После перезагрузки вы увидите сообщения о некорректной версии ядра. После построения нового ядра не забудьте скопировать новый файл System.map из каталога /usr/src/linux в загрузочный каталог вашей системы (/boot).

25. Как увидеть сообщения выдаваемы ядром?

Увидеть сообщения, выдаваемые ядром на экран при загрузке системы можно набрав команду dmesg.

26. Как посмотреть вывод команды и одновременно записать его в файл?

Посмотреть вывод команды и одновременно записать его в файл можно с помощью команды:

tee $ls | tee logfile.txt

27. Как запретить хранитель экрана в текстовом режиме?

Запретить хранитель экрана в текстовом режиме - напечатайте setterm -blank 0.

28.Средство для более быстрого поиска файлов, чем find

Средство для более быстрого поиска файлов, чем find - команда locate, которая использует базу данных для поиска. Для обновления этой базы часто используется cron. Или вручную - updatedb.

29. Список всех исполняемых файлов в системе, которые присутствуют в вашем $PATH?

Нажмите TAB + scroll-lock или еще проще - два нажатия на клавишу TAB. Результат один и тот же.

30. Как отключить сигнал "beep" в течение автоматического завершения командной строки?

Добавьте либо в ~/.inputrc или в /etc/inputrc для визуального звонка:

set bell-style visible

совершенно без сигнала:

set bell-style none

31. Как послать данные на желаемый терминал?

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

tail -f /var/log/messages > /dev/tty12

Для посылки любых сообщений на tty12.

32. Циклическое переключение через все доступные консоли.

Многие клавиатурные раскладки позволяют циклическое переключение через все доступные консоли используя Alt-RightArrow и Alt-LeftArrow.

33. Как выполнить родную команду системы, если используются алиасы?

Часто используете альясы shell (например, прописанные в ~/.bashrc), но иногда необходимо выполнить родную команду системы? Добавьте обратный слэш перед командой, это игнорирует псевдоним shell.

34. Как найти все файлы в каталоге, которые содержат строку?

Найти все файлы в каталоге, которые содержат строку:

find . -type f -print | xargs grep -li "search string"

35. Как сделать чтобы программа ожидала нажатия какой-либо клавиши пользователем?

При написании скриптов shell часто возникает необходимость того, чтобы в процессе выполнения программа ожидала нажатия какой-либо клавиши пользователем. Это можно сделать таким способом:

stty raw; dd if=$(tty) of=/dev/null bs=1 count=1; stty -raw

36.Как перенаправить стандартный вывод и поток ошибок в один и тот же файл?

Чтобы перенаправить стандартный вывод и поток ошибок в один и тот же файл, используйте `&>'.

37. Как сохрать man-страницы в текстовый файл?

Самый простой способ сохранения man-страницы в текстовый файл - " man name | col -b > name.txt".

38. Все символы в консоли стали нечитаемыми

Если все символы в консоли стали нечитаемыми, наберите:

"echo -ne "\017","stty sane" или просто "reset".

39. Как перевести имена файлов в директории в нижний регистр?

Самый простой способ перевода всех имен файлов из директории в нижний регистр:

"for x in *; do mv $x `echo $x | tr [A-Z] [a-z]`; done".

40. Как быстро переименовать файл?

Чтобы быстро переименовать файл, используйте команду:

"mv /usr/local/bin/{старое_имя,новое_имя}".

41. Как удалить всю директорию без лишних запросов?

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

rm -rf имя_директории

42. Как создать сразу несколько директорий?

Создание сразу нескольких директорий - "mkdir -p dir1/dir2/dir3".

43. Как правильно выключить компьютер?

Правильное выключение компьютера - команда "shutdown -h now".

Перезагрузка - "shutdown -r now" или просто "init 5".

44. Как передать весь вывод одной команды на вход другой команде?

Чтобы передать весь вывод одной команды на вход другой команде, используется символ "|".

Таким образом можно делать сложные конструкции (например, "ls | sort -r | less").

45. Как следить за постоянно изменяющимися файлами?

Чтобы следить за постоянно изменяющимися файлами (например, за системными логами), используйте команду tail.

Пример: "tail -15 /var/log/syslog" - постоянно показывает последние 15 строк.

46. Как следить за списком файлов в реальном времени?

Слежение за списком файлов в реальном времени - "watch -n 0 ls -l".

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

47. Как искать текст в файлах?

Для поиска текста в файлах используется команда - "grep "ваш текст" /where/to/search".

Если при поиске не нужно учитывать регистр - "grep -i "ваш текст" /where/to/search"

48. Как заменить одно слово на другое во многих файлах?

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

perl -pi -e 's/oneword/anotherword/g' *.
Если нужно сделать это же с одним файлом, поставьте его имя вместо " * ".

49. Как перейти из графического режима в текстовую консоль?

Чтобы перейти из графического режима в текстовую консоль, нажмите Ctrl+Alt+F1. (Ctrl+Alt+F2 - на вторую консоль, Ctrl+Alt+F3 - на третью консоль, etc). Для того, чтобы вернуться обратно в Иксы, обычно используется комбинация клавиш Alt+F7.

50. Как увидеть под Linux другой подключенный жесткий диск?

Чтобы увидеть под Linux другой подключенный жесткий диск, надо примонтировать (командой mount) разделы, которые на новом винчестере есть. Для этого надо определить, каким винчестер стоит: hdb, hdc или hdd. Для этого нужно всего лишь сообразить, как он подключен: primary slave - это hdb, secondary master - это hdc, secondary slave - это hdd. Теперь надо просмотреть, какие диски на винте есть. Для этого запускаем cfdisk для того винта, который мы определили на предыдущем шаге, например, для hdb: cfdisk /dev/hdb. Глядим, какие разделы есть. Например есть FAT32 (или он еще обозначается как WIN95) диск /dev/hdb1. Мы хотим его подключить скажем к каталогу /mnt/disk. Тогда: mount -t vfat /dev/hdb1 /mnt/disk. Здесь: параметр "-t" указывает тип файловой системы, в нашем случае это vfat, что соответствует fat32.

51. Работа с CD/R и CD/RW.

Стираем так: cdrecord -v blank=fast(или all) dev=<Ваш девайс>.

Образ делаем так: mkisofs -r -J -o <имя_файла_образа.iso> <то_чего_в_образ_загоняем>

Пишем так: cdrecord -v -eject speed=8 dev=<Ваш девайс> file.iso.

Если надо мультисессионный диск, то добавляем -multi.

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

52. Запись CD диска

Команды cdrecord, полезные при записи CDROM:

mkisofs -V "volume_ID" -D -l -L -N -J -R -v -o cdrom.iso директория

cdrecord -dev=0,1,0 -speed=4 -v cdrom.iso

Для подключения IDE накопителя добавить в linux lilo append="hdc=ide-scsi"

( hdc - ваш привод?) и включить в ядре поддержку эмуляции SCSI.

-toc -atip -prcap - выдать полную информацию о накопителе.

-scanbus - определить параметры для -dev (можно /proc/scsi/scsi)

-dummy - запись в режие тестирования (без реального прожигания диска).

-fix - исправить недописавшийся диск.

-eject - после записи вытащить CD

-blank=all очистить CR-RW перед записью.

mkisofs -print-size - расчитать сколько потребуется места для записи директории

53. Как смонтировать образ компак-диска?

Смонтировать образ компакт-диска можно таким образом:

#mkdir /mnt/iso

#mount -t iso9660 -o loop cd-image.iso /mnt/iso

(Разумеется, для операции монтирования нужно иметь права root). Теперь каталог /mnt/iso доступен для чтения содержимого образа компакт-диска.

54. Как узнать метку компакт-диска?

Узнать метку компакт-диска можно так:

alias cdlabel='LABEL=`dd if=/dev/cdrom bs=1 count=32 skip=32808 2>/dev/null` && echo $LABEL'

Удобно использовать альяс в инициализационных скриптах shell.
Советы по “железу”

1. Как получить список устройств на шине PCI?

Получить список устройств на шине PCI можно таким образом:

/sbin/lspci

2. Как включить при загрузке клавиши numlock?

Если вы хотите включить все клавиши numlock при загрузке, добавьте следущее в ваши загрузочные скрипты, например в rc.local:

echo -n "Turning on numlock LEDs: "

for tty in /dev/tty[1-6] /dev/tty1[2]; do

setleds -D +num < $tty &

done

echo "done."

3. Как посмотреть информацию полученную от мыши на стандартный вывод?

Если у вас трудности с мышью, mev -i сбросит информацию полученную от мыши на стандартный вывод.

4. Раздражают сигналы спикера вашего компьютера когда вы ошиблись?

Попробуйте выполнить следующую команду bash:

echo -ne '\033[11;0]'

которая устанавливает продолжительность сигнала для консоли равным 0 секунд. Чтобы сделать это автоматически добавьте эти строки в /etc/profile или ваш~/.profile. Подробную информацию о том, как установить частоту и длительность гудка, читайте в Visual bell mini-Howto.

Юмор

- Иду по парку, смотрю 100 баксов лежит! Думаю, ну, повезло, нашла!
Наклоняюсь поднять. Чувствую... нет, зарабатываю!

Идут как то по лесу Василиса Прекрасная и Илья Муромец. И попалась у них на пути береза. Илья Муромец не говоря ни слова, ударил кулаком по березе и дерево отлетело в сторону.
В.П. - А ты можешь также и дуб с дороги убрать?
И.М. - Могу!
В.П. - А сосну?
И.М. - А если соснешь так я весь лес выкорчую.

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

VLAN и Linux

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

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

Самым сложным во всём этом оказалось переключение карточки в транковый режим и настройка нужных VLAN'ов. Однако вдумчивое чтение документации показало что это всё не так уж и сложно, что и будет показано ниже. Будем предполагать что у нас сервер под Debian или одном из его клонов. Транк нужно настроить на интерфейсе eth3 и нас интересуют два VLAN'а: 31 (в нём находится сеть 192.168.31.0/24) и 50 (сеть 192.168.50.0/24).

Для начала установим пакет vlan, который кроме всего прочего содержит утилиту vconfig:

apt-get install vlan

Затем загасим интерфейс eth3 (если вы подключаетесь к серверу через него - придётся вам дойти до сервера и поработать локально:)):

ifdown eth3

После этого закоментируем все настройки для eth3 в /etc/network/interfaces и добавим настройки наших VLAN'ов:

#auto eth3
#iface eth3 inet static
# address 192.168.50.253
# netmask 255.255.255.0
# network 192.168.50.0
# broadcast 192.168.50.255

auto vlan50
iface vlan50 inet static
address 192.168.50.253
netmask 255.255.255.0
network 192.168.50.0
broadcast 192.168.50.255
mtu 1500
vlan_raw_device eth3

auto vlan31
iface vlan31 inet static
address 192.168.31.100
netmask 255.255.255.0
network 192.168.31.0
broadcast 192.168.31.255
mtu 1500
vlan_raw_device eth3

Теперь нужно поднять новые интерфейсы:

ifup vlan31
ifup vlan50

Проверить поднялся ли VLAN можно командой:

ifconfig vlan31

Вывод должен выглядеть примерно вот так:

vlan31 Link encap:Ethernet HWaddr 00:07:E9:0B:28:79
inet addr:192.168.31.100 Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::207:e9ff:fe0b:2879/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9431 errors:0 dropped:0 overruns:0 frame:0
TX packets:34429 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:512370 (500.3 KB) TX bytes:1556858 (1.4 MB)

На самом деле в /etc/network/interafces VLAN'ы настраиваются как обычные сетевые интерфейсы, только имеющие имя vlan<номер_VLAN> и обязательный параметр vlan_raw_device, указывающий на физический интерфейс. Во всём остальном работа с VLAN'ами ничем не отличается от работы с обычными сетевыми интерфейсами. Потому настройку роутинга между ними я оставлю читателю.

Разное

http://blender-empire.ru/ - Журнал по блендеру 3Д
Написание скриптов с графическим интерфейсом GTK - Zenity http://library.gnome.org/users/zenity/stable/zenity-progress-options.html.ru
http://xgu.ru/wiki/DNS-tunneling
http://ubuntologia.ru/
http://wiki.winehq.org/winetricks
http://proxya.ru/
http://simadmin.ru/
http://www.zabbix.com/screenshots.php
http://www.cacti.net/spine_install.php
http://pppstatus.sourceforge.net/graphic/screenshots.html
http://www.f0x.ru/2008/09/usb-ubuntu.html
http://fishki.net/comment.php?id=46562
http://blog.cyphermox.net/2008/10/automatic-mounting-of-samba-shares.html?showComment=1224536280000
http://ulmencave.blogspot.com/2007/05/apache2-ssl-php5-mysql5-ubuntu-feisty.html
http://spo.cnews.ru/news/top/index.shtml?2009/03/11/340321
http://www.itoday.ru/6988.html
http://www.itoday.ru/12920.html

Собираем ядро

sudo aptitude install debhelper gcc make modutils kernel-package libncurses5-dev
Скачаем свежее ядро с http://www.kernel.org/ в архиве tar.bz2
Полученный архив распакуем:
tar --bzip2 -xvf linux-source-2.6.*
Перейдём в созданную директорию с ядром и настроим его
cd linux-source-2.6.* && sudo make menuconfig
В подробности настройки вдаваться не буду, но скажу лишь, что главное правило это «не уверен — не трогай»
Очистим параметры kpkg
sudo make-kpkg clean
Теперь самая длительновыполняемая команда — компилируем
sudo make-kpkg --initrd --revision=myfirstbuild.1.0 kernel_image
,где myfirstbuild.1.0 это произвольное имя сборки
По окончанию сборки ставим образовавшийся пакет
sudo dpkg -i ../linux-image-2.6.*.deb
Самое время перезагрузиться и в меню загрузчика выбрать новое ядро.
Если же оно не загрузилось, всегда можно загрузить предыдущее ядро и грузиться с него.

пятница, 17 апреля 2009 г.

Работа с БАШЕМ

http://www.opennet.ru/docs/RUS/bash_scripting_guide/
http://noteslinux.blogspot.com/2008/07/bash_18.html

OpenSSH - настройка, полезные приемы, секреты и советы по использованию

За последние несколько лет OpenSSH из набора программ для защищенной системы регистрации, выполнения команд на удаленном хосте и передачи файлов с одной машины на другую превратился в швейцарский армейский нож, просто потрясающий своими возможностями. Используете ли вы хотя бы половину из них? В этой статье вы найдете множество полезных советов по настройке, использованию, и всевозможные способы применения ssh в повседневной жизни, как например резервное копирование, копирование файлов, создание туннелей, авторизация и ее ограничение, и еще много всяких вещей которые умеет эта замечательная программа.

Отключение прослушивания IPv6 адресов

По умолчанию sshd(8) слушает как на IPv4 так и на IPv6 адресах. Для того что бы отключить возможность работы по IPv6, необходимо изменить параметр AddressFamily:

AddressFamily inet

Адрес и порт прослушивания

По умолчанию sshd(8) принимает подключения на всех интерфейсах, в чем не всегда есть необходимость. Если не требуется заходить на сервер “из вне”, следует ограничить его работу определенным адресом с помощью параметра ListenAddress:

# ListenAddress 0.0.0.0
ListenAddress 192.168.1.2

Дополнительно через двоеточие можно указать и номер порта. В данном примере используется значение порта, заданное глобально параметром Port.
Ограничение доступа суперпользователя

В большинстве дистрибутивов в целях безопасности доступ суперпользователю по SSH закрыт (PermitRootLogin no), и при попытке зарегистрироваться под root получаем сообщение об ошибке. Для выполнения задач, требующих привилегий администратора, приходится заходить под обычным пользователем и использовать su(1) или sudo(8). Красиво выйти из ситуации поможет директива Match. В качестве аргумента ей передается критерий отбора (User, Group, Host, Address), его значение и параметр, который нужно применить. Для примера разрешим подключение под root только с localhost и из доверенной подсети 192.168.5.0/24:

PermitRootLogin no
Match Host 192.168.5.*,127.0.0.1
PermitRootLogin yes

Контроль неудачных подключений

Следующие две директивы позволяют контролировать неудачные подключения к серверу:

LoginGraceTime 60
MaxStartups 2:50:10

Параметр LoginGraceTime определяет, по истечению какого времени простаивающее подключение будет разорвано (в секундах). Значение по умолчанию 120 явно завышено. Количество параллельных неаутентифицированных подключений к серверу контролируется при помощи MaxStartups. Запись параметра имеет форму “start:rate:full”. В нашем случае она означает отключение с вероятностью 50% при наличии двух неаутентифицированных связей, с линейным ростом вероятности до 100% при достижении 10.
Контроль за подключениями пользователей

Установки в файлах /etc/ssh/sshrc или ~/.ssh/rc позволяют выполнить некоторые действия при регистрации пользователя. Здесь можно использовать любые команды оболочки. Например, отправим администратору на почту уведомление о том, что в систему по SSH зашел пользователь:

# vi /etc/ssh/sshrc
echo $(date) $SSH_CONNECTION $USER $SSH_TTY | mail -s “ssh login” admin@domain.ru

Пример создания резервных копий

Генерируем пару ключей (секретный и публичный):

$ sudo ssh-keygen -t rsa -C ‘remote backup’
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
/home/user/.ssh/id_rsa_backup

Добавляем публичный ключ в список авторизованных ключей на удаленной системе:

$ ssh remotehost “umask 077; cat > .ssh/authorized_keys” < .ssh/id_rsa_backup.pub

Затем редактируем authorized_keys (ключ ‘-t’ следует использовать при запуске программ, требующих для своей работы наличия псевдотерминала):

$ ssh -t remotehost vi .ssh/authorized_keys
from=”192.168.0.*,212.34.XX.YY”,command=”cd /work; tar cvf - ./* | bzip2 -9″,
no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding ssh-rsa AAAA[…]

И запускаем процедуру резервного копирования:

$ ssh -i .ssh/id_rsa_backup remotehost > ~/backup/work-`date +%d%m%Y`.tar.bz2 2>/dev/null

Каталог /work, находящийся на сервере remotehost, будет сохранен в архив ~/backup/work-11052008.tar.bz2.
Используем dump в связке с SSH

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

$ sudo dump -0au -f - /dev/rwd1a | gzip -9 | ssh remotehost ‘dd of=cvs_backup.dump.gz’

Поскольку в dump(8) встроена возможность передавать данные по сети с использованием RSH, существует возможность использования и SSH, поскольку его функциональность аналогична:

$ ssh remotehost touch /home/user/cvs.dump
$ env RSH=`which ssh` sudo -E dump 0f remotehost:/home/user/cvs.dump /cvs

Передача файлов и каталогов

Передать файл, используя SSH, можно одним из следующих способов:

$ cat myfile | ssh remotehost ‘cat > myfile’
$ tar zcf - ~/coding | ssh remotehost ‘cat > coding.tgz’

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

$ scp -r mydir user@host.domain.ru:

Вариант копирования каталога с использованием ssh(1) и tar(1) с локального хоста на удаленный:

$ tar cf - source | ssh remotehost “(cd /target; tar xpf -)”

и с удаленного хоста на локальный:

$ ssh remotehost “tar cf - source” | (cd /target; tar xpf -)

Безопасный способ получения почты

Для безопасного получения почты с помощью fetchmail можно использовать SSH. Для этого в конфигурационном файле ~/.fetchmailrc необходимо указать следующее:

poll localhost with protocol pop3 and port 8110:
preconnect "ssh -f -q -C user@213.167.XX.YY \
-L 8110:213.167.XX.YY:110 sleep 10" password noIdea;

Забираем почту:

$ fetchmail
1 message for user at localhost (8062 octets).
reading message user@localhost.domain.ru:1 of 1 (8062 octets)……. flushed

Почтовый шлюз

Настроим 192.168.1.1 на перенаправление входящей и исходящей почты по шифрованному каналу для клиентов из 192.168.1.0/24 на mail.domain.ru:

$ vi .ssh/config
Host mail
Hostname mail.domain.ru
LocalForward 192.168.1.1:8025 mail.domain.ru:25
LocalForward 192.168.1.1:8110 mail.domain.ru:110
LocalForward 192.168.1.1:8143 mail.domain.ru:143
GatewayPorts yes

Открываем туннель:

$ ssh mail

Выполнение заданной команды после подключения

Параметр ProxyCommand позволяет выполнить произвольную команду. Для примера подключимся через шлюз к файловому серверу, который находится за NAT:

$ vi .ssh/config
Host gateway
HostName ns.domain.ru
Host filesrv
HostName 192.168.5.201
ProxyCommand ssh gateway nc -w 180 %h %p

Подключаемся:

$ ssh filesrv

Мультиплексирование ssh-сессий

Использование параметра ControlMaster позволяет ускорить доступ к удаленному серверу за счет того, что в специальном файле сохраняются все параметры предыдущего сеанса, которые и используются при повторном подключении. Для примера создадим две Host-секции:

$ vi .ssh/config
Host srv1
HostName 213.167.XX.YY
ControlMaster yes
# Здесь %r - имя, %h - хост и %p - порт
ControlPath ~/.ssh/ctl-%r-%h-%p
Host srv1fast
HostName 213.167.XX.YY
ControlMaster no
ControlPath ~/.ssh/ctl-%r-%h-%p

Теперь на сервере srv1 выполняем утилиту uptime(1), логинимся на нем (чтобы создать локальный сокет для второго подключения), переходим на другую консоль и снова запрашиваем статистические счетчики:

ttyp0$ time ssh srv1 uptime
5:55PM up 37 days, 9:19, 1 user, load averages: 0.33, 0.32, 0.33
0m0.77s real 0m0.06s user 0m0.01s system

ttyp0$ ssh srv1
ttyp1$ time ssh srv1fast uptime
5:57PM up 37 days, 9:20, 2 users, load averages: 0.37, 0.34, 0.33
0m0.03s real 0m0.00s user 0m0.01s system

Из примера видно, что при использовании мультиплексирования соединений время выполнения команды uptime(1) на удаленном сервере уменьшилось в 25 раз.
Создание SOCKS-сервера

OpenSSH можно использовать как специальный SOCKS-сервер, который поддерживает более гибкое проксирование, чем простое перенаправление портов. Например, команда:

$ ssh -D1080 user@domain.ru

Создает локальный SOCKS5-сервер, который ждет подключения на localhost:1080. Альтернативный вариант - прописать директиву DynamicForward в .ssh/config:

$ vi .ssh/config
Host proxy
HostName ns.domain.ru
DynamicForward 1080

Подключаемся, введя ssh proxy. Протестировать работу SOCKS5-сервера можно такой командой:

$ echo -n “GET / HTTP/1.0\r\n\r\n” | nc -X 5 -x 127.0.0.1:1080 \
www.domain.ru 80 | head -4
HTTP/1.1 200 OK
Date: Sat, 23 Feb 2008 14:27:43 GMT
Server: Apache
X-Powered-By: PHP/4.4.1

Теперь SOCKS-сервер готов к использованию:

$ tsocks thunderbird

Сажаем пользователей в песочницу

В OpenSSH 4.9 появилась долгожданная поддержка chroot(2) для sshd(8), контролируемая с помощью опции ChrootDirectory. К примеру, заставим подключающегося по sftp пользователя worker переходить в измененный корневой каталог data:

# vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server
Subsystem sftp internal-sftp

Match User worker
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /data

Пример для хостинговых клиентов:

# vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server
Subsystem sftp internal-sftp

Match Group wwwusers
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /var/www/hosting/%u

Теперь зарегистрированные пользователи будут допущены только к “своему” каталогу, при подключении модификатор %u будет заменен именем пользователя. При необходимости можно использовать %h, который соответствует домашнему каталогу юзера.
Скрываем записи о серверах, к которым мы подключались

Некоторые администраторы, возможно, захотят зашифровать все IP и доменные адреса из файла .ssh/known_hosts. Делается это следующим образом:

$ echo ‘HashKnownHosts’ >> ~/.ssh/config
$ ssh-keygen -H -f ~/.ssh/known_hosts
$ head -1 ~/.ssh/known_hosts
+|1|TJ2SaXGqO8uHYeiA92KuNRIKR7M=|GpQB8Qz0tQPqA+nF+ghe37mpcHA= ssh-rsa AAAA[…]

Управляющие последовательности SSH

Управляющие последовательности SSH станут доступны, если в SSH-сессии сначала нажать , затем управляющий символ сеанса (по умолчанию тильда, задается директивой EscapeChar) и специальную клавишу, которая указывает, какую именно функцию следует выполнить.

Допустим, мы с mail.domain.ru зашли на bastion.domain2.ru и решили, что не плохо было бы открыть обратный шифрованный туннель к почтовому серверу для безопасной загрузки сообщений. С помощью комбинации клавиш “~C” можно интерактивно управлять локальным и удаленным форвардингами (ключи ‘-L’ и ‘-R’):

bastion$ ~C
ssh> -R 8110:mail.domain.ru:110
Forwarding port.

Проверяем работу созданного почтового туннеля:

bastion$ telnet localhost 8110
+OK Dovecot ready.

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

bastion$ ~C
ssh> help
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-KR[bind_address:]port Cancel remote forward

Если в ~/.ssh/config установить значение директивы PermitLocalCommand в yes, то мы сможем выполнять команды в локальном шелле, т.е. на хосте, с которого зашли:

ns$ ssh mx
mx$ ~C
ssh> !uptime # команда выполняется на хосте ns
7:02PM up 100 days, 11 mins, 1 user, load averages: 0.13, 0.21, 0.23

mx$ uptime # команда выполняется на хосте mx
7:02PM up 4 days, 7:34, 1 user, load averages: 0.21, 0.23, 0.19

Если на предыдущем узле требуется выполнить сразу несколько команд, то SSH-сессию лучше временно засуспендить (приостановить выполнение программы ssh):

mx$ ~
[1] + Suspended “ssh” “$@”

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

mx$ ~#
The following connections are open:
#0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cfd -1)

А для быстрого завершения SSH-сессии ставим точку:

mx$ ~.
Connection to 213.167.XX.YY closed.

Сокращенный набор

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

$ vi ~/.ssh/config
Host mx
Hostname mx.domain.ru
Port 2022
User admin

Таким образом, достаточно ввести ssh mx, чтобы соединиться с нужным хостом.
Получение доступа к закрытому сервису

Многие администраторы в целях безопасности скрывают свои сервера в демилитаризованной зоне, либо за NAT’ом, и разрешают входящие соединения только с доверенных IP-адресов и по определенными портам. Поэтому доступ ко многим полезным ресурсам получить напрямую нельзя. Это как раз тот случай, когда использование SSH-форвардинга может исправить ситуацию.

$ vi ~/.ssh/config
Host gate
Hostname gate.domain.ru
# Для ускорения соединений включаем мультиплексирование SSH-сессий
ControlMaster auto
ControlPath ~/.ssh/ctl-%r-%h-%p
# Перенаправляем локальный порт на файловый сервер (Win2k3 с поднятым VShell)
LocalForward 8022 192.168.1.101:22

# Подключаясь к localhost:8022, мы будем попадать на файловый сервер
Host fileserver
Hostname localhost
Port 8022
ControlMaster auto
ControlPath ~/.ssh/ctl-%r-%h-%p
HostKeyAlias fileserver

Соединяемся с узлом gate и проверяем возможность подключения к локальному порту 8022:

$ ssh -N -f gate
$ telnet localhost 8022
SSH-2.0-VShell_3_0_4_656 VShell

Теперь можно подключиться к файловому серверу, который находится за NAT’ом, в обход правил файерола, установленных на шлюзе:

$ ssh fileserver
Microsoft Windows [Version 5.2.3790]
C:\Documents and Settings\Username\My Documents>

Ограничение возможностей перебора паролей с помощью Pf

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

# vi /etc/pf.conf
table persist
block in log quick on $ext_if inet from
pass in log on $ext_if inet proto tcp to $ext_if port ssh keep state \
(max-src-conn-rate 5/60, overload flush global)

Данный набор правил инструктирует фильтр пакетов не допускать более 5 одновременных соединений к 22 порту за 60 секунд.
Перенаправление X11-подключений

Для перенаправления X11-подключений следует использовать ключ ‘-Y’:

$ ssh -Y user@domain.com

Причем в конфигурационном файле /etc/ssh/sshd_config параметр X11Forwarding должен быть установлен в “yes”. Если X-сервер запущен на локальной системе, то необходимо включить и X11UseLocalhost.

Спасаем данные в Linux с помощью ddrecovery

«Input/output error (5)» сказала система при копировании файла и заставила погрузиться в неприятные раздумья о новом винчестере и подлом партизане SMART. К счастью все важные данные сохранились в резервных копиях, и всё-же постараться вытащить один файл очень хотелось — 34Гб образ виртуальной машины содержал в себе несколько документов потерять которые было бы неприятно.

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

Первым делом потребовалось скачать утилиту — она идёт в стандартных пакетах Ubuntu(под именем gddrescue), но достаточно старой версии и некоторые полезные возможности не содержит.
По адресу ftp.gnu.org/gnu/ddrescue/ находится релиз 1.10, собирается простым набором «./configure && make && make install» и сразу готов к работе.

Немного теории — утилита ddrscue обладает одной очень полезной особенностью, она ведёт специальный лог, в котором отмечает проблемные\пропущенные места, и при дальнейших запусках уже использует этот файл пробует читать только то, что раньше распознать не удалось. Поэтому процесс восстановления будет идти в несколько этапов, сначала пытаемся максимально быстро распознать большую часть, а потом возвращаемя к проблемным участкам.

Первый проход запускается командой

ddrescue --no-split --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

т.е. отключаем повторные чтения и попытки минимизировать проблемные зоны, указываем откуда и куда копировать и файл лога. Понятно что копировать файл на тот-же диск идея плохая. Исходная файловая система ext3, раздел куда копируется ext2.

Лог восстановления — параметр не обязательный, но при многопроходном варианте нужен, и если в первый проход его создать забыли, то можно использовать --generate-logfile, полученный лог будет больше оптимального, но для дальнейших проходов полностью подойдёт.

В моём случае первый проход занял больше дня и сообщил о следующем
rescued: 22093 MB, errsize: 12264 MB, errors: 3876
картина не самая приятная, но уже что-то, начинаем второй проход.

ddrescue --direct --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

теперь пробуем прочесть диск в режиме прямого доступа и с 2 повторными попытками. Это число можно увеличивать, но в моём случае это только увеличивало время и результатов не приносило. (А вот при копировании CD вполне может дать результат).

Второй проход занял ещё около 15 часов, причём значительно улучшил картину:
rescued: 34292 MB, errsize: 65220 kB, errors: 16659
но попробуем вернуть остатки

ddrescue --retrim --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

в этом режиме очень сильно падает скорость, но восстанавливается то, что предыдущие два прохода не смогли.

Через два часа восстановление прерываю, результат
rescued: 34293 MB, errsize: 64579 kB
понятно что резкого улучшения ждать не стоит. С другой стороны для файлов небольшого размера (10-100мб) именно третий проход давал максимум данных, так что зависит от везения и характера проблем.

Образ был успешно добавлен в VirtualBox, проверен стандартным chkdsk и все необходимые данные скопированы, погибшие 60 мегабайт пришлись на системные файлы. Времени на всё ушло чуть более двух суток, что конечно много, но приемлемо.

Удачного восстановления, и не забывайте делать бекапы, они стоят потерянного времени, но а на крайний случай, ddrescue Вам в помощь