Pull to refresh

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

Доброй ночи Хабравчане,

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

На использование 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%


Не знаю почему, но люблю когда все работает и выглядит красиво без особых затрат времени и усилий
Может некоторые части скрипта вовсе и не надо, но на стадии теста я их ввел и выводить не собираюсь.
Так как я не программист (хочу что-то писать, но не могу никак определиться что учить), хотя чесно говоря мне нравиться писать что-то свое, то мой скрипт на мое мнение не очень уж и плохой.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.