当前位置: 首页 > 面试题库 >

如何使用Shell脚本作为Chrome Native Messaging主机应用程序

张和颂
2023-03-14
问题内容

如何使用bash脚本处理Chrome Native Messaging API调用?

在此示例中,我使用python成功完成了此操作

当然可以使用调用bashpython代码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命令