xdotool или как сделать что-то ничего не делая

28 Июл
2012

Доброй ночи Блогавчане,

Ночь на дворе, вдали видно огни телевышки, работы почти нету, ну просто романтика. Вот я и решил написать статейку.

На использование xdotool наткнулся случайно изобретая «велосипед». Причиной использования этой утилиты стала лень, да-да «лень двигатель прогреса». Чем меньше хочешь работать, тем больше выдумываешь всяких скриптов, чтобы они выполняли за тебя работу.

Итак начнем.

Работаю на одну хостинговую компанию (маленькую, сейчас 40+ серверов) и стало все больше лень заходить на сервера посредством набора команд «ssh root@IP». Так как сначала серверов было около 20, но время шло, а серверов ставало больше, а когда ты их мониторишь, то желательно, чтоб они все у тебя были «навиду». Так вот, проблема входа стала ребром, так как при пересменке надо было заходить на все серваки, дабы не случилось чего плохого. Посидев с сотрудниками подумали написать какой-то скрипт, чтобы он сам входил на все серваки. Так как я совсем не прогер, то за дело взялись сотрудники, которые шарят в программировании. И вот не прошло пару недель как родился скрипт:

screen -d -m gnome-terminal --profile="Default" --tab -t "s1" -e "ssh -t uateam@jump.server ssh -t root@server1"


P.S. не буду показывать весь скрипт, так как там почти одно и тоже.

Ой, забыл сказать, не все так просто было. У нас есть так cказать «jump» сервер, только он имеет доступ к другим серверам используя пользователя root. То есть, чтобы попасть на нужный сервер надо было:
1) Зайти на jump сервер
2) С jump сервера зайти на нужный сервер

Ключики все были, то есть пароли вводить не надо было и еще упустили пунк (1) путем прописния в настройках gnome-terminal команды, которая входить на jump сервер сразу же при открытии терминала и последующих его вкладоках.

Все было хорошо, протестили с 5ма серверами, все заходит и работает просто отлично, но когда прописали все сервера наткнулись на «подводные камни».

P.S. так как было 3 подвида серверов, то есть шаровые, реселлеры и ВПСы, мы открывали отдельно 3 окна терминала.

И вот «камешком» стала опцыя в конфиге SSH’а на jump сервере (доступ к которому у нас был ограничен), которая ограничивала открытие терминалов <=10 с одного запроса (уже не помню как точно называлась). Попробовали реализовать команду sleep в коде, дабы сделать задержку, но она почему-то не работала, как я понимаю это все изза того, что действие проходит уже из-под gnome-terminal. Ковыряли, но в результате так и забили, и начали использовать имеющий скрипт, который открывал по 10 серваков в одном терминале, а потом руками надо было мувать вкладки (ну конечно, кто хотел тот мувал, кто не хотел тот смотрел в 5 окон сразу).
Но я упорно не хотел руками мувать вкладки и сам себя заставлял руками прописывать каждый раз ssh root@server#, дабы заставить себя найти решение той проблемы или написать свой скрипт.

И тут в один прекрасный день я все же себя заставил поковыряться в том скрипте (наверное погода была хорошая). Убил 2 часа, но так и не нашел как решить проблему, потом случайно наткнулся на xdotool (да-да, об этом стаття). Прочитал, вроде все так просто, прописал строку и нажалась одна клавиша (сначала хотел чтобы печатались полные названия команд, а потом понял, что это очень геморно). Пошивилив извилинами включился режим «чем проще, тем лучше», и тут на мысль пришли горячие клавиши gnome-terminal. Так как я их раньше использовал для ручного ввода, то сильно не пришлось думать, какие наборы прописать в скрипте. И вот что родилось:

#!/bin/bash
gnome-terminal;
WID=`xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'`;
export WID;
xdotool windowfocus $WID;
xdotool type "ssh root@server";
xdotool key Return;
xdotool key "ctrl+m";
xdotool type s;
xdotool key Return;


Гордился сам собой все больше и больше по мере усовершенствования своего скрипта.

В процессе написания столкнулся с проблемой клавиши Enter, то она работала, то она не работала, но в конце заработала так и не поняв в чем была причина.

И вот первый тест с 10 серверами, запускаю скрипт, и вдруг мне захотелось вставить свою флэшку (не помню почему), открылось окно с содержимим флэшки и в нем же начали октрываться подобные вкладки (в мозге пролетела мысль: «прикольная шняжка»). И тут я зразу же понял, что xdotool работает с активным окном. Почесав репу дошел до того, чтобы запустить полноценный скрипт надо, чтобы в момент выполнение все программы, которые могли помешать (даже Skype с дилоговыми всплываниями) должны быть выключены.
Тесты шли, работа шла, скрипт работал и я соответственно радовался. В конце концов родилось детище, которое открывало 19 серверов (соответствено за некоторое время):

#!/bin/bash
#Shared Servers
gnome-terminal;
WID=`xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'`;
export WID;
for i in {1..19} 
do
WID=`xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'`;
export WID;
xdotool windowfocus $WID;
xdotool type "ssh root@server${i}";
xdotool key Return;
xdotool key "ctrl+m";
xdotool type s${i};
xdotool key Return;
sleep 1;
WID=`xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'`;
export WID;
xdotool key "ctrl+n"
sleep 2;
done;
sleep 2;
xdotool key "ctrl+d"
xdotool windowsize --usehints $WID 300% 100%


Не знаю почему, но люблю когда все работает и выглядит красиво без особых затрат времени и усилий
Может некоторые части скрипта вовсе и не надо, но на стадии теста я их ввел и выводить не собираюсь.
Так как я не программист (хочу что-то писать, но не могу никак определиться что учить), хотя чесно говоря мне нравиться писать что-то свое, то мой скрипт на мое мнение не очень уж и плохой.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх