0
votes

My elixir script seems to choke on the data that is returned by an external executable.

this signer program takes two arguments and returns a digest string.

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

I can run it manually and it works great.

But when I run it with this elixir/erlang code:

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

it gives an error:

'2017/05/11 07:16:44 encoding/hex: invalid byte: U+0074 \'t\'\n'

So how do I get :os.cmd not to choke on the returned string? do I need to convert it somehow?

EDIT:

I thought it might be important to tell you I'm able to get it to work fine with other programs:

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

results in notepad opening an existing file in the current working directory called test.txt. So I don't think the problem is with the call itself, but what do I know?

1
Does this work: System.cmd("signer", ["test", "string"])? And just to make sure, does ./signer test string work manually?Dogbert

1 Answers

2
votes

The program accepts hexadecimal strings while you're passing "test", causing its decoder to fail at the first character, t, which is not a valid hex char. You need to pass valid hex strings.

You can use Base.encode16 if you meant to pass the string test literally:

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

I'd also recommend using System.cmd here for shorter and cleaner code as well as lesser chances of accidentally creating Command Injection vulnerabilities:

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