String Elixir/Erlang运行并与外部可执行文件通信

String Elixir/Erlang运行并与外部可执行文件通信,string,erlang,elixir,String,Erlang,Elixir,我的elixir脚本似乎被外部可执行文件返回的数据阻塞了 此程序接受两个参数并返回摘要字符串 > # Usage: signer [datahex] [privatehex] > ./signer 64bd... b3bd... > 3a9c2e0220540ea2d2edbe18... 我可以手动运行,效果很好 但当我使用elixir/erlang代码运行它时: "signer test string" |> String.to_char_list |> :

我的elixir脚本似乎被外部可执行文件返回的数据阻塞了

此程序接受两个参数并返回摘要字符串

> # 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的现有文件。因此,我认为问题不在于调用本身,但我知道什么?

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

如果要通过字符串测试,可以使用
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")])

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

如果要通过字符串测试,可以使用
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")])

这是否有效:
System.cmd(“签名者”、“测试”、“字符串”)
?为了确保这一点,
/signer test string
是否可以手动工作?是否可以工作:
System.cmd(“signer”,“test”,“string”)
?为了确定,
/signer测试字符串
是否手动工作?