Памятка пользователям ssh

Памятка пользователям ssh

abstract: В статье описаны продвинутые функций OpenSSH, которые позволяют сильно упростить жизнь системным администраторам и программистам, которые не боятся шелла. В отличие от большинства руководств, которые кроме ключей и -L/D/R опций ничего не описывают, я попытался собрать все интересные фичи и удобства, которые с собой несёт ssh.

Предупреждение: пост очень объёмный, но для удобства использования я решил не резать его на части.

Оглавление:
  • управление ключами
  • копирование файлов через ssh
  • Проброс потоков ввода/вывода
  • Монтирование удалённой FS через ssh
  • Удалённое исполнение кода
  • Алиасы и опции для подключений в .ssh/config
  • Опции по-умолчанию
  • Проброс X-сервера
  • ssh в качестве socks-proxy
  • Проброс портов — прямой и обратный
  • Реверс-сокс-прокси
  • туннелирование L2/L3 трафика
  • Проброс агента авторизации
  • Туннелирование ssh через ssh сквозь недоверенный сервер (с большой вероятностью вы этого не знаете)

Управление ключами


Теория в нескольких словах: ssh может авторизоваться не по паролю, а по ключу. Ключ состоит из открытой и закрытой части. Открытая кладётся в домашний каталог пользователя, «которым» заходят на сервер, закрытая — в домашний каталог пользователя, который идёт на удалённый сервер. Половинки сравниваются (я утрирую) и если всё ок — пускают. Важно: авторизуется не только клиент на сервере, но и сервер по отношению к клиенту (то есть у сервера есть свой собственный ключ). Главной особенностью ключа по сравнению с паролем является то, что его нельзя «украсть», взломав сервер — ключ не передаётся с клиента на сервер, а во время авторизации клиент доказывает серверу, что владеет ключом (та самая криптографическая магия).

Генерация ключа


Свой ключ можно сгенерировать с помощью команды ssh-keygen. Если не задать параметры, то он сохранит всё так, как надо.

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

Сменить пароль на ключ можно с помощью команды ssh-keygen -p.

Структура ключа


(если на вопрос про расположение ответили по-умолчанию).
~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать. Если вы в письмо/чат скопипастите его вместо pub, то нужно генерировать новый ключ. (Я не шучу, примерно 10% людей, которых просишь дать ssh-ключ постят id_rsa, причём из этих десяти процентов мужского пола 100%).

Копирование ключа на сервер


В каталоге пользователя, под которым вы хотите зайти, если создать файл ~/.ssh/authorized_keys и положить туда открытый ключ, то можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе ssh его не примет. В ключе последнее поле — user@machine. Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть поменяно (или даже удалено) без нарушения структуры ключа.

Если вы знаете пароль пользователя, то процесс можно упростить. Команда ssh-copy-id user@server позволяет скопировать ключ не редактируя файлы вручную.

Замечание: Старые руководства по ssh упоминают про authorized_keys2. Причина: была первая версия ssh, потом стала вторая (текущая), для неё сделали свой набор конфигов, всех это очень утомило, и вторая версия уже давным давно переключилась на версии без всяких «2». То есть всегда authorized_keys и не думать о разных версиях.

Если у вас ssh на нестандартном порту, то ssh-copy-id требует особого ухищрения при работе: ssh-copy-id '-p 443 user@server' (внимание на кавычки).

Ключ сервера


Первый раз, когда вы заходите на сервер, ssh вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо несекьюрно).

Если ключ сервера поменялся (например, сервер переустановили), ssh вопит от подделке ключа. Обратите внимание, если сервер не трогали, а ssh вопит, значит вы не на тот сервер ломитесь (например, в сети появился ещё один компьютер с тем же IP, особо этим страдают всякие локальные сети с 192.168.1.1, которых в мире несколько миллионов). Сценарий «злобной man in the middle атаки» маловероятен, чаще просто ошибка с IP, хотя если «всё хорошо», а ключ поменялся — это повод поднять уровень паранойи на пару уровней (а если у вас авторизация по ключу, а сервер вдруг запросил пароль — то паранойю можно включать на 100% и пароль не вводить).

Удалить известный ключ сервера можно командой ssh-keygen -R server. При этом нужно удалить ещё и ключ IP (они хранятся раздельно): ssh-keygen -R 127.0.0.1.

Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:
а) скопировать со старого сервера на новый.
б) сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.

Заметим, если вы сервера клонируете (например, в виртуалках), то ssh-ключи сервера нужно обязательно перегенерировать.

Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.


Копирование файлов


Передача файлов на сервер иногда может утомлять. Помимо возни с sftp и прочими странными вещами, ssh предоставляет нам команду scp, которая осуществляет копирование файла через ssh-сессию.

scp path/myfile user@8.8.8.8:/full/path/to/new/location/ 

Обратно тоже можно:
scp user@8.8.8.8:/full/path/to/file /path/to/put/here 

Fish warning: Не смотря на то, что mc умеет делать соединение по ssh, копировать большие файлы будет очень мучительно, т.к. fish (модуль mc для работы с ssh как с виртуальной fs) работает очень медленно. 100-200кб — предел, дальше начинается испытание терпения. (Я вспомнил свою очень раннюю молодость, когда не зная про scp, я копировал ~5Гб через fish в mc, заняло это чуть больше 12 часов на FastEthernet).

Возможность копировать здорово. Но хочется так, чтобы «сохранить как» — и сразу на сервер. И чтобы в графическом режиме копировать не из специальной программы, а из любой, привычной.

Так тоже можно:

sshfs


Теория: модуль fuse позволяет «экспортировать» запросы к файловой системе из ядра обратно в userspace к соответствующей программе. Это позволяет легко реализовывать «псевдофайловые системы». Например, мы можем предоставить доступ к удалённой файловой системе через ssh так, что все локальные приложения (за малым исключением) не будут ничего подозревать.

Собственно, исключение: O_DIRECT не поддерживается, увы (это проблема не sshfs, это проблема fuse вообще).

Использование: установить пакет sshfs (сам притащит за собой fuse).

Собственно, пример моего скрипта, который монтирует desunote.ru (размещающийся у меня на домашнем комьютере — с него в этой статье показываются картинки) на мой ноут:

#!/bin/bash
sshfs desunote.ru:/var/www/desunote.ru/ /media/desunote.ru -o reconnect


Делаем файл +x, вызываем, идём в любое приложение, говорим сохранить и видим:



Параметры sshfs, которые могут оказаться важными: -o reconnect (говорит пытаться пересоединиться вместо ошибок).

Если вы много работаете с данными от рута, то можно (нужно) сделать idmap:

-o idmap=user. Работает она следующим образом: если мы коннектимся как пользователь pupkin@server, а локально работаем как пользователь vasiliy, то мы говорим «считать, что файлы pupkin, это файлы vasiliy». ну или «root», если мы коннектимся как root.

В моём случае idmap не нужен, так как имена пользователей (локальное и удалённое) совпадают.

Заметим, комфортно работать получается только если у нас есть ssh-ключик (см. начало статьи), если нет — авторизация по паролю выбешивает на 2-3 подключение.

Отключить обратно можно командой fusermount -u /path, однако, если соединение залипло (например, нет сети), то можно/нужно делать это из-под рута: sudo umount -f /path.



Удалённое исполнение кода


ssh может выполнить команду на удалённом сервере и тут же закрыть соединение. Простейший пример:

ssh user@server ls /etc/ 

Выведет нам содержимое /etc/ на server, при этом у нас будет локальная командная строка.

Некоторые приложения хотят иметь управляющий терминал. Их следует запускать с опцией -t:
ssh user@server -t remove_command 

Кстати, мы можем сделать что-то такого вида:
ssh user@server cat /some/file|awk '{print $2}' |local_app 

Это нас приводит следующей фиче:

Проброс stdin/out


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

ssh user@8.8.8.8 command >my_file

Допустим, мы хотим локальный вывод положить удалённо

mycommand |scp — user@8.8.8.8:/path/remote_file

Усложним пример — мы можем прокидывать файлы с сервера на сервер: Делаем цепочку, чтобы положить stdin на 10.1.1.2, который нам не доступен снаружи:

mycommand | ssh user@8.8.8.8 «scp — user@10.1.1.2:/path/to/file»

Есть и вот такой головоломный приём использования pipe'а (любезно подсказали в комментариях в жж):

tar -c * | ssh user@server "cd && tar -x" 

Tar запаковывает файлы по маске локально, пишет их в stdout, откуда их читает ssh, передаёт в stdin на удалённом сервере, где их cd игнорирует (не читает stdin), а tar — читает и распаковывает. Так сказать, scp для бедных.

Алиасы


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

В более-менее крупной компании часто оказывается, что имена серверов выглядят так: spb-MX-i3.extrt.int.company.net. И пользователь там не равен локальному. То есть логиниться надо так: ssh ivanov_i@spb-MX-i3.extrt.int.company.net. Каждый раз печатать — туннельных синдромов не напасёшься. В малых компаниях проблема обратная — никто не думает о DNS, и обращение на сервер выглядит так: ssh root@192.168.1.4. Короче, но всё равно напрягает. Ещё большая драма, если у нас есть нестандартный порт, и, например, первая версия ssh (привет цискам). Тогда всё выглядит так: ssh -1 -p 334 vv_pupkin@spb-MX-i4.extrt.int.company.net. Удавиться. Про драму с scp даже рассказывать не хочется.

Можно прописать общесистемные alias'ы на IP (/etc/hosts), но это кривоватый выход (и пользователя и опции всё равно печатать). Есть путь короче.

Файл ~/.ssh/config позволяет задать параметры подключения, в том числе специальные для серверов, что самое важное, для каждого сервера своё. Вот пример конфига:

Host ric
        Hostname ооо-рога-и-копыта.рф
        User Администратор
        ForwardX11 yes
        Compression yes
Host home
        Hostname myhome.dyndns.org
        User vasya
        PasswordAuthentication no


Все доступные для использования опции можно увидеть в man ssh_config (не путать с sshd_config).


Опции по умолчанию


По подсказке UUSER: вы можете указать настройки соединения по умолчанию с помощью конструкции Host *, т.е., например:

Host *
User root
Compression yes


То же самое можно сделать и в /etc/ssh/ssh_config (не путать с /etc/ssh/sshd_config), но это требует прав рута и распространяется на всех пользователей.




Проброс X-сервера


Собственно, немножко я проспойлерил эту часть в примере конфига выше. ForwardX11 — это как раз оно.

Теория: Графические приложения в юникс обычно используют X-сервер (wayland в пути, но всё ещё не готов). Это означает, что приложение запускается и подключается к X-серверу для рисования. Иными словами, если у вас есть голый сервер без гуя и есть локальный x-сервер (в котором вы работаете), то вы можете дать возможность приложениям с сервера рисовать у вас на рабочем столе. Обычно подключение к удалённом X-серверу — не самая безопасная и тривиальная вещь. SSH позволяет упростить этот процесс и сделать его совсем безопасным. А возможность жать трафик позволяет ещё и обойтись меньшим трафиком (т.е. уменьшить утилизацию канала, то есть уменьшить ping (точнее, latency), то есть уменьшить лаги).

Ключики: -X — проброс X-сервера. -Y проброс авторизации.

Достаточно просто запомнить комбинацию ssh -XYC user@SERVER.
В примере выше (названия компании вымышленные) я подключаюсь к серверу ооо-рога-и-копыта.рф не просто так, а с целью получить доступ к windows-серверу. Безопасность microsoft при работе в сети мы все хорошо знаем, так что выставлять наружу голый RDP неуютно. Вместо этого мы подключаемся к серверу по ssh, а дальше запускаем там команду rdesktop:
ssh ric rdesktop -k en-us 192.168.1.1 -g 1900x1200 

и чудо, окошко логина в windows на нашем рабочем столе. Заметим, тщательно зашифрованное и неотличимое от обычного ssh-трафика.




Socks-proxy


Когда я оказываюсь в очередной гостинице (кафе, конференции), то местный wifi чаще всего оказывается ужасным — закрытые порты, неизвестно какой уровень безопасности. Да и доверия к чужим точкам доступа не особо много (это не паранойя, я вполне наблюдал как уводят пароли и куки с помощью банального ноутбука, раздающего 3G всем желающим с названием близлежащей кафешки (и пишущего интересное в процессе)).

Особые проблемы доставляют закрытые порты. То джаббер прикроют, то IMAP, то ещё что-нибудь.

Обычный VPN (pptp, l2tp, openvpn) в таких ситуациях не работает — его просто не пропускают. Экспериментально известно, что 443ий порт чаще всего оставляют, причём в режиме CONNECT, то есть пропускают «как есть» (обычный http могут ещё прозрачно на сквид завернуть).

Решением служит socks-proxy режим работы ssh. Его принцип: ssh-клиент подключается к серверу и слушает локально. Получив запрос, он отправляет его (через открытое соединение) на сервер, сервер устанавливает соединение согласно запросу и все данные передаёт обратно ssh-клиенту. А тот отвечает обратившемуся. Для работы нужно сказать приложениям «использовать socks-proxy». И указать IP-адрес прокси. В случае с ssh это чаще всего localhost (так вы не отдадите свой канал чужим людям).

Подключение в режиме sock-proxy выглядит так:
ssh -D 8080 user@server


В силу того, что чужие wifi чаще всего не только фиговые, но и лагливые, то бывает неплохо включить опцию -C (сжимать трафик). Получается почти что opera turbo (только картинки не жмёт). В реальном сёрфинге по http жмёт примерно в 2-3 раза (читай — если вам выпало несчастье в 64кбит, то вы будете мегабайтные страницы открывать не по две минуты, а секунд за 40. Фигово, но всё ж лучше). Но главное: никаких украденных кук и подслушанных сессий.

Я не зря сказал про закрытые порты. 22ой порт закрывают ровно так же, как «не нужный» порт джаббера. Решение — повесить сервер на 443-й порт. Снимать с 22 не стоит, иногда бывают системы с DPI (deep packet inspection), которые ваш «псевдо-ssl» не пустят.

Вот так выглядит мой конфиг:

/etc/ssh/sshd_config:
(фрагмент)
Port 22
Port 443

А вот кусок ~/.ssh/config с ноутбука, который описывает vpn

Host vpn
    Hostname desunote.ru
    User vasya
    Compression yes
    DynamicForward 127.1:8080
    Port 443


(обратите внимание на «ленивую» форму записи localhost — 127.1, это вполне себе законный метод написать 127.0.0.1)



Проброс портов


Мы переходим к крайне сложной для понимания части функционала SSH, позволяющей осуществлять головоломные операции по туннелированию TCP «из сервера» и «на сервер».

Для понимания ситуации все примеры ниже будут ссылаться на вот эту схему:



Комментарии: Две серые сети. Первая сеть напоминает типичную офисную сеть (NAT), вторая — «гейтвей», то есть сервер с белым интерфейсом и серым, смотрящим в свою собственную приватную сеть. В дальнейших рассуждениях мы полагаем, что «наш» ноутбук — А, а «сервер» — Б.

Задача: у нас локально запущено приложение, нам нужно дать возможность другому пользователю (за пределами нашей сети) посмотреть на него.

Решение: проброс локального порта (127.0.0.1:80) на публично доступный адрес. Допустим, наш «публично доступный» Б занял 80ый порт чем-то полезным, так что пробрасывать мы будем на нестандартный порт (8080).

Итоговая конфигурация: запросы на 8.8.8.8:8080 будут попадать на localhost ноутбука А.

ssh -R 127.1:80:8.8.8.8:8080 user@8.8.8.8 

Опция -R позволяет перенаправлять с удалённого (Remote) сервера порт на свой (локальный).
Важно: если мы хотим использовать адрес 8.8.8.8, то нам нужно разрешить GatewayPorts в настройках сервера Б.
Задача. На сервере «Б» слушает некий демон (допустим, sql-сервер). Наше приложение не совместимо с сервером (другая битность, ОС, злой админ, запрещающий и накладывающий лимиты и т.д.). Мы хотим локально получить доступ к удалённому localhost'у.

Итоговая конфигурация: запросы на localhost:3333 на 'A' должны обслуживаться демоном на localhost:3128 'Б'.

ssh -L 127.1:3333:127.1:3128 user@8.8.8.8 

Опция -L позволяет локальные обращения (Local) направлять на удалённый сервер.

Задача: На сервере «Б» на сером интерфейсе слушает некий сервис и мы хотим дать возможность коллеге (192.168.0.3) посмотреть на это приложение.

Итоговая конфигурация: запросы на наш серый IP-адрес (192.168.0.2) попадают на серый интерфейс сервера Б.

ssh -L 192.168.0.2:8080:10.1.1.1:80 user@8.8.8.8 

Вложенные туннели


Разумеется, туннели можно перенаправлять.

Усложним задачу: теперь нам хочется показать коллеге приложение, запущенное на localhost на сервере с адресом 10.1.1.2 (на 80ом порту).

Решение сложно:
ssh -L 192.168.0.2:8080:127.1:9999 user@8.8.8.8 ssh -L 127.1:9999:127.1:80 user2@10.1.1.2 

Что происходит? Мы говорим ssh перенаправлять локальные запросы с нашего адреса на localhost сервера Б и сразу после подключения запустить ssh (то есть клиента ssh) на сервере Б с опцией слушать на localhost и передавать запросы на сервер 10.1.1.2 (куда клиент и должен подключиться). Порт 9999 выбран произвольно, главное, чтобы совпадал в первом вызове и во втором.

Реверс-сокс-прокси



Если предыдущий пример вам показался простым и очевидным, то попробуйте догадаться, что сделает этот пример:
ssh -D 8080 -R 127.1:8080:127.1:8080 user@8.8.8.8 ssh -R 127.1:8080:127.1:8080 user@10.1.1.2 
Если вы офицер безопасности, задача которого запретить использование интернета на сервере 10.1.1.2, то можете начинать выдёргивать волосы на попе, ибо эта команда организует доступ в интернет для сервера 10.1.1.2 посредством сокс-прокси, запущенного на компьютере «А». Трафик полностью зашифрован и неотличим от любого другого трафика SSH. А исходящий трафик с компьютера с точки зрения сети «192.168.0/24» не отличим от обычного трафика компьютера А.


Туннелирование


Если к этому моменту попа отдела безопасности не сияет лысиной, а ssh всё ещё не внесён в список врагов безопасности номер один, вот вам окончательный убийца всего и вся: туннелирование IP или даже ethernet. В самых радикальных случаях это позволяет туннелировать dhcp, заниматься удалённым arp-спуфингом, делать wake up on lan и прочие безобразия второго уровня.

Подробнее описано тут: www.khanh.net/blog/archives/51-using-openSSH-as-a-layer-2-ethernet-bridge-VPN.html

(сам я увы, таким не пользовался).

Легко понять, что в таких условиях невозможно никаким DPI (deep packet inspection) отловить подобные туннели — либо ssh разрешён (читай — делай что хочешь), либо ssh запрещён (и можно смело из такой компании идиотов увольняться не ощущая ни малейшего сожаления).

Проброс авторизации


Если вы думаете, что на этом всё, то…… впрочем, в отличие от автора, у которого «снизу» ещё не написано, читатель заранее видит, что там снизу много букв и интриги не получается.

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

Для начала о простом пробросе авторизации.

Повторю картинку:



Допустим, мы хотим подключиться к серверу 10.1.1.2, который готов принять наш ключ. Но копировать его на 8.8.8.8 мы не хотим, ибо там проходной двор и половина людей имеет sudo и может шариться по чужим каталогам. Компромиссным вариантом было бы иметь «другой» ssh-ключ, который бы авторизовывал user@8.8.8.8 на 10.1.1.2, но если мы не хотим пускать кого попало с 8.8.8.8 на 10.1.1.2, то это не вариант (тем паче, что ключ могут не только поюзать, но и скопировать себе «на чёрный день»).

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

Вызов выглядит так:

ssh -A user@8.8.8.8 ssh user2@10.1.1.2 

Удалённый ssh-клиент (на 8.8.8.8) может доказать 10.1.1.2, что мы это мы только если мы к этому серверу подключены и дали ssh-клиенту доступ к своему агенту авторизации (но не ключу!).

В большинстве случаев это прокатывает.

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

Есть ещё более могучий метод — он превращает ssh в простой pipe (в смысле, «трубу») через которую насквозь мы осуществляем работу с удалённым сервером.

Главным достоинством этого метода является полная независимость от доверенности промежуточного сервера. Он может использовать поддельный ssh-сервер, логгировать все байты и все действия, перехватывать любые данные и подделывать их как хочет — взаимодействие идёт между «итоговым» сервером и клиентом. Если данные оконечного сервера подделаны, то подпись не сойдётся. Если данные не подделаны, то сессия устанавливается в защищённом режиме, так что перехватывать нечего.

Эту клёвую настройку я не знал, и раскопал её redrampage.

Настройка завязана на две возможности ssh: опцию -W (превращающую ssh в «трубу») и опцию конфига ProxyCommand(опции командной строки, вроде бы нет), которая говорит «запустить программу и присосаться к её stdin/out». Опции эти появились недавно, так что пользователи centos в пролёте.

Выглядит это так (циферки для картинки выше):

.ssh/config:
Host raep
     HostName 10.1.1.2
     User user2
     ProxyCommand ssh -W %h:%p user@8.8.8.8


Ну а подключение тривиально: ssh raep.

Повторю важную мысль: сервер 8.8.8.8 не может перехватить или подделать трафик, воспользоваться агентом авторизации пользователя или иным образом изменить трафик. Запретить — да, может. Но если разрешил — пропустит через себя без расшифровки или модификации. Для работы конфигурации нужно иметь свой открытый ключ в authorized_keys как для user@8.8.8.8, так и в user2@10.1.1.2

Разумеется, подключение можно оснащать всеми прочими фенечками — прокидыванием портов, копированием файлов, сокс-прокси, L2-туннелями, туннелированием X-сервера и т.д.

Финал


Разумеется, в посте про туннели должен быть туннель, а в любой успешной статье — секретный ингредиент всеобщей популярности. Держите:

Java Программа которая слушает 7000 порт Битрикс24

Привет всем.

Хочу поделиться JAVA программой которая бы слушала 7000 порт на ответ от REST API Битрикс24.

Те кто в теме поймут зачем это нужно.

Есть 2 класса:

первый:

import java.io.IOException;

/**
 * Created by ruslan on 13.11.2014.
 */
public class mainClass {
    public static void main(String args[]) throws Throwable {

        mHttpServer Server = new mHttpServer();
        System.out.println("Program start");
        Server.Start();

    }
}
 и второй:

import com.sun.jndi.toolkit.url.Uri;
import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.List;

/**
 * Created by yar 09.09.2009
 */
public class mHttpServer {

    public void Start() throws Throwable  {
        ServerSocket ss = new ServerSocket(7000);
        while (true) {
           Socket s = ss.accept();
           SocketProcessor sp = new  SocketProcessor(s);
           boolean flag = sp.run();
            if (flag){
                break;
            }
        }
    }

    private static class SocketProcessor  {

        private Socket s;
        private InputStream is;
        private OutputStream os;
        private String code;

        private SocketProcessor(Socket s) throws Throwable {
            this.s = s;
            this.is = s.getInputStream();
            this.os = s.getOutputStream();
        }

        public boolean run() throws IOException {

            boolean flag = false;
            try {
                flag =  readInputHeaders();
                writeResponse("<html><body><h1><center>Запрос успешно выполнен</center></h1></body></html>");
            } catch (Exception e) {
                flag =  false;
               e.printStackTrace();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            } finally {
                    s.close();
            }

            return flag;
        }

        private void writeResponse(String s) throws Throwable {
            String response = "HTTP/1.1 200 OK\r\n" +
                    "Server: YarServer/2009-09-09\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: " + s.length() + "\r\n" +
                    "Connection: close\r\n\r\n";
            String result = response + s;
            os.write(result.getBytes());
            os.flush();
        }

        private boolean readInputHeaders() throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
//            while(true) {
                String ss = br.readLine();

                ss= "http://localhost:7000"+ss.substring(4);

            URL url = new URL(ss);
            String[] mass;
            String[] subMass;
            HashMap<String, String> hm = new HashMap<String, String>();
            String s = url.getQuery();
            mass = s.split("&");
            for (String t : mass) {
                subMass = t.split("=");
                hm.put(subMass[0], (subMass[1]));
            }
            String code = hm.get("code");
            String domain = hm.get("domain");

            System.out.println("code = " + code);
            System.out.println("domain = " + domain);

            write("c:/1.txt","code="+code+"\n");

            HttpGet req = new HttpGet("http://Ваш_портал.bitrix24.ru/oauth/token/?client_id=Клиент_ID&grant_type=authorization_code&client_secret=Секретный_Ключ&redirect_uri=http%3A%2F%2Flocalhost%3A70005&code="+code+"&scope=user,task,crm");
            req.setHeader("User-Agent", "Chrome");
            CloseableHttpClient client = HttpClients.createDefault();
            CloseableHttpResponse response = client.execute(req);
            InputStream inputStream = response.getEntity().getContent();
            String result = IOUtils.toString(inputStream, "UTF-8");

            System.out.println(result);
            System.out.println(result.length());

            if (result.length()>28) {
                write("c:/2.txt",result);

            }else{

            }
            return true;
        }
    }

    public static void write(String fileName, String text) {
        //Определяем файл
        File file = new File(fileName);

        try {
            //проверяем, что если файл не существует то создаем его
            if(!file.exists()){
                file.createNewFile();
            }

            //PrintWriter обеспечит возможности записи в файл
            PrintWriter out = new PrintWriter(file.getAbsoluteFile());

            try {
                //Записываем текст у файл
                out.print(text);
            } finally {
                //После чего мы должны закрыть файл
                //Иначе файл не запишется
                out.close();
            }
        } catch(IOException e) {
            throw new RuntimeException(e);
        }
}
}

ну вот в все.
Для тех кто не разберется мой мейл:heczua@gmail.com

И кликните на google рекламу как благодарность)

Подборка ресурсов, вдохновляющая на новые свершения в творчестве.

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

1. www.abduzeedo.com
Отличный сайт про логотипы и дизайн вообще.

2. www.freelanceswitch.com
Сообщество всех внештатных дизайнеров для работы за рубежом.

3. www.free-lance.ru
Подобное сообщество внештатных дизайнеров в русском варианте.

4. www.computerarts.co.uk
Международный интернет-журнал о компьютерном искусстве.

5. www.vk.com/drawing_lessons
Множество полезных книг и видеоуроков.

6. www.davidairey.com
Сайт дизайнера Дэвида Эрейа. Здесь он делится своим опытом в сфере графического и лого дизайна.

7. www.behance.net
Сайт, собравший в себе портфолио художников, дизайнеров и людей искусства со всего мира. Честно говоря, по-настоящему вдохновляющий сайт.

8. www.pdf-mags.com
Очень хороший ресурс со всевозможными дизайнерскими журналами в формате PDF.

9. www.rootsarts.net
Форум для активных графических дизайнеров. С небольшим уклоном для начинающих.

10. www.artperm.ru
Русский форум дизайнеров. Дискуссии, взаимовыручка, обсуждения ваших работ и профессиональных проблем.

11. www.designiskinky.net
Австралийский сайт о дизайне.

12. www.freelancefolder.com
Фрилансерское блог-сообщество с регулярными статьями и постами. Очень разнообразное.

13. www.bittbox.com
Сайт, посвященный всем дизайнерским нуждам. Текстуры, кисти, узоры, а так же консультация всех желающих. И все это абсолютно бесплатно, как мы любим.

14. www.allday.ru
Ну а это всем известный русский сайт-аналог. Здесь тоже все бесплатно и достаточно качественно.

15. www.lenagold.ru
Не могу не сказать про этот очень богатый сайт, специализирующийся преимущественно на клипартах. А вообще настоятельно советую либо покупать либо самим создавать неповторимые снимки.

16. www.vandelaydesign.com
Собрание очень хороших статей из медиа ресурсов. Особенно понравится этот сайт веб-дизайнерам.

17. www.youthedesigner.com
Этот сайт полон разнообразных статей о графическом дизайне. Очень интересный и незаурядный.

18. www.designyoutrust.com
Ежедневный дизайнерский журнал, публикующий статьи о новых направлениях в дизайне, новости и события, отличные дизайнерские портфолио и выборочные, тщательно отсортированные дизайнерские проекты со всего мира.

19. www.lookatme.ru
Большая социальная сеть, место объединения огромного числа авторов. На сайте так же есть раздел о дизайне.

Веб-дизайн

20. www.noupe.com
Отличный сайт о веб-дизайне и веб-разработках (CSS, Ajax).

21. www.smashingmagazine.com
Здесь есть информация обо всем, что нужно как начинающему разработчику, так и профессионалу в области дизайна.

22. www.thinkvitamin.com
Ресурс для разработчиков, веб-дизайнеров и предпринимателей.

23. www.24ways.org
Качественные статьи по дизайну и разработке.

24. www.alistapart.com
Еще один островок в море блогов, посвященных веб-дизайну. Очень хорошие и полезные статьи от самых разных авторов.

25. www.sitepoint.com
Очень разнообразный сайт: графика, CSS, AJAX.

26. www.design-mania.ru
Здесь вы найдете интересные и полезные статьи по дизайну, верстке, юзабилити, а также сможете скачать материалы для своих проектов (иконки, кисти, шрифты и т.п.) Проект пригодится как профессионалам, так и абсолютным новичкам, жаждущим познать секреты веб-дизайна.

27. www.designgu.ru
Сайт с новостями про веб-дизайн и не только.

28. www.webappers.com
Блог, содержащий множество исходников, распространяемых по принципу open-source и предназначенный для веб-разработчиков и дизайнеров.

29. www.happycog.com
На этом сайте его создатели публикуют свои собственные красивые веб-сайты и делятся лучшими из своих идей.

30. www.webdesignerwall.com
Каждый дизайнер должен знать, пусть даже если он не интересуется веб-дизайном.

Ресурсы

31. www.designfloat.com
Сайт по типу сайта digg.com, только на тему дизайна.

32. www.psd.tutsplus.com
Сайт с очень хорошими пошаговыми уроки по веб-дизайну, как для новичков, так и для профессионалов.

33. www.bluevertigo.com.ar
Настоятельно рекомендую этот сайт, в котором собраны ссылки на, пожалуй, все крупные фотобанки интернета.

34. www.sxc.hu
Один из самых крупных, любимых и бесплатных фотобанков интернета. Хороший выбор изображений любого качества и тематики.

35. www.iconfinder.com
Название сайта говорит само за себя.

36. www.dafont.com
Один из моих самых любимых сайтов, посвященных шрифтам. Более 11,000 шрифтов на любой вкус.

37. www.womtec.ru
Еще один сайт, посвященный шрифтам. Большое количество хороших, интересных русских шрифтов. Скачать можно бесплатно.
Более полную подборку, касательно исключительно типографики и соответствующих ресурсов смотрите здесь.

38. www.wind.ne.jp
Хаотичный японский сайт, посвященный шрифтам. Тем не менее здесь можно найти очень много интересных вещей, в частности шрифтов, причем бесплатных.

39. www.colourlovers.com
Один из самых крупных ресурсов с огромной коллекцией цветовых сочетаний, которые можно сохранить в любом удобном для вас формате.

Подборки

40. www.commandshift3.com
Вы когда-нибудь слышали про hot or not? Так вот этот сайт построен по такому же принципу, только в сфере веб-дизайна. Ты выбираешь самые лучшие сайты, на свое усмотрение. Есть возможность проверить на прочность и собственный сайт, если такой имеется.

41. www.showcasepoint.com
Здесь расположились многочисленные подборки Flash и CSS сайтов, с возможностью уникальной сортировки. Сайт приятный и очень крупный, есть что посмотреть.

42. www.zeniltuo.com
Это крупная база данных сайтов, сделанных во Flash и CSS.

43. www.thefwa.com
Главным образом здесь собраны флэш-сайты в очень высоком качестве. Вдохновляющая подборка, если честно.

44. www.cssmania.com
Другие, но не менее привлекательные подборки CSS-сайтов.

45. www.cssremix.com
Очень хорошая галерея из CSS-сайтов.

46. www.bestwebgallery.com
А эта веб-галерея одна из моих самых любимых. Отличный выбор для дизайнера.

47. www.screenfluent.com
А этот сайт – отличный выбор веб-дизайнеров.Большое количество категорий, структур, светов, стилей и т.д.

48. www.w3csites.com
Отличный выбор для разработчиков W3C-сайтов.

49. www.cssbeauty.com
Хорошая галерея. Ребята публикуют очень интересные статьи о разработке веб-сайтов и регулярно следитят за новостями своей сферы деятельности.

50. www.edustyle.net
Школы и университеты тоже имеют право быть представленными в галерее. Вот эта вот особенно интересна.

Разработчикам

51. www.problogger.net
Один из лучших блогов, можно сказать, незаменимый в списке каждого веб-програмиста.Каждый блогер должен знать!

52. www.problogdesign.com
Собрание полезных советов для улучшения вашего блога. Только качественные статьи.

53. www.wpdesigner.com
Блог, ориентированный на разработчиков всех уровней.

54. www.ajaxrain.com
Самая крупная электронная библиотека, посвященная исключительно Ajax.

55. www.css3.info
Сайт будущих стандартов. CSS3, дамы и господа!

56. www.cssglobe.com
Сайт содержит ссылки на лучшие статьи касательно разработки CSS для сайтов.

Флэш

57. www.labs.adobe.com
Новые технологии и обновления от Adobe.

58. www.coenraets.org
Блог для разработчиков во Flex.

59. www.flasher.ru
Один из крупнейших форумов для людей, делающих работы на флэше. Огромное количество охваченной тематики, советы, вакансии, уроки, активные завсегдатаи-что ещё нужно любителю творить на флэше.

60. www.flashblog.ru
Блог, который был создан с одной целью – помочь новичкам в изучении Flash и языка программирования ActionScript. Если Вы собрались окунуться в мир флэш-технологий и не знаете с чего начать, не можете найти подробных примеров с исходниками, не знаете у кого спросить совета, тогда Вы попали точно в цель.

61. www.mikechambers.com
Блог Майкла Чэмберса специализируется на програмировании и технологиях.

62. www.blog.theflashblog.com
Блог о Action Script 3 и Flex.

63. www.jeanphiblog.media-box.net
Один из самых больших французских флешеров. Большое количество работ, но для некоторых Французский может стать проблемой.

Типографика

64. www.swisslegacy.com
Блог о типографии и швейцарском дизайне.

65. www.ilovetypography.com
Название говорит само за себя. Обязательно зайдите, вам понравится, ручаюсь!

66. www.paris.blog.lemonde.fr
Блог знаменитого Питера Гэйбора, публикует невероятно вдохновляющие посты (и на английском языке тоже).

67. www.typographe.com
Сайт про типографику по-французски.

68. www.slanted.de
А это крупный немецкий сайт о типографике. Полный теории, примеров и полезных советов.

69. www.paratype.ru
От себя добавлю это маленькое приложение, думаю оно порадует русских дизайнеров.

Видео и анимация

70. www.fubiz.net
Замечательный, ежедневно обновляющийся блог с веливолепными статьями о всем новом и интересном в дизайне.

71. www.motionographer.com
Международный ресурс для профессиональных аниматоров.

72. www.videocopilot.net
Сайт предоставляет бесплатные конультации по специальным видео эффектам.

73. www.motiongraphics.it
Итальянский блог, посвященный видео. Регулярное обновление и качественные статьи.

74. www.fxguide.com
Корупное сообщество о видео. Никогда ничего не пропускает.

75. www.motionworks.com.au
Сайт Джона Дикенсона. Просто вдохновляющий сайт.

76. www.animator.ru
Русский аналоговый сайт про видео и анимацию. Ежедневные новости, хорошие работы, книги. Воющем, сайт работает по типу все включено.

Персональные дизайнерские блоги

77. www.elliotjaystocks.com
Просто посмотрите его блог. Везде встречаю его имя.

78. www.veerle.duoh.com
Один из самых красивых, на мой взгляд, блогов в сети. Очень подробные статьи.

79. www.sushiandrobots.com
Дизайн Джины Болтон (также известной под именем Sushi Monster), автор книги «Искусство и Наука CSS» («Art & Science of CSS»), создатель Sexy StyleSheet, а также обладатель очень завидного портфолио.

80. www.snook.ca
Блог графического дизайнера, разработчика, писателя, лектора Джонатана Снука (Jonathan Snook). Полезные советы, хитрости графического и веб дизайна и многое другое.

81. www.stuffandnonsense.co.uk
Супер блог! Пожалуй один самых-самых лучших блогов о веб-дизайне в мире.

82. www.lysergid.com
Хороший французский блог. Качественные статьи, свежий дизайн.

83. www.blog.iso50.com
Отличный блог графического дизайнера Скотта Хэнсена.

84. www.blogs.adobe.com
Блог графического дизайнера Джона Нэка. Полные, подробные статьи о графике и пакете Adobe.

85. www.weebls-stuff.com
Флэш-аниматоры создали свой сайт, куда выкладывают свои потрясающие творения.

Web 2.0

86. www.netvibes.com
С 2005 года ребята занимаются вебом, публикуют свежие новости и свои работы.

87. www.delicious.com
Чтобы вам быть в кусре всех новостей, рекомендую регулярно посещать этот сайт.

88. www.twitter.com
Получайте рекомендации, замечания и похвалу ваших друзей, коллег по работе и просто случайных пользователей о вашей работе.

89. www.facebook.com
Сайт послужит вам хорошим рекламным инструментом.

90. www.flickr.com
Огромная социальная сеть, где миллионы людей каждый день делятся своими фотографиями. Здесь можно найти как начинающих фотографов, так и метров этой профессии. Сайт богатый, советую взять на заметку тем, кто еще не знает о нем.

91. www.allgraphicdesign.com
Место встречи всех дизайнеров. Место где собрано все. От крупных коллекций и блогов до советов и видео уроков.

92. www.northxeast.com
Полезные статьи для блоггеров.

93. www.adsoftheworld.com
Место, где собрана только самая популярная и качественная реклама со всего мира.

94. www.netlore.ru
Это собрание всех только самых популярных явлений, видео, аудио, картинок, статей, феноменов, если хотите, со всего мирового интерета.

95. www.logopond.com
Все о логотипах. Отличные примеры, отличный сайт.

96. www.logodesignlove.com
Сайт сфокусированный только на логотипах. Регулярные новости и ресурсы.

97. www.splitdadiz.com
Французский сайт о дизайне. которые статьи есть на английском.

98. www.businessofdesignonline.com
Сайт для дизайнеров-фрилансеров с большим количеством ресурсов.

99. www.novate.ru
Интернет-сообщество о дизайне, объединяющее современных людей, которым интересны дизайнерские решения в самых разных областях.

100. www.artnotartnot.com
Блог о современном искусстве.

Землятрясение в Одессе

22 ноября между 21:15 и 21:20 в Одессе были замечены ощутимые подземные толчки.Особенно хорошо это чувствовалось в многоэтажках.В квартирах качались люстры, звенела посуда, многие чувствовали как качаются перекрытия. Информации о каких-либо разрушениях нет. Подробности выясняются.
Вероятнее всего, до нас докатилась сейсмическая волна от землетрясения, которое произошло около 20 минут назад в Румынии. Магнитуда в эпицентре — 5,5 балла по шкале Рихтера
Спустя 18 минут после первого толчка в эпицентре произошло еще два землетрясения, магнитудой 2,1 балла

Мой опыт использования Bitrix24 REST API

Привет всем. Опишу свой опыт использования API системы Битрикс 24.
Когда я впервые увидел API я подумал как круто что можно обращаться к элементам сделок из других программ и создавать их.

Мне поставили задачу "Необходимо перебрасывать сделки и контрагентов из 1С в Битрикс24".

Я начал копать просторы интернета в поиске как же все-таки получить авторизацию в системе.
Итак опишу все по порядку:

  1. Нужно зарегистрироваться как партнер Bitrix на сайте http://partners.1c-bitrix.ru/program/become/ 
  2. Дождаться пока вас утвердят, на вопрос "Зачем сам быть партнером" отвечает для доступа к REST API Bitrix24
  3. Зайти в кабинет партнера и перейти в раздел Приложения Битрикс24 (Маркетплейс) - Добавить приложение.
  4. В открывшемся окне заполняем информацию о приложении:
  5. Обращаю внимание на то что вы не сможете зарегистрировать приложение пока не заполните в карточке партнера договор. В Договоре постарайтесь по максимуму заполнить все поля.
  6. Обязательно при регистрации приложения ставим галочку "Использует только API"
  7. Сохраняем наше приложение с заставляем его слушать PORT 7000
  8. И тут же нажав на кнопку "Установить на свой портал Бирикс24" устанавливаем приложение на свой Битрикс. Важно дать приложению при установке все права.
  9. Когда приложение установлено на наш портал необходимо получить код (code) незнаю зачем он нужен, но его нужно получить. Для этого необходимо повесить программу которая бы слушала 7000 порт и в браузере набрать  строку вида 

  10. https://мой_портал.bitrix24.ru/oauth/authorize/?client_id=код_приложения&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A70005
    где мой портал - это имя моего портала
    код_приложения - код который можно посмотреть в кабинете партнера


  11. В ответ получим строку вида code=017d0e0823f457ba3de9df240b410f22 она нам понадобится для запроса авторизационного токкена .
  12. Дальше нужно отправить запрос методом POST, либо набрать в браузере строку следующего вида:

  13. https://мой_портал.bitrix24.ru/oauth/token/?client_id=код_приложения&grant_type=authorization_code&client_secret=секретный_ключ_приложения&redirect_uri=http%3A%2F%2Flocalhost%3A70005&code=код_получения_авторизации&scope=требуемый_набор_разрешений
      мой_портал - Имя портала
      код_получения_авторизации - Наш полученный код на предыдущем этапе
      код_приложения - мы уже знаем где его взять
      секретный_ключ_приложения - берем там же где и код приложения
    Список объектов через запятую к которым необходимо получить доступ например :
    {"access_token":"ключ для отправки запросов к REST-сервису","expires_in":3600,"scope":"user","refresh_token":"ключ для продления авторизации","domain":"мой_портал.bitrix24.ru"}
    Нам отсюда нужен только access_token




  14. Отправка запроса на примере добавления сделки в Битрикс24. Покажу пример отправки из 1С: 
Попытка
            WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
              WinHttp.Option(2,"utf-8");
                WinHttp.Open("POST","https://rygroup.bitrix24.ru/rest/crm.deal.add.json",0);
                  WinHttp.SetRequestHeader("Accept-Language", "ru");
                    WinHttp.SetRequestHeader("Accept-Charset","utf-8");
                      WinHttp.setRequestHeader("Content-Language", "ru");
                        WinHttp.setRequestHeader("Content-Charset", "utf-8");
                          WinHttp.setRequestHeader("Content-type", "application/json; charset=utf-8");

                      ПараметрыПОСТ = "auth="+ПолучитьАвторизационныйТоккен()+"&fields[TITLE]="+ЗаголовокСделки+"+&fields[TYPE_ID]="+ИдентификаторТипаСделки+"&fields[STAGE_ID]="+ИдентификаторЭтапаСделки+"&fields[COMPANY_ID]="+ИдентификаторКонтрагентаСделки+"&fields[CONTACT_ID]="+ИдентификаторКонтактногоЛица+"&fields[CURRENCY_ID]="+ВалютаСделки+"&fields[DATE_CREATE]="+ДатаСозданияСделки+"&fields[COMMENTS]="+КомментарийСделки+"&fields[CLOSED] = Y";
                        WinHttp.Send(ПараметрыПОСТ);
                                ТекстОтвета = WinHttp.ResponseText();
                                Сообщить("Текст ответа : "+ТекстОтвета);


                          Генератор случайных чисел в C#

                          Случайные числа C# 

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

                          Если вам нужно получить генерацию целых или дробных чисел, то можно это сделать следующим образом: 

                          Генерация целых случайных чисел C# имеет 3 перегруженных метода: 
                          1. Возвращает значение большее нуля. Максимальное число больше 10 миллионов: Random x = new Random(); // объявление переменной для генерации чисел int n = x.Next(); 
                          2. Возвращает значение имеющееся в промежутке (min,max). При этом min значение входит в случайное число, а max не входит: int n= x.Next(-100,100); 
                          3. Возвращает целое положительное число не больше максимального: 
                          int n = x.Next(10); 
                          При этом максимальное число также не входит в генерацию случайных чисел, то есть в данном случае от 0 до 9.   

                          Генерация дробных случайных чисел В языке C# методов для генерации дробных чисел, но это не проблема, так как если нам надо получить дробные числа, мы можем сделать это следующим образом: 
                          double r = Convert.ToDouble(x.Next(-100, 100)/10.0); 

                          В данном случае мы имеем числа от -10 до 9.9. Также само, к примеру иметь положительные дробные числа: 
                          double r = Convert.ToDouble(x.Next(100)/10.0); 
                          В данном случае мы имеем генерацию от 0 до 9.9.

                          Генерация случайного числа в Java


                          Для генерации целого случайного числа в заданном диапазоне от Min до Max, обычно используется следующий паттерн:

                          Min + (int)(Math.random() * ((Max - Min) + 1))

                          В Java метод Math.random() генерирует число типа double в диапазоне [0,1). Обратите внимание, что 1 не входит в этот диапазон!
                          Чтобы получить определенный диапазон значений, сначала нужно умножить на разницу между максимумом и минимумом

                          Math.random() * ( Max - Min )

                          Это вернет нам значение в диапазоне [0,Max-Min].
                          К примеру, если мы хотим получить целые значения [5,10], нам нужно покрыть диапазон в 5 целых(int) значений. То есть:

                          Math.random() * 5

                          Данный пример будет генерировать значения в диапазоне [0,5).
                          Теперь нам нужно сдвинуть этот диапазон, чтобы минимальное значение соответствовало желаемому. Для этого мы просто добавляем значение минимума

                          Min + (Math.random() * (Max - Min))

                          Теперь мы получим значение в диапазоне [Min,Max). Продолжая наш пример, это будет [5,10):

                          5 + (Math.random() * (10 - 5))

                          Но этот вариант все равно не включает значение Max, и вообще, мы получаем значение типа double. Для того чтобы значение Max тоже входило в допустимый диапазон, нужно прибавить 1 к нашему параметру диапазона (Max - Min) и затем избавиться от дробной части приведением значения к int. Вот так:

                          Min + (int)(Math.random() * ((Max - Min) + 1))

                          Теперь то что надо! Случайное целое значение в диапазоне [Min,Max], или как в нашем случае [5,10]:

                          int rnd = 5 + (int)(Math.random() * ((10 - 5) + 1))