gen_tcpの関数ですね。

send(Socket, Packet) -> ok | {error, Reason}
Types:
Socket = socket()
Packet = [char()] | binary()

このPacketを[char()]、つまりListとしたいのだが、
予想していない変換が起きてしまうということでよろしいでしょうか。

os:cmd()で実行した結果を
string:tokens()によってぶった切る際にゴミが出るとなると、
それはBIFの問題でしょうね。

あと、個人的に一番怪しいなと感じるのは ~p を使っていることです。
これはテキストを整形する際に使うのですが、その整形の際にゴミが入っているのじゃないでしょうか。
他のシーケンス ~w とかを試してみてはどうですか。

頼りないアドバイスで申し訳ありません。