我想用子命令发送几个字符virtualbox controlvm keyboardputscancode
。 virtualbox 期望的扫描码是IBM PC AT 设置 2 键盘扫描码,在我的例子中并不(总是)对应于例如显示的扫描码showkey -s
。
理想情况下,我想要一些可以包装到 bash 脚本中的东西,这样我就可以将任意字符串发送到虚拟机,例如:
virtualbox controlvm <vm> keyboardputscancode $(asc2sc "My String here")
asc2sc
我的 bash 脚本在哪里!
是否有“IBM AT Set 2”键盘的扫描码映射,我可以使用它,而无需自己生成它?遗憾的是,Oracle 对于具体细节非常模糊。
答案1
如果您只需要在虚拟机中支持单个键盘布局,那么最简单的方法是在脚本中对转换进行硬编码。
typeset -A scancodes
scancodes['1']='02 82' # press 1, release 1
scancodes['!']='2a 02 82 aa' # press left Shift, press 1, release 1, release left shift
…
# emit_scancodes VM STRING
emit_scancodes () {
typeset a=; typeset c string="$2"
while [ -n "$string" ]; do
c=${scancodes[${string:0:1}]
if [ -z "$c" ]; then
echo >&2 "Unsupported character: ${string:0:1}"
return 1
fi
a+=("$c")
string=${string:1}
done
for c in "${a[@]}"; do
virtualbox controlvm "$1" keyboardputscancode
# For long strings, you may need an additional short sleep here
done
}
如果您需要支持各种键盘布局,那么您可以利用 Linux 的控制台键盘映射Linux 控制台工具数据。这些文件包含类似以下的行
keycode 16 = q
keycode 2 = one exclam
然而,解析文件以构建转换表将是一项不小的工作量,而且我不知道它已经完成。