作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

VirtulBox Manager

VirtulBoxをシェル(bash)から対話型で操作するためのスクリプトです。ヘッドレス(GUIなし)で起動したり終了することができます。SSH接続で利用することを想定しています。

実行環境:macOS(bash 5.0.17)、VirtualBox 6.0

実行画面

VirtualBoxにインストールしてあるOSとそのステータスの一覧を取得し表示します。起動と終了のみ操作することができます。SSH接続して使う場合に便利だと思います。

$ ./vbmanger.sh
================================
       VirtualBox Manager       
================================
1) fedora29 powered off
2) Arch     powered off
3) Mint19   running
--------------------------------
*) Any other key to exit
================================
P<no>: Power on <OS-no>
S<no>: Shutdown <OS-no>
Input P<OS-no> | S<OS-no> : s3
Waiting for VM Mint19 to shutdown...

VirtualBox Managerのコード

筆者はmacOSで利用していますが、bashの基本的なコマンドをGNUコマンドに書き換えてます。もしかしたら、BSDのままでは動かないかも知れません。その時は修正してください。

#!/bin/bash

declare -r DISTRO=($(vboxmanage list vms | sed -n 's/.*"\(.*\)".*/\1/p' | sort -f))

fn_main() {
  echo "================================"
  echo "       VirtualBox Manager       "
  echo "================================"

  fn_show_os

  echo "--------------------------------"
  echo "*) Any other key to exit"
  echo "================================"
  echo "P<no>: Power on <OS-no>"
  echo "S<no>: Shutdown <OS-no>"

  read -p "Input P<OS-no> | S<OS-no> : " power

  case $power in
    [Pp]*)
      fn_run_os
      ;;
    [Ss]*)
      fn_shutdown_os
      ;;
    *)
      ;;
  esac
}

fn_show_os() {
  num=1
  for i in ${DISTRO[@]}; do
    echo -n "$((num++))" # or $(num) and line 26
    echo -n ") $i	"	
    echo "$(vboxmanage showvminfo $i | sed -n 's/State: *\(.*\) (.*/\1/p')"
  done
}

fn_run_os() {
  num=$(echo "$power" | sed 's/^.//')
  for ((i=0; i<=${#distro[*]}; i++)); do
    if [ "$i" = "$(($num - 1))" ]; then
      vboxmanage startvm ${distro[$i]} --type headless &>/dev/null \
      && echo "Waiting for VM ${distro[$i]} to power on..." \
      || echo "${distro[$i]} is alerdy running."
      exit
    fi
  done
  echo "Selected OS was not found."
  exit
}

fn_shutdown_os() {
  num=$(echo "$power" | sed 's/^.//')
  for ((i=0; i<=${#DISTRO[*]}; i++)); do
    if [ "$i" = "$(($num - 1))" ]; then
      vboxmanage controlvm ${DISTRO[$i]} acpipowerbutton &>/dev/null \
      && echo "Waiting for VM ${DISTRO[$i]} to shutdown..." \
      || echo "${DISTRO[$i]} is not running."
      exit
    fi
  done
  echo "Selected OS was not found."
  exit
}

fn_main

# HASE Kazuaki <https://psipsina.jp>

更新情報

  • 作成日:2020-07-03
  • 作成日:2022-05-02