如何使用bash脚本处理Chrome Native Messaging API调用?
在此示例中,我使用python成功完成了此操作
当然可以使用调用bash
python代码subprocess
,但是是否可以跳过python并bash
直接处理消息?
该 问题的
部分被读取JSON序列化消息到变量中。该消息使用JSON(UTF-8编码)进行序列化,并通过stdin以本机字节顺序开头为32位消息长度。
echo $*
仅输出: chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/
也有点像
read
echo $REPLY
什么都不输出 没有JSON消息的迹象。Python struct.unpack
为此使用。能做到bash
吗?
我建议不要将(bash)shell脚本用作本机消息传递主机,因为bash太有限而无用。
read
不带任何参数的参数将在终止之前读取整行,而本机消息传递协议指定前四个字节指定后续消息的长度(以本机字节顺序)。
Bash是用于处理二进制数据的可怕工具。read
命令的改进版本将指定-n N
参数,以在N
字符(注意:不是字节)之后停止读取并-r
删除某些处理。例如,以下代码将前四个字符存储在名为的变量中var_prefix
:
IFS= read -rn 4 var_prefix
即使您假定此方法将前四个字节存储在变量中(不是!),也必须将字节转换为整数。我是否已经提到过bash会自动丢弃所有NUL字节?这种特性使Bash成为完全有能力的本机消息传递主机时毫无用处。
您可以通过忽略前几个字节来解决此缺点,并在发现{
字符(JSON格式请求的开始)时开始解析结果。此后,您必须阅读所有输入,直到找到输入的结尾。您需要一个JSON解析器,该解析器在遇到JSON字符串的结尾时会停止读取输入。祝你好运。
只需使用echo -n
或即可生成输出printf
。
这是一个最小的示例,假定输入以a结尾}
,读取它(不进行处理)并返回结果。尽管此演示有效,但我
强烈建议不要使用bash,而应使用更丰富的(脚本)语言,例如Python或C ++。
#!/bin/bash
# Loop forever, to deal with chrome.runtime.connectNative
while IFS= read -r -n1 c; do
# Read the first message
# Assuming that the message ALWAYS ends with a },
# with no }s in the string. Adopt this piece of code if needed.
if [ "$c" != '}' ] ; then
continue
fi
message='{"message": "Hello world!"}'
# Calculate the byte size of the string.
# NOTE: This assumes that byte length is identical to the string length!
# Do not use multibyte (unicode) characters, escape them instead, e.g.
# message='"Some unicode character:\u1234"'
messagelen=${#message}
# Convert to an integer in native byte order.
# If you see an error message in Chrome's stdout with
# "Native Messaging host tried sending a message that is ... bytes long.",
# then just swap the order, i.e. messagelen1 <-> messagelen4 and
# messagelen2 <-> messagelen3
messagelen1=$(( ($messagelen ) & 0xFF ))
messagelen2=$(( ($messagelen >> 8) & 0xFF ))
messagelen3=$(( ($messagelen >> 16) & 0xFF ))
messagelen4=$(( ($messagelen >> 24) & 0xFF ))
# Print the message byte length followed by the actual message.
printf "$(printf '\\x%x\\x%x\\x%x\\x%x' \
$messagelen1 $messagelen2 $messagelen3 $messagelen4)%s" "$message"
done
我试图使用原子电子为Mac和Windows编写桌面应用程序。 我需要的是: 一个按钮。 当用户单击按钮时,它将运行以下shell(或python脚本): 结果将显示在文本区域中。 我试着使用[shelljs]和[yargs],但它似乎不适用于原子电子。 所有我想要的是使用JAVASCRIPT编写桌面应用程序(当然是GUI),调用一些脚本(shell 如有任何建议,将不胜感激,谢谢:)
拉斯宾(杰西)-root@RaspberryPi-腻子 在我输入的终端中 现在我得到了一个包含此代码的脚本 有一个cronjob每小时启动一次这个脚本 苏。一定有什么地方出错了。因为他将变量$finalanswer解读为nothing。 这意味着在此脚本之外定义的变量将不起作用? 我该如何解决这个问题?
问题内容: 我无法弄清楚这是怎么回事。当我在终端中运行它并输入密码时,什么也没发生,但是如果我在终端中单独运行每个命令,它就可以工作。谢谢! 问题答案: Command 启动一个交互式根外壳程序,但不会将当前外壳程序转换为根外壳程序。 做您想要的事情的成语与此类似(感谢@CharlesDuffy的额外注意): 这个想法是检查当前用户是否是root用户,如果不是,请使用以下命令重新运行同一命令
问题内容: 如何从Docker容器控制主机? 例如,如何执行复制到主机的bash脚本? 问题答案: 那真的取决于您需要该bash脚本执行的操作! 例如,如果bash脚本仅回显某些输出,则可以执行 另一种可能性是您希望bash脚本安装某些软件-例如要安装docker-compose的脚本。你可以做类似的事情 但是,此时,您真的必须深入了解脚本在做什么,以允许容器从容器内部对其主机授予特定权限。
如何从docker容器控制主机? 例如,如何执行复制到主机的bash脚本?
问题内容: 我需要使用执行一组Cassandra DB命令的nodeJS运行Shell脚本文件。有人可以帮我吗? db.sh文件内部: 问题答案: 您可以使用shelljs模块执行任何shell命令