Administração de VirtualBox com ShellScript
Publicado por Ricardo Lino Olonca (última atualização em 25/08/2012)
[ Hits: 8.256 ]
Homepage: ricardoolonca.blogspot.com.br
Administração de máquina virtuais através de Shell Script usando Dialog. Inclui criação, manutenção, importação e exportação de máquinas virtuais; criação, manutenção e importação de discos e dvd virtuais; administração de snapshot; administração de até quatro interfaces de rede, número de cpus, quantidade de memória ram e de video, entre outros. Possui uma interface de menus.
Esse script foi feito para demonstrar como um script bash combinado com Dailog pode ser muito útil e conter uma aparência bem amigável.
#!/bin/bash # Administra um servidor VirtualBox através da linha de comando # Feito por Ricardo Lino Olonca em 22/08/2012 # Versao 0 # Checa se todas as dependências estão satisfeitas function depend(){ erro=0 which dialog 2>/dev/null >/dev/null if [ $? -ne 0 ] then echo O programa dialog não está instalado. echo 'Tente instalar o pacote dialog através do gerenciador de pacotes da tua distribuição Linux.' return 1 else which VBoxManage 2>/dev/null >/dev/null if [ $? -ne 0 ] then dialog \ --title 'Falta de dependência' \ --msgbox 'O programa VBoxManager não está instalado.\nTente instalar o pacote virtualbox-ose através do gerenciador de pacotes da tua distribuição Linux.'\ 6 40 return 2 else if [ ! -e /dev/vboxdrv ] then dialog \ --title 'Falta de dependência' \ --msgbox 'Está faltando o módulo do kernel para o VirtualBox.\nTente instalar o pacote virtualbox-ose-dkms através do gerenciador de pacotes da tua distribuição Linux.'\ 6 40 return 3 fi fi fi } # Lista as máquinas virtuais function listarvm(){ echo 'dialog --stdout \' > $$.listar.tmp echo '--title "Listagem das máquina virtuais" \' >> $$.listar.tmp echo '--menu "Escolha a máquina virtual:" \' >> $$.listar.tmp echo '0 0 0 \' >> $$.listar.tmp rodando=$(VBoxManage list runningvms | grep ^\" | cut -d"\"" -f2) for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2` do echo $rodando | grep $i > /dev/null if [ $? == 0 ] then echo "$i" "Executando..." \\ >> $$.listar.tmp else echo "$i" "Desligada" \\ >> $$.listar.tmp fi done chmod +x $$.listar.tmp >> /dev/null } # Configura o acesso via vnc na máquina virtual que sobe em segundo plano function segundo_plano(){ while true do porta=$( dialog --stdout \ --inputbox 'Porta de conexão remota ("0" para desabilitar o recurso):' 0 0 5900 ) if [ -z $porta ] then break elif [ $porta -eq 0 ] then VBoxHeadless -s $1 >> /dev/null 2>>/dev/null & break elif [ $porta -gt 1023 ] && [ $porta -lt 65536 ] then netstat -na | grep 0.0.0.0:$porta >> /dev/null if [ $? -eq 0 ] then dialog \ --title 'Porta em uso' \ --msgbox 'A porta está em uso. Escolha outra porta.'\ 6 40 else senha=$(dialog --stdout \ --title 'Senha de acesso' \ --passwordbox 'Digite a senha de acesso (deixe em branco ou cancele se não quiser senha):' \ 0 0 ) if [ -z $senha ] then VBoxHeadless -s $1 -n -m $porta >> /dev/null 2>>/dev/null & else VBoxHeadless -s $1 -n -m $porta -o $senha >> /dev/null 2>>/dev/null & fi break fi else dialog \ --title 'Porta inválida' \ --msgbox 'A porta deve ser um número entre 1024 e 65535.'\ 6 40 fi done } # Para, pausa e desliga a máquina virtual function parar(){ while true do case "$2" in "running") parar=$( dialog --stdout \ --title "Administração da máquina $1" \ --menu "Opções: " \ 0 0 0 \ Pausa 'Congela a VM' \ Reset 'Reinicia a VM "a força"' \ Desligar 'Desliga a VM "a força"' \ Salvar 'Faz a VM hibernar' \ Acpi 'Tenta desligar a VM de modo seguro') case $parar in "Pausa") VBoxManage controlvm $1 pause >> /dev/null sleep 3 return ;; "Reset") VBoxManage controlvm $1 reset >> /dev/null return ;; "Desligar") VBoxManage controlvm $1 poweroff >> /dev/null sleep 3 return ;; "Salvar") VBoxManage controlvm $1 savestate >> /dev/null 2 >>/dev/null sleep 3 return ;; "Acpi") VBoxManage controlvm $1 acpipowerbutton >> /dev/null 2 >>/dev/null dialog \ --sleep 5 \ --title "Aguarde a VM $1 desligar" \ --infobox 'Dependendo a máquina, isso pode demorar um pouco...' \ 0 0 return ;; *) return ;; esac ;; "paused" | "stopping") parar=$( dialog --stdout \ --title "Administração da máquina $1" \ --menu "Opções: " \ 0 0 0 \ Continuar 'Continuar a VM' \ Desligar 'Desliga a VM "a força"') case $parar in "Continuar") VBoxManage controlvm $1 resume >> /dev/null sleep 3 return ;; "Desligar") VBoxManage controlvm $1 poweroff >> /dev/null sleep 3 return ;; *) return ;; esac ;; "powered" | "saved" | "aborted") parar=$( dialog --stdout \ --title "Administração da máquina $1" \ --menu "Opções: " \ 0 0 0 \ Backgroud "Iniciar a VM $1 em segundo plano" \ Gui "Inicia a VM $1 em uma janela normal" \ Sdl "Iniciar a VM $1 em uma janela minimalista" ) case $parar in "Backgroud") segundo_plano $1 sleep 3 ;; "Gui") VBoxManage startvm $1 --type gui >>/dev/null 2>>/dev/null & sleep 3 return ;; "Sdl") VBoxManage startvm $1 --type sdl >>/dev/null 2>>/dev/null & sleep 3 return ;; *) return ;; esac ;; *) break ;; esac done } # Exporta uma máquina virtual function exportarvm(){ while true do arquivo=$(dialog --stdout \ --title 'Escolha o nome do arquivo (sem a extensão)' \ --inputbox 'Nome:' 0 0 "vm_exportada" ) if [ -z $arquivo ] then break elif [ -f $arquivo.ovf ] then dialog \ --title 'Arquivo existe' \ --msgbox "O arquivo $arquivo já existe." \ 6 40 else touch $$.out echo 'VBoxManage export ' $1 '-o ' $arquivo.ovf '> '$$.out > $$.export.tmp echo "rm $$.out" >> $$.export.tmp bash $$.export.tmp & sleep 3 while true do if [ -f $$.out ] then dialog \ --title 'Exportanto a vm' \ --sleep 1 \ --infobox `tail -1 $$.out | grep ^0` \ 0 0 else break rm $$.export.sh fi done fi done } # Cria um snapshot da máquina virtual function criarsnapshot(){ nome=$(dialog --stdout \ --title 'Escolha o nome do snapshot' \ --inputbox 'Nome:' 0 0 "Snapshot1" ) if [ -z $nome ] then echo > /dev/null else grep ^Snapshot $$.detalhes.tmp | grep $nome if [ $? -eq 0 ] then dialog \ --title 'Snapshot já existe' \ --msgbox 'Já existe um snapshot com esse nome' \ 16 40 else VBoxManage snapshot $1 take $nome if [ $? -ne 0 ] then dialog \ --title 'Erro!' \ --msgbox 'Houve um erro na criação do snapshot' \ 16 40 fi fi fi break } # Administração de snapshot function snapshot(){ while true do echo 'dialog --stdout \' > $$.snap.tmp echo '--title "Snapshot" \' >> $$.snap.tmp echo '--menu "Escolha a ação" \' >> $$.snap.tmp echo '0 0 0 \' >> $$.snap.tmp for i in $snap do echo $i Snapshot \\ >> $$.snap.tmp done echo 'Novo "Criar um novo snapshot"' >> $$.snap.tmp chmod +x $$.snap.tmp opcao=$(./$$.snap.tmp) if [ -z $opcao ] then break elif [ $opcao == "Novo" ] then criarsnapshot $1 else manutsnapshot=$( dialog --stdout \ --title "Administração do snapshot $opcao" \ --menu "Opções: " \ 0 0 0 \ Apagar 'Apagar este snapshot' \ Restaurar 'Restaurar este snapshot') case $manutsnapshot in "Apagar") if [ "${valor[5]}" = "powered" ] then VBoxManage snapshot $1 delete $opcao 2>/dev/null >/dev/null else dialog \ --title 'Desligue o servidor' \ --msgbox 'É necessário desligar o servidor virtual antes de apagar o snapshot' \ 10 40 fi break ;; "Restaurar") if [ "${valor[5]}" = "powered" ] then VBoxManage snapshot $1 restore $opcao 2>/dev/null >/dev/null else dialog \ --title 'Desligue o servidor' \ --msgbox 'É necessário desligar o servidor virtual antes de efetuar o restore do snapshot' \ 10 40 fi ;; *) break ;; esac fi done } # Escolhendo a interface que fará bridge function lanbridged(){ echo 'dialog --stdout \' > $$.lanbridged.tmp echo '--title "Lan real ' "$1" '" \' >> $$.lanbridged.tmp echo '--menu "Escolha a interface de rede real:" \' >> $$.lanbridged.tmp echo '0 0 0 \' >> $$.lanbridged.tmp for i in `ifconfig -a | grep Link\ encap | awk '{print $1}'` do ip=`ifconfig $i | grep Bcast | awk '{print $4}' | cut -d":" -f2` if [ -z $ip ] then echo else echo $i `ifconfig $i | grep Bcast | awk '{print $4}' | cut -d":" -f2` ' \'>> $$.lanbridged.tmp fi done chmod +x $$.lanbridged.tmp lanreal=$( ./$$.lanbridged.tmp ) # if [ -z $lanreal ] # then echo $lanreal # else # VBoxManage modifyvm $1 --nic$lan bridged --bridgeadapter$2 $lanreal >> /dev/null 2>>/dev/null # fi } # Configuração do cd na máquina virtual function confcddvd(){ listarcddvd echo Nenhum \'Retirar o Cd/Dvd\' '\' >> $$.cdv.tmp cdv=$( ./$$.cdv.tmp ) if [ -z $cdv ] then break elif [ $cdv == "Nenhum" ] then VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium emptydrive > /dev/null 2>/dev/null elif [ $cdv == "Cd_local" ] then VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium host:/dev/cdrom > /dev/null 2>/dev/null elif [ $cdv == "Novo" ] then importarcddvd if [ -n $arquivo ] then VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $arquivo > /dev/null 2>/dev/null fi else caminho=`VBoxManage list dvds | grep $cdv | awk '{print $2}'` VBoxManage storageattach $1 --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $caminho > /dev/null 2>/dev/null fi } # Configuração da rede function confrede(){ rede=$( dialog --stdout \ --title "Tipo de rede" \ --menu "Defina o tipo de rede. (Você não pode adicionar ou retirar interfaces com a máquina ligada)." \ 0 0 0 \ Nat 'A vm acessa tudo, mas ninguém acessa ela' \ Bridged 'A vm terá um ip da vlan real' \ Interna 'Rede apenas internamente, sem comunicação com a rede real' \ Hostonly 'A vm será acessada via roteamento para a interface virtual vboxnet0' \ None 'Cabo de rede desconectado' \ Ajuda 'Ajuda sobre as opções acima' ) } # Tela de ajuda na configuração de rede function ajudarede(){ echo 'Com Nat, a máquina virtual vai funcionar como uma aplicação na máquina real. Ela conseguirá acessar todo o mundo' > $$.ajuda.tmp echo 'externo com o ip da máquina real. Porém ninguém conseguirá acessá-la.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'Com Bridged, a máquina virtual vai ganhar um ip da rede local, acessará o mundo externo por esse ip, e todo' >> $$.ajuda.tmp echo 'poderão de conectar nela através desse endereço. Em outras palavras, ela será vista como uma máquina normal da' >> $$.ajuda.tmp echo 'rede local. Você terá que escolher em qual placa de rede real a máquina virtual estará pendurada.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'Com Interna, a máquina virtual terá acesso apenas a uma rede virtual que funciona apenas internamente na máquina' >> $$.ajuda.tmp echo 'real. Ela poderá se comunicar com outras máquina virtuais que também tenham acesso a essa rede virtual.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'Com Hostonly, a máquina ganhará um ip na rede virtual 192.168.56.0/24. A máquina real tem uma interface virtual' >> $$.ajuda.tmp echo 'com ip 192.168.56.1, que deverá ser o gateway padrão da máquina virtual. Em outras palavras, a máquina real' >> $$.ajuda.tmp echo 'atuará como um roteador, sendo necessário regras de firewall e/ou nat para que a máquina virtual possa' >> $$.ajuda.tmp echo 'comunicar com a rede real. As máquinas da rede real poderão se conectar a essa máquina virtual configurando' >> $$.ajuda.tmp echo 'rotas específicas, ou através de nat.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'None, desabilita a rede. É semelhante a retirar a placa de rede da máquina virtual.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp dialog \ --title 'Ajuda das opções de rede' \ --textbox $$.ajuda.tmp \ 0 0 } # Gerenciamento de uma máquina virtual específica. function detalhes_vm(){ while true do unset snap VBoxManage showvminfo $1 > $$.detalhes.tmp detalhes[1]='Sistema' valor[1]=`grep 'Guest OS:' $$.detalhes.tmp | awk '{print $3 $4 $5 $6 $7 $8 $9}'` detalhes[2]='Memória' valor[2]=`grep 'Memory size:' $$.detalhes.tmp | awk '{print $3}'` detalhes[3]='Vídeo' valor[3]=`grep 'VRAM size:' $$.detalhes.tmp | awk '{print $3}'` detalhes[4]='Cpu' valor[4]=`grep 'Number of CPUs:' $$.detalhes.tmp | awk '{print $4}'` detalhes[5]='Status' valor[5]=`grep 'State:' $$.detalhes.tmp | awk '{print $2}'` detalhes[6]='Rede\ 1' valor[6]=`grep 'NIC 1:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2` detalhes[7]='Rede\ 2' valor[7]=`grep 'NIC 2:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2` detalhes[8]='Rede\ 3' valor[8]=`grep 'NIC 3:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2` detalhes[9]='Rede\ 4' valor[9]=`grep 'NIC 4:' $$.detalhes.tmp | awk '{print $6" "$8" "$9" "$10" "$11}' | cut -d"," -f1-2` detalhes[10]='Audio' valor[10]=`grep 'Audio:' $$.detalhes.tmp | cut -d"(" -f2 | cut -d")" -f1` detalhes[11]='Cd/Dvd' valor[11]=`grep ^Controladora\ IDE $$.detalhes.tmp | awk '{print $5}' | head -1` detalhes[12]='HD' valor[12]=`grep ^Controladora\ SATA $$.detalhes.tmp | awk '{print $5}' | head -1` detalhes[13]='Boot' valor[13]=`grep ^Boot\ Device $$.detalhes.tmp | head -1 | cut -d" " -f4` detalhes[14]='Snapshot' for i in `grep -A 100 ^Snapshot $$.detalhes.tmp | grep Name |awk '{print $2}'` do snap=`echo -n $snap\ $i` done valor[14]=$snap detalhes[15]='Exportar' valor[15]='Exportar a máquina virtual' detalhes[16]='Excluir' valor[16]='Excluir a máquina virtual' menu_detalhes=0 echo 'dialog --stdout \' > $$.detalhes.tmp echo '--title "VM ' "$1" '" \' >> $$.detalhes.tmp echo '--menu "Escolha o item para alterar:" \' >> $$.detalhes.tmp echo '0 0 0 \' >> $$.detalhes.tmp for i in `seq 16` do echo "${detalhes[$i]}" "'""${valor[$i]}" "'" ' \'>> $$.detalhes.tmp done chmod +x $$.detalhes.tmp >> /dev/null menu_detalhes=$( ./$$.detalhes.tmp ) if [ -z "$menu_detalhes" ] then break else if [ "${valor[5]}" != "powered" ] then case $menu_detalhes in "Status") parar "$1" "${valor[5]}" ;; "Rede 1"|"Rede 2"|"Rede 3"|"Rede 4") lan=`echo $menu_detalhes | cut -d" " -f2` confrede case $rede in "Nat") VBoxManage controlvm $1 nic$lan nat >> /dev/null 2>>/dev/null VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null ;; "Bridged") lanreal=`lanbridged $1` VBoxManage controlvm $1 nic$lan bridged $lanreal setlinkstate$lan on >> /dev/null 2>>/dev/null ;; "Interna") VBoxManage controlvm $1 nic$lan intnet intnet setlinkstate$lan on >> /dev/null 2>>/dev/null VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null ;; "Hostonly") VBoxManage controlvm $1 nic$lan hostonly vboxnet0 setlinkstate$lan on >> /dev/null 2>>/dev/null VBoxManage controlvm $1 setlinkstate$lan on >>/dev/null 2>>/dev/null ;; "None") VBoxManage controlvm $1 setlinkstate$lan off >> /dev/null 2>>/dev/null ;; "Ajuda") ajudarede ;; *) break ;; esac ;; "Cd/Dvd") confcddvd $1 ;; "Snapshot") snapshot $1 ;; *) dialog \ --title 'Máquina em execução' \ --msgbox 'A máquina virtual precisa estar parada para que essa opção possa ser alterada' \ 10 40 ;; esac else case $menu_detalhes in "Status") parar "$1" "${valor[5]}" ;; "Sistema") tiposistema sistema=$( ./$$.sistema.tmp ) if [ -n $sistema ] then VBoxManage modifyvm $1 --ostype $sistema >> /dev/null 2>>/dev/null fi ;; "Memória") echo 'dialog --stdout \' > $$.sistema.tmp echo '--title "Memória Ram" \' >> $$.sistema.tmp echo '--menu "Defina o valor da memória Ram da VM:" \' >> $$.sistema.tmp echo '0 0 0 \' >> $$.sistema.tmp x=$((`free | grep Mem | awk '{print $2}'` / 4096)) i=0 mem=16 while [ $x -gt $mem ] do i=$(($i + 1)) mem=$(($mem * 2)) for i in 0 1 2 3 do mem1=$(($mem / 4 * $i)) mem2=$(($mem + mem1)) echo $mem2 'MB \' >> $$.sistema.tmp done done chmod +x $$.sistema.tmp sistema=$( ./$$.sistema.tmp ) if [ -n $sistema ] then VBoxManage modifyvm $1 --memory $sistema >> /dev/null 2>>/dev/null fi ;; "Vídeo") echo 'dialog --stdout \' > $$.sistema.tmp echo '--title "Memória de vídeo" \' >> $$.sistema.tmp echo '--menu "Defina o valor da memória de Vídeo:" \' >> $$.sistema.tmp echo '0 0 0 \' >> $$.sistema.tmp x=$((`free | grep Mem | awk '{print $2}'` / 20480)) i=0 mem=4 while [ $x -gt $mem ] do i=$(($i + 1)) mem=$(($mem * 2)) echo $mem 'MB \' >> $$.sistema.tmp done chmod +x $$.sistema.tmp sistema=$( ./$$.sistema.tmp ) if [ -n $sistema ] then VBoxManage modifyvm $1 --vram $sistema >> /dev/null 2>>/dev/null fi ;; "Cpu") echo 'dialog --stdout \' > $$.sistema.tmp echo '--title "Número de processadores" \' >> $$.sistema.tmp echo '--menu "Defina o número de processadores:" \' >> $$.sistema.tmp echo '0 0 0 \' >> $$.sistema.tmp x=$((`grep processor /proc/cpuinfo | wc -l`)) for i in `seq $x` do echo $i 'Cpu\(s\) \' >> $$.sistema.tmp done chmod +x $$.sistema.tmp sistema=$( ./$$.sistema.tmp ) if [ -n $sistema ] then VBoxManage modifyvm $1 --cpus $sistema --ioapic on >> /dev/null 2>>/dev/null fi ;; "Rede 1"|"Rede 2"|"Rede 3"|"Rede 4") lan=`echo $menu_detalhes | cut -d" " -f2` confrede case $rede in "Nat") VBoxManage modifyvm $1 --nic$lan nat >> /dev/null 2>>/dev/null ;; "Bridged") lanreal=`lanbridged $1` VBoxManage modifyvm $1 --nic$lan bridged --bridgeadapter$lan $lanreal >> /dev/null 2>>/dev/null ;; "Interna") VBoxManage modifyvm $1 --nic$lan intnet >> /dev/null 2>>/dev/null ;; "Hostonly") VBoxManage modifyvm $1 --nic$lan hostonly --hostonlyadapter$lan vboxnet0 >> /dev/null 2>>/dev/null ;; "None") VBoxManage modifyvm $1 --nic$lan none >> /dev/null 2>>/dev/null ;; "Ajuda") ajudarede ;; *) break ;; esac ;; "Audio") som=`VBoxManage showvminfo $1 | grep Audio | awk '{print $2}'` if [ $som == "enabled" ] then VBoxManage modifyvm $1 --audio none > /dev/null 2>/dev/null else VBoxManage modifyvm $1 --audio alsa > /dev/null 2>/dev/null fi ;; "Cd/Dvd") confcddvd $1 ;; "Boot") boot=$( dialog --stdout \ --title "Boot por" \ --menu "Opções: " \ 0 0 0 \ HD 'Primeiro hd' \ CD 'Drive de cd/dvd') if [ $boot == "HD" ] then VBoxManage modifyvm $1 --boot1 disk >/dev/null 2>/dev/null elif [ $boot == "CD" ] then VBoxManage modifyvm $1 --boot1 dvd >/dev/null 2>/dev/null fi ;; "Snapshot") snapshot $1 ;; "HD") listarhd echo 'Nenhum' \'Sem nenhum disco\' '\' >> $$.cdv.tmp hd=$( ./$$.cdv.tmp) if [ -z $hd ] then echo . >> /dev/null elif [ $hd == "Novo" ] then novohd $1 if [ $? == 0 ] then VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd >/dev/null 2>/dev/null fi elif [ $hd == "Nenhum" ] then VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium none >/dev/null 2>/dev/null else VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd >/dev/null 2>/dev/null fi ;; "Exportar") exportarvm $1 ;; "Excluir") dialog \ --title "AVISO \!\!\!" \ --yesno "Deseja realmente excluir a vm $1 ? Isso apagará todos os snapshot desta VM." \ 0 0 if [ $? -eq 0 ] then VBoxManage storagectl $1 --name "Controladora SATA" --remove > /dev/null 2>/dev/null VBoxManage storagectl $1 --name "Controladora IDE" --remove > /dev/null 2>/dev/null for i in `VBoxManage showvminfo $1 | grep -A 100 -i snapshot | grep Name | awk '{print $2}'` do VBoxManage snapshot $1 delete $i 2>/dev/null >/dev/null done VBoxManage unregistervm $1 --delete >> /dev/null 2>>/dev/null return fi ;; esac fi fi done } # Importa uma vm function importarvm(){ while true do arquivo=$( dialog --stdout \ --title 'Selecione o arquivo' \ --fselect ~ \ 10 55) if [ -z $arquivo ] then break elif [ -f $arquivo ] then VBoxManage import $arquivo 2>/dev/null >/dev/null break else dialog \ --title 'Arquivo não existe' \ --msgbox "O arquivo $arquivo não existe." \ 6 40 fi done } # Escolha do tipo de sistema operacional da nova máquina virtual function tiposistema(){ echo 'dialog --stdout \' > $$.sistema.tmp echo '--title "Tipo de sistema operacional" \' >> $$.sistema.tmp echo '--menu "Escolha o sistema operacional:" \' >> $$.sistema.tmp echo '0 0 0 \' >> $$.sistema.tmp VBoxManage list ostypes | grep ^ID | cut -d":" -f2 | sed s/" "/""/g | grep -v ^$ > $$.id.tmp VBoxManage list ostypes | grep ^Description | cut -d":" -f2 | sed s/" "/""/g | grep -v ^$ > $$.desc.tmp paste $$.id.tmp $$.desc.tmp | sed 's/$/ \\/g' | sed s/'('/"_"/g | sed s/')'/""/g >> $$.sistema.tmp chmod +x $$.sistema.tmp } # Criação de uma nova vm function novavm(){ while true do nomevm="$( dialog --stdout \ --inputbox 'Nome da nova vm:' 0 0 )" if [ -z $nomevm ] then break else nomevm=$(echo "$nomevm" | sed s/" "//g | sed s/[^a-zA-Z0-9]//g) VBoxManage list vms | grep \"$nomevm\" >> /dev/null 2>>/dev/null if [ $? -eq 0 ] then dialog \ --title 'Crição de vm' \ --msgbox 'Já existe uma vm com este nome'\ 6 40 else tiposistema sistema=$( ./$$.sistema.tmp ) if [ -n $sistema ] then VBoxManage createvm --name $nomevm --ostype $sistema >> /dev/null 2>>/dev/null VBoxManage registervm $HOME/.VirtualBox/Machines/$nomevm/$nomevm.xml >> /dev/null 2>>/dev/null else VBoxManage createvm --name $nomevm >> /dev/null 2>>/dev/null VBoxManage registervm $HOME/.VirtualBox/Machines/$nomevm/$nomevm.xml >> /dev/null 2>>/dev/null fi VBoxManage storagectl $nomevm --name "Controladora SATA" --add sata > /dev/null 2>/dev/null VBoxManage storagectl $nomevm --name "Controladora IDE" --add ide > /dev/null 2>/dev/null break fi fi done } # Gerencia as máquinas virtuais function listar(){ while true do listarvm echo "Nova 'Criar uma nova máquina virtual' \\" >> $$.listar.tmp echo "Importar 'Importar uma máquina virtual' " >> $$.listar.tmp menu_listar=$(./$$.listar.tmp) if [ -z $menu_listar ] then break else case $menu_listar in "Nova") novavm ;; "Importar") importarvm ;; *) detalhes_vm $menu_listar ;; esac fi done } # Lista os discos virtuais function listarhd(){ echo 'dialog --stdout \' > $$.cdv.tmp echo '--title "Hd virtual" \' >> $$.cdv.tmp echo '--menu "Escolha o hd virtual:" \' >> $$.cdv.tmp echo '0 0 0 \' >> $$.cdv.tmp VBoxManage list hdds | grep Location | grep -v Snapshot | awk '{print $2}' | cut -d"/" -f6 > $$.cdv2.tmp for i in `cat $$.cdv2.tmp` do usado_por=`VBoxManage list hdds | grep -A3 $i | grep Usage | awk '{print $2}'` if [ "a$usado_por" == "a" ] then echo $i \'Sem uso\' '\' >> $$.cdv.tmp else echo $i \'Usado por $usado_por\' '\' >> $$.cdv.tmp fi done echo 'Novo' \'Criar um novo disco\' '\' >> $$.cdv.tmp chmod +x $$.cdv.tmp } # Cria um novo disco virtual function novohd(){ while true do criarnovohd if [ -z $arquivo ] then break elif [ -f ~/.VirtualBox/HardDisks/$arquivo.vdi ] then dialog \ --title 'Arquivo já existe' \ --msgbox 'O arquivo já existe.'\ 6 40 else echo 'dialog --stdout \' > $$.sistema.tmp echo '--title "Tamanho do disco" \' >> $$.sistema.tmp echo '--menu "Defina o tamanho do disco:" \' >> $$.sistema.tmp echo '0 0 0 \' >> $$.sistema.tmp x=$((`df -hm /home | tail -1 | awk '{print $4}'`)) i=0 tam=40 while [ $x -gt $tam ] do i=$(($i + 1)) tam=$(($tam * 2)) for i in 0 1 2 3 do tam1=$(($tam / 4 * $i)) tam2=$(($tam + $tam1)) echo $tam2 'MB \' >> $$.sistema.tmp done done chmod +x $$.sistema.tmp tamanho=$( ./$$.sistema.tmp ) if [ -z $sistema ] then VBoxManage createhd --filename $arquivo.vdi --size $tamanho >/dev/null 2>/dev/null VBoxManage openmedium disk ~/.VirtualBox/HardDisks/$arquivo.vdi >/dev/null 2>/dev/null VBoxManage storageattach $1 --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$arquivo.vdi >/dev/null 2>/dev/null hd=$arquivo.vdi listarhd return 0 fi fi done } # Exclui uma hd virtual function excluirhd(){ dialog \ --title 'AVISO!!!' \ --yesno 'Deseja realmente excluir PERMANENTEMENTE o disco virtual?' \ 0 0 if [ $? -eq 0 ] then VBoxManage closemedium disk ~/.VirtualBox/HardDisks/$hd 2>/dev/null >/dev/null rm -f ~/.VirtualBox/HardDisks/$hd fi } # Retira um determinado hd de todas as vm function nenhumhd(){ for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2` do VBoxManage showvminfo $i | grep $1 2>/dev/null >/dev/null if [ $? == 0 ] then VBoxManage storageattach $i --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium none fi done } # Pede o nome de um novo hd function criarnovohd(){ arquivo=$(dialog --stdout \ --title 'Escolha o nome do novo disco virtual' \ --inputbox 'Nome:' 0 0 "Novo_disco" ) } # Clona um hd virtual function clonar(){ while true do criarnovohd if [ -z $arquivo ] then break elif [ -f ~/.VirtualBox/HardDisks/$arquivo ] then dialog \ --title 'Arquivo existe' \ --msgbox "O arquivo $arquivo já existe." \ 6 40 else VBoxManage clonehd ~/.VirtualBox/HardDisks/$hd ~/.VirtualBox/HardDisks/$arquivo >/dev/null 2>/dev/null VBoxManage openmedium disk ~/.VirtualBox/HardDisks/$arquivo >/dev/null 2>/dev/null break fi done } # Manutenção em hd virtual function hd(){ while true do hd=$( ./$$.cdv.tmp) if [ -z $hd ] then return elif [ $hd == "Novo" ] then novohd else id=`VBoxManage list hdds | grep -B3 $hd | head -1 | awk '{print $2}'` VBoxManage showhdinfo $id | tail -8 > $$.id.tmp dialog \ --title 'Detalhes do disco virtual' \ --tailbox $$.id.tmp \ 0 0 acao=$( dialog --stdout \ --title "Ação no disco" \ --menu "Escolha o tipo de ação no disco:" \ 0 0 0 \ 'Compactar' 'Compactar o hd virtual' \ 'Clonar' 'Copiar um disco disco' \ 'Excluir' 'Excluir o disco virtual' \ 'Associar' 'Associar a uma máquina virtual' \ 'Ajuda' 'Breve explicação sobre os menus acima') case $acao in "Compactar") VBoxManage modifyhd $id --compact > $$.compact.tmp & sleep 1 grep ^0%... $$.compact.tmp if [ $? -eq 0 ] then ps wax | grep $id | grep -v grep 2>/dev/null >/dev/null while [ $? -eq 0 ] do per=`grep ^0 $$.compact.tmp` dialog \ --title 'Compactando o disco virtual' \ --infobox $per \ 0 0 sleep 1 ps wax | grep $id | grep -v grep 2>/dev/null >/dev/null done else dialog \ --title 'Não é possível compactar o disco' \ --msgbox 'Não foi possível compactar o disco. Certifique-se de que ele não esteja em uso por alguma máquina virtual no momento.'\ 6 40 fi ;; "Clonar") clonar ;; "Excluir") VBoxManage list hdds | grep -A3 $hd | grep Usage 2>/dev/null >/dev/null if [ $? == 0 ] then dialog \ --title 'Não é possível excluir o disco' \ --msgbox 'Este disco está associado a uma máquina vitual. Antes de excluí-lo, é necessário retirá-lo da vm.'\ 6 40 else excluirhd fi ;; "Associar") listarvm vm=$( ./$$.listar.tmp ) if [ -z $vm ] then break elif [ $vm == "Nenhum" ] then nenhumhd $hd else VBoxManage storageattach $vm --storagectl "Controladora SATA" --port 0 --device 0 --type hdd --medium ~/.VirtualBox/HardDisks/$hd 2>/dev/null >/dev/null fi break ;; "Ajuda") echo 'O menu Comptactar é usado para reorganizar o disco virtual, diminuindo o espaço real dele.' > $$.ajuda.tmp echo 'É aconselhado fazer isso quando muitos arquivos são apagados na máquina virtual que utiliza esse disco.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Clonar você pode fazer uma cópia do disco, útil em migrações e para testar um sistema.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'O menu Excluir apaga o disco virtual.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Associar você pode conectar o disco virtual em uma máquina virtual.' >> $$.ajuda.tmp dialog \ --title 'Ajuda do menu Principal' \ --textbox $$.ajuda.tmp \ 0 0 ;; *) ;; esac listarhd fi done } # Lista os cd e dvd virtuais function listarcddvd(){ echo 'dialog --stdout \' > $$.cdv.tmp echo '--title "Cd virtual" \' >> $$.cdv.tmp echo '--menu "Escolha o cd virtual:" \' >> $$.cdv.tmp echo '0 0 0 \' >> $$.cdv.tmp VBoxManage list dvds | grep Location | cut -d"/" -f5 > $$.cdv2.tmp for i in `cat $$.cdv2.tmp` do usado_por=`VBoxManage list dvds | grep -A3 $i | grep Usage | awk '{print $2}'` if [ "a$usado_por" == "a" ] then echo $i \'Sem uso\' '\' >> $$.cdv.tmp else echo $i \'Usado por $usado_por\' '\' >> $$.cdv.tmp fi done echo 'Cd_local' 'Drive\ de\ cd\ do\ servidor' '\' >> $$.cdv.tmp echo 'Novo' 'Utilizar\ um\ novo\ cd/dvd\ virtual' '\' >> $$.cdv.tmp chmod +x $$.cdv.tmp } # Importação de cd e dvd virtuais function importarcddvd(){ while true do arquivo=$( dialog --stdout \ --title 'Selecione o arquivo' \ --fselect ~ \ 10 55) if [ -z $arquivo ] then break elif [ -f $arquivo ] then VBoxManage openmedium dvd $arquivo 2>/dev/null >/dev/null if [ $? -ne 0 ] then dialog \ --title 'Erro!!!' \ --msgbox "Não consegui anexar o cd/dvd virtual." \ 6 40 else break fi else dialog \ --title 'Arquivo não existe' \ --msgbox "O arquivo $arquivo não existe." \ 6 40 fi done } # Retira o cd de todas as vm's function nenhumcd(){ for i in `VBoxManage list vms | grep ^\" | cut -d"\"" -f2` do VBoxManage showvminfo $i | grep $1 > /dev/null 2>/dev/null if [ $? -eq 0 ] then VBoxManage storageattach $i --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium emptydrive > /dev/null 2>/dev/null fi done } # Manutenção em cd virtual function cdd(){ while true do cdv=$( ./$$.cdv.tmp ) if [ -z $cdv ] then return elif [ $cdv == "Novo" ] then importarcddvd else listarvm echo Nenhum \'Retirar de todos as Vms\' '\' >> $$.listar.tmp echo Excluir \'Exclui o cd/dvd virtual\' '\' >> $$.listar.tmp vms=$(./$$.listar.tmp) caminho=`VBoxManage list dvds | grep $cdv | awk '{print $2}'` if [ -z $vms ] then return elif [ $vms == "Nenhum" ] then nenhumcd $cdv elif [ $vms == "Excluir" ] then nenhumcd $cdv VBoxManage closemedium dvd $caminho > /dev/null 2>/dev/null else VBoxManage storageattach $vms --storagectl "Controladora IDE" --port 1 --device 0 --type dvddrive --medium $caminho > /dev/null 2>/dev/null fi fi listarcddvd done } # Gerencia os discos e unidades de dvd virtuais function discos(){ while true do discos=$( dialog --stdout \ --title "Tipo de midia" \ --menu "Escolha o tipo de midia:" \ 0 0 0 \ 'Cd virtual' 'Arquivo de imagem .iso' \ 'Hd virtual' 'Arquivo de disco virtual' \ 'Ajuda' 'Breve explicação sobre os menus acima' ) case $discos in "Cd virtual") listarcddvd cdd ;; "Hd virtual") listarhd hd ;; "Ajuda") echo 'No menu Cd Virtual você pode administrar os cds virtuais, criar, importar, excluir, etc.' > $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Hd Virtual você pode administrar os HDs virtuais, criar, assciá-los a uma VM, excluir, compactar, tirar snapshot, etc.' >> $$.ajuda.tmp dialog \ --title 'Ajuda do menu Discos' \ --textbox $$.ajuda.tmp \ 0 0 ;; *) break ;; esac done } # Checa se a máscara de subrede é válida function checamask(){ ipa=`echo $1 | cut -d"." -f1` ipb=`echo $1 | cut -d"." -f2` ipc=`echo $1 | cut -d"." -f3` ipd=`echo $1 | cut -d"." -f4` for i in $ipa $ipb $ipc $ipd do if [ $i != 0 ] && [ $i != 128 ] && [ $i != 192 ] && [ $i != 224 ] && [ $i != 240 ] && [ $i != 248 ] && [ $i != 252 ] && [ $i != 254 ] && [ $i != 255 ] then dialog \ --title 'Máscara inválida' \ --msgbox 'A máscara só aceita os valors 0, 128, 192, 224, 240, 248, 252, 254 e 255 no formato xxx.xxx.xxx.xxx.'\ 6 40 return 1 fi done return 0 } # Mensagem padrão para endereço ip inválido function erroip(){ dialog \ --title 'Ip inválido' \ --msgbox 'O ip só pode conter números entre 0 e 255 no formato xxx.xxx.xxx.xxx.'\ 6 40 } # Checa se o ip digitado é válido function checaip(){ ipa=`echo $1 | cut -d"." -f1` ipb=`echo $1 | cut -d"." -f2` ipc=`echo $1 | cut -d"." -f3` ipd=`echo $1 | cut -d"." -f4` for i in $ipa $ipb $ipc $ipd do echo $i | grep [^0-9] 2>/dev/null >/dev/null if [ $? == 0 ] then erroip return 1 elif [ $i -gt 255 ] || [ $i -lt 0 ] then erroip return 1 fi done return 0 } # Configuração do endereço ip function ip(){ while true do ip=$(dialog --stdout \ --title 'Digite o ip' \ --inputbox 'Ip' 0 0 "$ip" ) if [ -z $ip ] then return 1 fi checaip $ip if [ $? -eq 0 ] then return fi done } # Configuração da máscara de subrede function mask(){ while true do mask=$(dialog --stdout \ --title 'Digite a máscara de rede' \ --inputbox 'Máscara de sub-rede:' 0 0 "$mask" ) if [ -z $mask ] then return 1 fi checamask $mask if [ $? -eq 0 ] then return fi done } # Configuração da rota padrão function gw(){ while true do gw=$(dialog --stdout \ --title 'Digite o gateway padrão' \ --inputbox 'Default gateway:' 0 0 "$gw" ) if [ -z $gw ] then return 1 fi checaip $gw if [ $? -eq 0 ] then return fi done } # Configurção da rede function rede(){ while true do echo 'dialog --stdout \' > $$.rede.tmp echo '--title "Interfaces de rede" \' >> $$.rede.tmp echo '--menu "Escolha a interface de rede:" \' >> $$.rede.tmp echo '0 0 0 \' >> $$.rede.tmp ifconfig | grep encap | sed s/"Link encap"//g | awk '{print $1$2}'| sed s/":"/" "/g | sed 's/$/ \\/g' >> $$.rede.tmp chmod +x $$.rede.tmp rede=$(./$$.rede.tmp) if [ -z $rede ] then return else ip=`ifconfig $rede | grep inet | grep -v inet6 | awk '{print $3}'` mask=`ifconfig $rede | grep inet | grep -v inet6 | awk '{print $5}' | cut -d":" -f2` gw=`netstat -nr | grep ^0.0.0.0 | awk '{print $2}'` ip if [ $? -eq 0 ] then mask if [ $? -eq 0 ] then gw if [ $? -eq 0 ] then ifconfig $rede $ip netmask $mask 2>/dev/null >/dev/null route delete -net default 2>/dev/null >/dev/null route add -net default gw $gw 2>/dev/null >/dev/null fi fi fi fi done } # Configurações do servidor real. function servidor(){ while true do menu_servidor=$( dialog --stdout \ --title "Administração do Servidor" \ --menu "Opções: " \ 0 0 0 \ Update 'Atualização dos pacotes' \ Informacoes 'Informações sobre o status do servidor' \ Rede 'Configuração da rede' \ Console 'Acesso ao console do servidor' \ Ajuda 'Breve explicação sobre os menus acima') case $menu_servidor in "Update") clear apt-get update apt-get -y upgrade read ;; "Informacoes") dialog --no-shadow \ --sleep 1 \ --infobox 'Aguarde...' 12 40 --and-widget & cpu=`top -b -n 2 | grep Cpu | tail -1 | awk '{print $2}'` tarefas=`top -b -n 1 | grep Tasks | tail -1 | awk '{print $2}'` ioread=`iostat -dm 1 2 | grep -v ^$ | tail -1 | awk '{print $3}'` iowrite=`iostat -dm 1 2 | grep -v ^$ | tail -1 | awk '{print $4}'` swap=`free -m | tail -1 | awk '{print $3}'` free=0 y=`free -m | grep ^Mem | awk '{print $4" "$6" "$7}'` for i in $y do free=$(($free + $i)) done in1=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $2}' | cut -d":" -f2` / 1024)) out1=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $6}' | cut -d":" -f2` / 1024)) sleep 1 in2=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $2}' | cut -d":" -f2` / 1024)) out2=$((`ifconfig eth0 | grep 'RX bytes' | awk '{print $6}' | cut -d":" -f2` / 1024)) in=$(( $in2 - $in1 )) out=$(( $out2 - $out1 )) hora=`date "+%H:%M"` conn=`netstat -na | grep ESTAB | wc -l` echo "Hora: $hora" > $$.servidor.tmp echo "Tarefas: $tarefas" >> $$.servidor.tmp echo "Uso de cpu: $cpu" >> $$.servidor.tmp echo "Leitura de disco (Mb/s): $ioread" >> $$.servidor.tmp echo "Escrita em disco (Mb/s): $iowrite" >> $$.servidor.tmp echo "Uso de swap (Mb): $swap" >> $$.servidor.tmp echo "Inbound (eth0, Kb/s): $in" >> $$.servidor.tmp echo "Outbound (eth0, Kb/s): $out" >> $$.servidor.tmp echo "Conexões ativas (eth0): $conn" >> $$.servidor.tmp echo "Memória ram livre (Mb): $free" >> $$.servidor.tmp dialog \ --title 'Detalhes do servidor' \ --textbox $$.servidor.tmp \ 16 50 ;; "Rede") rede ;; "Console") clear read -p "Para voltar ao menu, digite 'Exit'. " -t 3 /bin/bash ;; "Ajuda") echo 'No menu Update você pode atualizar os programa via apt-get. É necessário estar logado como root' > $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Informações é mostrado um status do servidor, como uso de cpu, memória ram, espaço em disco, etc.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Rede é possível alterar as configurações de rede. Essas configurações serão perdidas no próximo boot.' >> $$.ajuda.tmp echo ' Para que as configurações fiquem permanentes, acesse o menu Console e altere o arquivo /etc/network/interfaces.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'O menu Console dá acesso ao console do servidor, permitindo fazer configurações e ajustes avançados.' >> $$.ajuda.tmp dialog \ --title 'Ajuda do menu Servidor' \ --textbox $$.ajuda.tmp \ 0 0 ;; *) break ;; esac done } # Programa principal depend if [ $? -ne 0 ] then exit 255 fi versao=`VBoxManage -v` while true do menu_principal=$( dialog --stdout \ --title "Administração do VirtualBox versão $versao" \ --menu "Opções: " \ 0 0 0 \ VMs 'Administrar as máquinas virtuais' \ Discos 'Administraçãos dos discos e imagens de cd e dvd' \ Servidor 'Administração do servidor' \ Ajuda 'Breve explicação sobre os menus acima') case $menu_principal in "VMs") listar ;; "Discos") discos ;; "Servidor") servidor ;; "Ajuda") echo 'No menu VMs você pode administrar as máquinas virtuais, criar, iniciar, congelar, excluir, etc.' > $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Discos você pode administrar os HDs e CDs virtuais, criar, assciá-los a uma VM, excluir, etc.' >> $$.ajuda.tmp echo "" >> $$.ajuda.tmp echo 'No menu Servidor você pode administrar o servidor real, obter informações, status, efetuar atualizações, etc' >> $$.ajuda.tmp dialog \ --title 'Ajuda do menu Principal' \ --textbox $$.ajuda.tmp \ 0 0 ;; *) rm $$.*.tmp > /dev/null 2>/dev/null break ;; esac done
Firewall do mikrotik, limitando icmp (ping)
Pequeno, simples mas interessante chat desenvolvido totalmente em shell script.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)