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
そこで、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
- 関連記事
-
- Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GCCでビルド
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (3)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (2)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (1)
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCで'kensa'プログラムをビルド
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCを使えば事足りるのかも
- RZマイコン基板(CEV-RZ/A1L) | CEV Linux SDK V2.00.00がリリースされていた
- Win/Linuxクロス開発 | WindowsからVMware Player上のUbuntuのコマンドを実行
- Win/Linuxクロス開発 | e2studioからsamba経由でCEV Linux SDKのソースコードにアクセス
- Win/Linuxクロス開発 | VMware Playerの共有フォルダではCEV Linux SDKをビルド出来ない
- Win/Linuxクロス開発 | WindowsのフォルダをVMware Player上のUbuntuの~/下に割り当て
- Win/Linuxクロス開発 | WindowsとVMware Player上のUbuntuでWindowsのフォルダを共有
- Win/Linuxクロス開発 | Ubuntuのコマンドプロンプトを起動時に自動的に開くようにした
- Win/Linuxクロス開発 | 旧型PCにVMware Player 3.1.6 + Ubuntu 12.04.2をインストール
- Win/Linuxクロス開発 | 旧型PCにはVMware Player 5.0.2をインストール出来ない
2013/11/25 blog-entry-369 category: Pleiades & CrossGCC
| h o m e |