Этот баш-скрипт я написал так как был недоволен утилитой 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