Этот баш-скрипт я написал так как был недоволен утилитой Virtual Machine Manager которая имеет ошибку и не поддерживает у меня соединения через ssh туннель и её нужно патчить после каждого обновления. Но главное, что меня раздражает это тормоза работы Virtual Machine Manager так как он получает много зачастую ненужной информации от всех виртуальных машин. Данный скрипт работает сравнительно быстро потому, что запрашивает на сервере только самое необходимое, а именно список запущенных машин и смещение vnc порта для каждой.
#!/bin/bash
# bash script to connect to virtual machine vnc port (over ssh tunnel)
# баш скрипт выводит список виртуальных машин и предлагает выбрать с какой соединиться по VNC
function GETVNCPORTS {
NODE=$1
echo -e "Reading info from \"${NODE}\"" >&2
awk -v node="${NODE}" '{print node" "$0}' < <(ssh -T "root@${NODE}" <<'END'
while read -r DOMAIN ; do PORT=`virsh vncdisplay "${DOMAIN}" | sed -e '/^[ \t]*$/d' | awk -F: '{printf "59%02d\n",$2}'`; [ -n "${PORT}" ] && echo "${PORT} ${DOMAIN}"; done < <(virsh list | sed -n '/^-\+$/,/^$/p' | sed -e '/^ *-\+ *$/d' | awk '{print $2}' | sed -e '/^[ \t]*$/d')
END
)
}
# file descriptions IPADDRES<spaces>group1<spaces>group2<spaces>groupN
# файл описывающий все хосты и группы в которые они входят
CONFIG=$(cat <<EOF
10.55.24.156 v03-a v_cluster all
10.55.24.157 v03-b v_cluster all
10.55.24.158 v03-c v_cluster all
10.55.24.159 v03-t all sergey
10.55.24.253 h01 all
10.55.24.249 s01-0 s_cluster all
10.55.24.251 s01-1 s_cluster all
EOF
)
HOSTGROUPS=`echo "${CONFIG}" | awk '{for (i=2;i<=NF;i++) {printf("%s\n", $i);}}' | sort -u`
while [ true ] ; do
PS3="Type a group number or 'q' to quit: "
select HOSTGROUP in ${HOSTGROUPS} ; do
if [ -n "${HOSTGROUP}" ] ; then
break
else
if [[ ${REPLY} =~ [Qq] ]] ; then
echo -e "Quit."
exit 0
fi
fi
done
LOOPLEVEL="1"
while [ "${LOOPLEVEL}" -eq "1" ] ; do
FULLLIST=""
# получить список хостов
while read HOST1 GROUPNAME ; do
echo -e "${GROUPNAME}"
FMT="ssh -L localhost:%d:localhost:%d -N root@%s& pid=\$!;sleep 2;vncviewer localhost:%d;kill \$pid;sleep 1;echo \" \" # %s(%s)\n"
ITEM=`GETVNCPORTS "${HOST1}" | awk -v fmt="${FMT}" -v hst="${GROUPNAME}" '{printf(fmt, $2, $2, $1, $2, $3, hst)}'`
FULLLIST=`echo -e "${FULLLIST}\n${ITEM}"`
done < <(echo -e "${CONFIG}" | awk -v group="${HOSTGROUP}" '{if ($0 ~ group) {print $1" "$2}}')
# убрать пустые строки
FULLLIST=`echo -e "${FULLLIST}" | sed -e '/^$/d'`
VMLIST=`echo -e "${FULLLIST}" | sed -e 's/^[^#]*# \([^ ]*\)$/\1/g' | sort`
if [ -z "${VMLIST}" ] ; then
echo -e "No VM is running on host group \"${HOSTGROUP}\""
LOOPLEVEL="0"
break
fi
PS3="Type a number or 'q' to return to previous menu, 'r' to reread list: "
select VMNAME in ${VMLIST} ; do
if [ -n "${VMNAME}" ] ; then
break
else
if [[ ${REPLY} =~ [Qq] ]] ; then
echo -e "Quit."
LOOPLEVEL="0"
break
elif [[ ${REPLY} =~ [Rr] ]] ; then
# next loop with reread
break
fi
fi
done
if [ -n "${VMNAME}" ] ; then
COMMANDSTR=`echo -e "${FULLLIST}" | sed -n 's/^\([^#]*\)# '${VMNAME}'$/\1/p'`
echo -e "${COMMANDSTR}"
eval "${COMMANDSTR}"
echo -e "All done."
fi
done
done
Рекоментация!Для соединения ssh будет требоваться аутентификация на удалённом сервере. Сделать это удобнее используя сертификаты. Чтобы каждый раз не открывать сертификат паролем стоит добавить их один раз в ssh-agent при помощи ssh-add /home/user001/.ssh/id_rsa