なんとかなるさね

マイコンをネタにブログを始めてみました


Win/Linuxクロス開発 | WindowsからVMware Player上のUbuntuのコマンドを実行 

VMware Playerのヘルプによると、ハードウェア仮想化されたCOMポートを使用出来ることになっています。
そこで、VMware Player上のUbuntu側でCOMポートへ入出力をリダイレクトしたshを起動し、Windows側で
ハードウェア仮想化されたCOMポート(Windowsの名前付きパイプとして扱える)と通信するスクリプトを実行
することで、WindowsのコマンドプロンプトからVMware Player上のUbuntuのコマンドを実行してみました。
(なお、スクリプトは、Windowsに標準搭載されているスクリプト言語のJScriptで記述しました。)

VMware Player上のUbuntuでshを起動(入出力にCOM2を使用):

sh < /dev/ttyS1 > /dev/ttyS1 2> /dev/ttyS1

Windowsのコマンドプロンプトでスクリプトの引数にパイプ名とUbuntuのコマンドを指定して実行(例):

cscript -nologo vmwshdo.js \\.\pipe\vmware-serial-port make

試してみた画面は以下の通りです。





スクリプトは以下の通りです。

vmwshdo.js

// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;

var VMwareSerialPortPipe = WScript.Arguments(0);

fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.GetFile(VMwareSerialPortPipe);

// コマンドの送信(実行終了の目印に[[[END]]]が来るよう" ; echo [[[END]]]"を付加して送信する)
while (1)
{
    try
    {
        ts = f.OpenAsTextStream(ForAppending, TristateFalse);
        break;
    }
    catch(e)
    {
        continue;
    }
}
str = "";
objArgs = WScript.Arguments;
for (i = 1; i < objArgs.length; i++)
{
    str += objArgs(i) + " ";
}
ts.WriteLine(str + "; echo [[[END]]]");
ts.Close();

// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
while (1)
{
    try
    {
        ts = f.OpenAsTextStream(ForReading, TristateFalse);
        break;
    }
    catch(e)
    {
        continue;
    }
}
while (1)
{
    while (ts.AtEndOfStream)
    {
        WScript.Sleep(100); // ms
    }
    str = ts.ReadLine();
    if (str == "exit ; echo \[\[\[END\]\]\]")
    {
        // exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
        break;
    }
    if (str.search(/ ; echo \[\[\[END\]\]\]$/) != -1)
    {
        // コマンドのエコーバックは画面に表示しない
        continue;
    }
    else if (str.search(/^\[\[\[END\]\]\]/) != -1)
    {
        // コマンドの実行終了の目印の[[[END]]]が来たら終了
        break;
    }
    // コマンドの実行結果を画面に表示
    WScript.Echo(str);
}
ts.Close();

WScript.Quit(0)


なお、最初、Ubuntuで/dev/ttyS1のパーミッションが許可されていませんでしたので、以下を実行しました。

chmod o+rw /dev/ttyS1

また、スクリプトでは漢字コードの変換をしていませんので、Windowsのコマンドプロンプトで表示すると
Ubuntuの日本語メッセージが文字化けします。実行例では、途中でUbuntuの以下のコマンドを実行して英語
表示に切り替えてしまうことで、日本語メッセージが表示されないようにしてあります。

export LANG=en_US

関連記事

2013/11/25   blog-entry-369   category: Pleiades & CrossGCC

go page top