вторник, 24 октября 2017 г.

четверг, 6 июля 2017 г.

SED/AWK — Добавить\Удалить в Конец\Начало Строки


 Оригиналы :

https://www.shellhacks.com/ru/sed-awk-add-end-beginning-line/

https://www.shellhacks.com/ru/remove-first-last-characters-strings-bash/

 

SED/AWK — Добавить в Начало или в Конец Строки


Время от времени возникает необходимость быстро отредактировтаь какой-либой файл.
И само собой разумеется, что для этой работы самыми популярными утилитами командной строки в Linux являются sed и awk — две лучшие программы для обработки текста.
В даной статье вы найдете информацию о том, как добавить какой-либо текст или символ (например запятую) в начало или в конец каждой строки файла с помощью sed и awk.
Также вы узнаете, как превратить несколько строк из файла в одну строку разделенную запятыми.

SED/AWK — Добавить в Начало Строки

Используйте следующие команды, чтобы добавить ПРЕФИКС (какой-то текст или символ) в начало каждой строки ФАЙЛА:
$ awk '{print "ПРЕФИКС"$0}' ФАЙЛ
— или —
$ sed 's/^/ПРЕФИКС/' ФАЙЛ
Дельный Совет: Не будьте занудой! Сделайте ваш Bash скрипты ЦВЕТНЫМ! Пусть он выглядит ВЕЛИКОЛЕПНО! Читать далее →


 

SED/AWK — Добавить в Конец Строки

Используйте следующие команды, чтобы добавить СУФФИКС (какой-то текст или символ) в конец каждой строки ФАЙЛА:
$ awk '{print $0"СУФФИКС"}' ФАЙЛ
— или —
sed 's/$/СУФФИКС/' ФАЙЛ

SED/AWK — Добавить в Начало и Конец

Используйте следующие команды, чтобы добавить какой-то ПРЕФИКС в начало и какой-то СУФФИКС в конец каждой строки ФАЙЛА:
$ awk '{print "ПРЕФИКС"$0"СУФФИКС"}' ФАЙЛ
— или —
$ sed "s/.*/ПРЕФИКС&СУФФИКС/" ФАЙЛ
 
 
 

Удаление Первых и Последних Символов из Строк в Bash


Из данной статьи Вы узнаете как удалить несколько символы в начале кажой строки в Bash и как напечатать часть строки между заданными первым и последним символами, используя команду cut.
Вы также узнаете как удалить последние символы в конце каждой строки с помощью хитрости и команды reverse.
Я создал файл со следующим содержимым и буду использовать его в примерах ниже. Допустим нам необходимо удалить несколько символов с начала и с конца каждой строки этого файла.
$ cat file 12345===I Love Bash===54321 12345===I Love Bash===54321 12345===I Love Bash===54321

Удалить Первые N Символов Каждой Строки

Используйте следующую команду чтобы удалить первые 5 символов каждой строки (удаляем первые 5 символов и печатаем каждую строку, начиная с 6-ого символа):
$ cat file | cut -c 6- ===I Love Bash===54321 ===I Love Bash===54321 ===I Love Bash===54321

Печать Строки Между Заданными Символами

Используйте следующую команду чтобы напечатать содержимое каждой строки между 9-ым и 20-ым символами в Bash:
$ cat file | cut -c 9-20 I Love Bash I Love Bash I Love Bash

Печать Первых N Символов Каждой Строки

Используйте следующую команду чтобы напечатать первые 20 символов каждой строки в Bash:
$ cat file | cut -c 1-20 12345===I Love Bash 12345===I Love Bash 12345===I Love Bash

Удалить Последний Символ Каждой Строки

Используя сочетание команд reverse и cut, мы можем удалять последние N символов каждой строки, как показано ниже. (источник)
Используйте следующую команду чтобы удалить последний символ каждой строки в Bash:
$ rev file | cut -c 2- | rev 12345===I Love Bash===5432 12345===I Love Bash===5432 12345===I Love Bash===5432

Удалить Последние N Символов Каждой Строки

Используйте следующую команду чтобы удалить последние 8 символов каждой строки в Bash:
$ rev file | cut -c 9- | rev 12345===I Love Bash 12345===I Love Bash 12345===I Love Bash
 

понедельник, 3 июля 2017 г.

Чужое:

Настройка firewall iptables на сервере, являющимся интернет-шлюзом

(Это не совсем доработанная статья, конфиг в процессе тестирования)
Итак в один прекрасный момент возникла необходимость установить фаервол на сервере под линуксом, который будет интернет-шлюзом и не только. Основные задачи:
- закрыть доступ сотрудникам на определенные сайты - соц. сети и прочие, при этом не закрывая их для начальства.
- закрыть аську (есть чат для сотрудников), также оставив доступ к ней начальству.
- запретить выход в сеть другим нежелательным приложениям.
- сделать проброс портов для возможности it-отделу подключаться к своим рабочим компьютерам из внешней сети.
- открыть доступ из вне к серверу для администрирования через ssh.
- открыть из вне 80ый порт для доступа к будущему сайту.
- открыть из вне порты 25 и 110 для почтового сервера.
- Для IT-отдела отдельно открывать все, что понадобится)


В итоге сотрудникам в внешнюю сеть открыты только порты 80 (http) 443 (https) 53 (dns), и закрыты вконтактики и проч.. Аськи работать не будут так как используют др. порты (основной 5190).

Реализовывать эти задачи будем с помощью iptables — утилиты командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4 и 2.6. После дня изучения был создан достаточно простой скрипт настройки, наверно не лишенный недостатков но вполне рабочий. Теорию копипастить не буду, в сети ее море, да и из комментариев  ниже многое понятно. Приступим. Если iptables не установлен - ставим:

sudo su

apt-get install iptables

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

touch fw.sh

chmod +x fw.sh

Создаем два текстовых файла. в одном будет храниться список vip ip-адресов, с которых будут доступны все сайты, во втором - список запрещенных сайтов:

touch sbd.txt

touch ipbd.txt

и заполняем их:

nano sbd.txt

vkontakte.ru
durov.ru
vk.com
odnoklassniki.ru
и прочие....

nano ipbd.txt

10.10.10.10
10.10.10.11
и.т.д.

Далее переходим к написанию скрипта настройки. Имеем следующее: локальная сеть 10.10.10.0/24 на сетевом адаптере eth1, внешняя сеть на адаптере eth0 c ip к примеру 88.45.65.2.

nano fw.sh

#!/bin/bash

###################################################
# Переменные
###################################################

#указываем внешний ip сервера и внешн. сетевой интерфейс
INET_IP1=88.45.65.2
INET_IFACE1=eth0

# указываем внутренний ip сервера и внутр. сетевой интерфейс
LAN_IP=10.10.10.4
LAN_IFACE=eth1

# внутренняя сеть
LAN_RANGE=10.10.10.0/24

# сетевой интерфейс петли и ip
LO_IFACE=lo
LO_IP=127.0.0.1

# IP адреса в локалке, на которые делаем проброс портов
IP_FORW[1]=10.10.10.57
# внешний порт
PORT_V[1]=3389
# внутренний порт
PORT_I[1]=3389
PRTCL[1]=tcp

IP_FORW[2]=10.10.10.50
# внешний порт
PORT_V[1]=3489
# внутренний порт
PORT_I[1]=3389
PRTCL[2]=tcp


ip=iptables

# указываем путь к текстовому файлу, содержащему список запрещенных сайтов
badsite=( $(cat "/home/virtdiver/sbd.txt") )

# указываем путь к текстовому файлу, содержащему список ip,
# для которых все сайты открыты
goodip=( $(cat "/home/virtdiver/ipbd.txt") )

###################################################
# Сброс настроек iptables (Очистка таблиц)
###################################################

$ip -F -t filter
$ip -F -t nat
$ip -F -t mangle
$ip -F

###################################################
# Политики по умолчанию: все блокировать что явно
# не разрешено ниже  =)
###################################################

$ip -P INPUT DROP
$ip -P OUTPUT DROP
$ip -P FORWARD DROP

###################################################
# Разрешаем форвардинг
###################################################
# только разрешаем
# настройка самого форвардинга ниже
# ставим в файл "1". (по умолчанию "0" - выключен)
echo 1 > /proc/sys/net/ipv4/ip_forward

###################################################
# Включаем NAT (сетевую трансляцию адресов) для
# возможности выхода в интернет из локалки
###################################################

# "!" = адреса назначения все, кроме $LAN_RANGE
$ip -t nat -A POSTROUTING -o $INET_IFACE1 -s $LAN_RANGE ! -d $LAN_RANGE -j SNAT --to-source $INET_IP1

###################################################
# Делаем проброс портов, для доступа например
# через удаленный рабочий стол (RDP) из внешней
# сети к компьютеру в локалке.
###################################################

# Подставляем в цикле значения ip, портов, и протоколов
# из массива, обьявленного в разделе "переменные"

for ((i=1; i<=${#IP_FORW[*]}; i++)); do

# Прокидываем порт
$ip -t nat -A PREROUTING --dst $INET_IP1 -p ${PRTCL[$i]} --dport ${PORT_V[$i]} -j DNAT --to-destination ${IP_FORW[$i]}:${PORT_I[$i]}
$ip -t nat -A POSTROUTING -p ${PRTCL[$i]} --dst ${IP_FORW[$i]} --dport ${PORT_I[$i]} -j SNAT --to-source $LAN_IP
# Разрешаем трафик между внешней сеткой и компьютером в сети, идущий с\на определенный порт
$ip -A FORWARD -i $INET_IFACE1 -o $LAN_IFACE -d ${IP_FORW[$i]} -p ${PRTCL[$i]} --dport ${PORT_I[$i]} -j ACCEPT
$ip -A FORWARD -i $LAN_IFACE -o $INET_IFACE1 -s ${IP_FORW[$i]} -p ${PRTCL[$i]} --sport ${PORT_I[$i]} -j ACCEPT

done

###################################################
# Отбрасываем все пакеты, которые не могут быть
# идентифицированы и поэтому не могут иметь
# определенного статуса.
###################################################

$ip -A INPUT   -m state --state INVALID -j DROP
$ip -A FORWARD -m state --state INVALID -j DROP

###################################################
# Разрешаем трафик через петлю
###################################################

# Разрешаем входящий трафик на интерфейс петли
$ip -A INPUT -p all -i $LO_IFACE -j ACCEPT

# Разрешаем исходящий трафик с интерфейса петли
$ip -A OUTPUT -p all -o $LO_IFACE -j ACCEPT

###################################################
# Разрешаем трафик через внутренний сет. адаптер
###################################################

# между сервером и локалкой пока разрешаем все, так как в функции сервера
# будет входить много др. задач....
# Разрешаем входящие новые и установившиеся соединения
# в сет. адаптер лок.сети из лок.сети
$ip -A INPUT -p all -i $LAN_IFACE -s $LAN_RANGE --match state --state NEW,ESTABLISHED -j ACCEPT

# Разрешаем исходящие новые и установившиеся соединения
# в внутреннюю сеть c сет. адаптера лок. сети
$ip -A OUTPUT -p all -o $LAN_IFACE -d $LAN_RANGE --match state --state NEW,ESTABLISHED -j ACCEPT

###################################################
# Разрешаем входящие новые и установившиеся
# tcp-соединения с внешней сети к серверу и
# установившиеся и инициированные ими соединения
# с сервера в внешнюю сеть на порты 80(http) и
# 22(ssh)
###################################################

# т.е. к примеру из внешней сети можно будет подключиться к серверу по ssh,
# а с сервера к другому в интернете нельзя, так как в эту сторону
# новые  подключения блокируются
$ip -A INPUT -p tcp -i $INET_IFACE1 -m multiport --dports 80,22,25,110 --match state --state NEW,ESTABLISHED -j ACCEPT
$ip -A OUTPUT -p tcp -o $INET_IFACE1 -m multiport --sports 80,22,25,110 --match state --state ESTABLISHED,RELATED -j ACCEPT

###################################################
# Разрешаем при необходимости непосредственно с
# сервера выход в внешнюю сеть на определенные
# порты, например dns,http,https
###################################################

$ip -A INPUT -i $INET_IFACE1 -p tcp -m multiport --sports 80,53,443 -j ACCEPT
$ip -A OUTPUT -o $INET_IFACE1 -p tcp -m multiport --dports 80,53,443 -j ACCEPT
$ip -A INPUT -i $INET_IFACE1 -p udp -m multiport --sports 53 -j ACCEPT
$ip -A OUTPUT -o $INET_IFACE1 -p udp -m multiport --dports 53 -j ACCEPT

###################################################
# открываем IT-отделу, то бишь себе) ,
# все что понадобится
###################################################

# tcp
$ip -A FORWARD -p tcp -s 10.10.10.9 ! -d $LAN_RANGE -m multiport --dports 80,53,443,22,25,110,5190 -j ACCEPT
$ip -A FORWARD -p tcp -d 10.10.10.9 ! -s $LAN_RANGE -m multiport --sports 80,53,443,22,25,110,5190 -j ACCEPT
# udp
$ip -A FORWARD -p udp -s 10.10.10.9 ! -d $LAN_RANGE -m multiport --dports 53 -j ACCEPT
$ip -A FORWARD -p udp -d 10.10.10.9 ! -s $LAN_RANGE -m multiport --sports 53 -j ACCEPT

# tcp
$ip -A FORWARD -p tcp -s 10.10.10.20 ! -d $LAN_RANGE -m multiport --dports 80,53,443,22,25,110,5190 -j ACCEPT
$ip -A FORWARD -p tcp -d 10.10.10.20 ! -s $LAN_RANGE -m multiport --sports 80,53,443,22,25,110,5190 -j ACCEPT
# udp
$ip -A FORWARD -p udp -s 10.10.10.20 ! -d $LAN_RANGE -m multiport --dports 53 -j ACCEPT
$ip -A FORWARD -p udp -d 10.10.10.20 ! -s $LAN_RANGE -m multiport --sports 53 -j ACCEPT

# tcp
$ip -A FORWARD -p tcp -s 10.10.10.21 ! -d $LAN_RANGE -m multiport --dports 80,53,443,22,25,110,5190 -j ACCEPT
$ip -A FORWARD -p tcp -d 10.10.10.21 ! -s $LAN_RANGE -m multiport --sports 80,53,443,22,25,110,5190 -j ACCEPT
# udp
$ip -A FORWARD -p udp -s 10.10.10.21 ! -d $LAN_RANGE -m multiport --dports 53 -j ACCEPT
$ip -A FORWARD -p udp -d 10.10.10.21 ! -s $LAN_RANGE -m multiport --sports 53 -j ACCEPT

###################################################
# Разрешаем аську избранным
###################################################

i=0
for i in "${goodip[@]}"
do
$ip -A FORWARD -p tcp -d $i --sport 5190 -j ACCEPT
$ip -A FORWARD -p tcp -s $i --dport 5190 -j ACCEPT
done

###################################################
# Закрываем доступ к запрещеным сайтам всем кроме
# VIP ip-адресов. Файлы со списками обьявлены в
# разделе "переменные"
###################################################

# !!! то правило, что выше - то главнее!!!
# поэтому этим правилом разрешаем избранным
j=0
for j in "${badsite[@]}"
do
i=0
for i in "${goodip[@]}"
do
$ip -A FORWARD -d $i -s $j -j ACCEPT
done
done

# а этим правилом запрещаем всем. Так как первое правило выше,
# значит главнее, оно не убьется вторым
i=0
for i in "${badsite[@]}"
do
$ip -A FORWARD -s $i -j DROP
done

###################################################

###################################################
# Разрешаем пакеты с внутренней сети во
# внешнюю и обратно, идущие через порты
# http\dns\https\ и др. по необходимости
###################################################
# tcp
$ip -A FORWARD -p tcp -s $LAN_RANGE ! -d $LAN_RANGE -m multiport --dports 80,53,443 -j ACCEPT
$ip -A FORWARD -p tcp -d $LAN_RANGE ! -s $LAN_RANGE -m multiport --sports 80,53,443 -j ACCEPT
# udp
$ip -A FORWARD -p udp -s $LAN_RANGE ! -d $LAN_RANGE -m multiport --dports 53 -j ACCEPT
$ip -A FORWARD -p udp -d $LAN_RANGE ! -s $LAN_RANGE -m multiport --sports 53 -j ACCEPT


###################################################
# Разрешаем c сервера ping наружу, а сервер с
# внешней сети пинговать запрещаем
###################################################

$ip -A INPUT -p icmp -m icmp -i $INET_IFACE1 --icmp-type echo-reply -j ACCEPT
$ip -A OUTPUT -p icmp -m icmp -o $INET_IFACE1 --icmp-type echo-request -j ACCEPT

Запускаем файл:

fw.sh

Проверяем внесение правил командами:

iptables -L # таблицы input, output, forward

и

iptables -L -t nat # таблица nat

При перезагрузке правила не сохранятся, поэтому стоит добавить скрипт в автозагрузку (в /etc/rc.local) или воспользоваться встроенной утилитой iptables-save.

Выходим из рута:

exit

И на этом настройка закончена.

 Оригинал:
http://linux-bash.ru/mseti/50-iptables.html

среда, 28 декабря 2016 г.

bacula очистка баз от бэкапов





На данный момент сделать второю полную копию хранилища на сервере PDC невозможно – недостаточно места на разделе /mnt/bacula/ ( примонтирован по iSCSI nas4free )
Для этого делается очистка баз от бэкапов:
1. меняем дату в файле:
sudo vi /usr/local/bin/purge-db-and-files.sh


до какого числа очистить базу
DATEFROM=2015-02-12
 и запускаем его
cd /usr/local/bin/
purge-db-and-files.sh

2. далее чистим хранилище /mnt/bacula/
эта папка (/mnt/bacula/) примонтирована по ISCSI с сервера nas4Free
sudo rm -rf /mnt/bacula/*_volume-*
если действительно хотим удалить все:
sudo rm -rf /mnt/bacula/*_volume-*



purge-db-and-files.sh

 #!/bin/bash

  DATEFROM=2016-12-26
  BACKUPFOLDER="/mnt/bacula"

  #GETLISTFROM="BCONSOLE"
  GETLISTFROM="MYSQL"

  # get list to prune
  if [[ "${GETLISTFROM}" == "BCONSOLE" ]] ; then
    DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g'`
    echo "Using bconsole"
  elif [[ "${GETLISTFROM}" == "MYSQL" ]] ; then
    DELETELIST=`mysql --database=bacula --column-names=FALSE -e "select VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;" | sed -e 's/[ ]*|[ ]*//g'`
    echo "Using mysql"
  fi
  if [[ -z "${DELETELIST}" ]] ; then
    echo "No records found earlier than ${DATEFROM}"
    exit 1
  fi
  #echo -e "${DELETELIST}"
  echo  "${DELETELIST}"
  echo
  echo "WARNING: IT WILL DESTROY THAT FILES ON THE DISK"
  echo "Are you sure you want to proceed?"
  read -p 'Type YES if you really want to proceed: ' input
  echo
  if [[ ${input} != YES  ]]; then
    echo "Ok. Aborting."
    exit 1
  fi

  echo -e "${DELETELIST}" | xargs -I '{}' echo delete yes volume='{}' | bconsole
  echo -e "${DELETELIST}" | xargs -I '{}' echo "rm ${BACKUPFOLDER}/"'{}' | while read LINE ; do echo "${LINE}"; "${LINE}"; done

Bacula. Fatal error: Uncaught exception 'Zend_Exception' with message 'Fatal error: Can't connect to SQL server'

Изначально Система резервного копирования строилась по этой статье:


Развертывание Bacula в малом офисе 

Все работает по статье нормально.

НО что у меня объем хранилища 4ТБ, а объем данных более 2 ТБ. В итоге приходится чистить базу и запускать бэкап заново

Однажды после такой чистки получил  ошибку:


Fatal error: Uncaught exception 'Zend_Exception' with message 'Fatal error: Can't connect to SQL server' in /var/www/webacula/html/index.php:178
Stack trace:
#0 {main}
  thrown in /var/www/webacula/html/index.php on line 178

проблема с SQL server
 
проверяем место на жестком диске

user@bacula:/$ df -h
Файл.система                Размер Использовано  Дост Использовано% Cмонтировано в
/dev/mapper/bacula--vg-root    71G          67G     0          100% /
udev                          994M         4,0K  994M            1% /dev
tmpfs                         201M         736K  200M            1% /run
none                          5,0M            0  5,0M            0% /run/lock
none                         1004M            0 1004M            0% /run/shm
/dev/sda1                     236M          35M  189M           16% /boot
overflow                      1,0M            0  1,0M            0% /tmp
/dev/sdb1                     2,5T          62G  2,3T            3% /mnt/bacula
 


подозрительно

/dev/mapper/bacula--vg-root    71G          67G     0          100% /

ищем самую большую папку

user@bacula:/$ sudo du -s * | sort -nr | head

получили 
 
64186796        mnt
2844792         var
870928          usr
213648          lib


user@bacula:/var/lib$ sudo du -s * | sort -nr | head
2373428 mysql
120132  apt
56068   mlocate
34008   postgresql
29968   dpkg
8036    aptitude
3488    aspell
2072    apt-xapian-index
1648    bacula

в итоге нашел файл


user@bacula:/var/lib$ sudo ls -la  /var/lib/mysql/ibdata1
-rw-rw---- 1 mysql mysql 2418016256 дек.  26 17:52 /var/lib/mysql/ibdata1


что такое ibdata1 нашел здесь

Второй параметр – задаёт размещение файла ibdata1 (т.к. путь не указан – будет использоваться “хранилище” MySQL – /var/lib/mysql )

ibdata1 увеличился видимо, когда /mnt/bacula не был примонтирован

не запускался MySql






в итоге удалил 
ibdata1 и логи

после этого 
запускался MySq

но webacula не запустился

было решено пересоздать базу bacula и таблицы webacula по статье

выполнить команды:
 
Если после наших эксперементов нам нужно удалить все тестовые джобы, делаем это так:
$ mysql -u root -p
mysql> drop database bacula;
mysql> quit

$ dpkg-reconfigure bacula-director-mysql
Мы уничтожили базу данных, а затем создали ее вновь. Осталось удалить сами файлы томов.
 и
Далее создаем таблицы Webacula, пользователей и роли:
$ cd install/MySql
$ ./10_make_tables.sh
$ ./20_acl_make_tables.sh


после этого система заработала





вторник, 13 сентября 2016 г.

USB-Keyboard with Arduino


http://blog.petrockblock.com/2012/05/19/usb-keyboard-with-arduino-and-v-usb-library-an-example/



https://florianfries.me/en/arduino-as-a-keyboard.html




http://www.vladcazan.com/electronics/arduino-keyboard-emulator
http://robocraft.ru/blog/1002.html


Arduino как HID-устройство


Необходимо перепрошить mega8u2
















взято с https://vk.com/blynk

Немного предистории:
Посте того, как сгорел мой "ноутбук", я вспомнил про свой старый системник (точнее материнку и блок питания).
Достав его из кучи барахла, заметил что кроме мышки нету никакого устройства ввода, немного посидел,и начал рыть инет. Так как у меня в асоррименте только Arduino UNO R3 смотрел статьи только с ней. Многие делают клавиатуру на Arduino micro (ну там все просто).

В поисках наткнулся на статью где ардуино играет в 2048. Так как для упавления игрой надо нажимать клавиши, нужно превратить ардуино в клавиатуру.То что надо!


Приступим:

Нам понадобится:
  • Arduino UNO R3
  • Перемычка
  • Arduino IDE
  • Фирменная утилита Atmel – Flip
  • Архив с прошивками и примером + библиотека
Цель: написать скетч для Arduino UNO, который будет эмулировать нажатие клавиш стрелок на клавиатуре.
Алгоритм наших действий:
  • Пишем скетч с нужным функционалом и заливаем в МК ATmega328
  • Прошиваем загрузчик Arduino, usb контроллер ATmega16U2
Для эмулирования нажатий клавиш я использовал библиотеку HIDKeyboard.
Что ж теперь переходим к самому интересному – будем превращать Arduino UNO в HID устройство, а конкретней в USB клавиатуру.
Немного теории.
Прошивка загрузчика — для начала нужно перевести Arduino в режим Device Firmware Update или в более часто используемом варианте DFU. Он служит для перепрошивки контроллера выполняющего роль конвертера serial to usb.
Как известно, основное отличие Arduino UNO от предыдущих моделей плат Arduino заключается в наличие второго контроллера ATmega8U2, на смену аппаратному конвертору USB <-> COM (FT232R). Преимуществом данного решения является возможность замены прошивки в интерфейсном контроллере с целью эмуляции произвольного устройства при подключении Arduino к ПК (накопителя, hid-устройства и т.д.). Как это сделать? У интерфейсного контроллера имеется режим DFU – прошивка контроллера ATmega8U2 через подключение через USB. Почти как прошивка центрального контроллера Arduino. Для этого можно воспользоваться фирменной утилитой Flip. Для того чтоб перевести контроллер в этот режим программирования потребуется небольшая аппаратная модернизация Arduino.
Для  Arduino UNO R3 достаточно поставить перемычку.


После этих действий компьютер обнаружит новое устройство и попытается самостоятельно поставить драйвера, но у него ничего не получится. Настало время установить фирменную утилиту Flip от Atmel. Открываем диспетчер задач и видим новое устройство Arduino Uno DFU.

Выберем драйвер из папки недавно установленной утилиты FLIP. В итоге у нас появится новое устройство – ATmega16U2. В дальнейшем при подключении Arduino, устройство будет определять как USB устройство. Теперь нам следует залить HEX файл с инструкциями USB клавиатуры. Чтоб компьютер в дальнейшем распознавал нашу Arduino как usb клавиатуру. Запускаем FLIP.


  • Выбираем в меню Device > Select > ATmega16U2
  • Выбираем в меню Setting > Communication > USB
  • Жмем Open берем прошивку
  • Приступаем к прошивке, жмем Run
По окончании процесса прошивки можно закрыть программу и проверить, как работает устройство. В итоге мой Arduino успешно играл в 2048 почти неделю. Даже на ночь его не выключал. В подтверждение вот мой результат.

Вот так можно превратить Arduino UNO в HID-устройство. Кстати можно не только играться в игры но и разыграть друга, подключив к его компьютеру устройство, которое запустит блокнот и будет писать там анекдоты, либо запускать команды, ведь клавиатура это главный пульт управления компьютером. К сожалению нельзя применить этот метод к плате Arduino Nano. Как уже говорилось ранее – второй контроллер Arduino UNO (ATmega8U2) используется в роли конвертера USB to Serial для определения компьютером Arduino UNO как USB устройство. Можно сделать вывод: реализовать этот метод, без посторонних устройств, возможно лишь при наличии на плате Arduino микроконтроллера запрограммированного как USB-to-serial конвертер. Но что делать, если у вас Arduino Nano или иная плата без конвертера USB to Serial? В таком случае можно купить отдельно конвертер подобный этому.

Чтобы вернуть Arduino UNO к жизни надо перепрошить ATmega16U2
Найти прошивку можно тут:
C:\Program Files\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2
На всякий случай собрал весь софт который использовал в

  - Arduino-HID-Bot-2048.ino - Скетч для Arduino UNO для игры в 2048.
   
  - Arduino-keyboard.hex       - этот hex файл заливаем при помощи FLIP для перевода arduino
в режим USB клавиатуры (но сначала нужно залить основной скетч).

прошиваем вот так!


шьем по isp

делаем клавиатуру

avrdude -p m16 -b 19200 -F -P COM4 -c avrisp -U flash:w:Arduino-keyboard-0.3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m




"-p m16" это код atmega16u2


делаем копию arduino uno R3

avrdude -p m328p -b 19200 -c avrisp
 -P COM13 -e -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex

   
  - Arduino-usbserial-uno.hex - этот файл нужен для того чтоб обратно вернуть Arduino UNO
в стандартный режи работы, чтоб она определялась в ПК как виртуальный COM-порт
в котром мы можем загружать скетчи. 
https://vk.com/doc5127466_437873517

http://www.atmel.com/tools/FLIP.aspx


 Дополнительно:

Arduino UNO R3 Mouse HID

 http://pythoneiro.blogspot.ru/2015/04/transformando-seu-arduino-uno-em-um-usb.html