【问题标题】:Elixir / Erlang run and communicate with external executableElixir / Erlang 运行并与外部可执行文件通信
【发布时间】:2017-05-11 14:24:32
【问题描述】:

我的 elixir 脚本似乎卡住了外部可执行文件返回的数据。

这个signer 程序接受两个参数并返回一个摘要字符串。

> # Usage: signer [datahex] [privatehex]
> ./signer  64bd...  b3bd...
> 3a9c2e0220540ea2d2edbe18...

我可以手动运行它,效果很好。

但是当我用这个 elixir/erlang 代码运行它时:

"signer test string" |> String.to_char_list |> :os.cmd

它给出了一个错误:

'2017/05/11 07:16:44 编码/十六进制:无效字节:U+0074 \'t\'\n'

那么我怎样才能让 :os.cmd 不阻塞返回的字符串呢?我需要以某种方式转换它吗?

编辑:

我认为告诉你我能够让它与其他程序一起正常工作可能很重要:

"notepad test.txt" |> String.to_char_list |> :os.cmd

导致记事本打开当前工作目录中名为 test.txt 的现有文件。所以我认为问题不在于调用本身,但我知道什么?

【问题讨论】:

  • 这行得通吗:System.cmd("signer", ["test", "string"])?为了确定,./signer test string 是否手动工作?

标签: string erlang elixir


【解决方案1】:

程序在您通过“测试”时接受十六进制字符串,导致其解码器在第一个字符t 处失败,这不是有效的十六进制字符。您需要传递有效的十六进制字符串。

如果您打算按字面意思传递字符串test,则可以使用Base.encode16

"signer #{Base.encode16("test")} #{Base.encode16("string")}" |> String.to_char_list |> :os.cmd

我还建议在此处使用System.cmd 以获得更短、更简洁的代码以及更少意外创建命令注入漏洞的机会:

System.cmd("signer", [Base.encode16("test"), Base.encode16("string")])

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2018-03-04
    • 2013-08-27
    • 2010-12-21
    • 2012-10-24
    • 2013-08-07
    相关资源
    最近更新 更多