我正在尝试将一个字节数组从我的rails应用程序内部传递到另一个ruby脚本(仍在我的rails应用程序中),例如:
`./app/animations/fade.sh "\x01\x01\x04\x00" &`
收益率ArgumentError (string contains null byte)
我想我对如何形成这个字符串感到困惑,而不是把它传递给我的脚本,它将以这种方式使用它:
@sp.write ["#{ARGV[0]}", "f", "\x12"]
如果可能,我想像这样形成字符串(在我的rails应用程序上):
led = "\x01#{led.id}\x04\x00"
但我一直收到ArgumentError (string contains null byte)
错误。有没有办法可以从我的rails应用程序中的元素形成这个字符串,然后将它传递给我的外部脚本?
答案 0 :(得分:1)
您的脚本可以接受来自STDIN
的输入吗?也许使用read
。
如果你不能这样做,你可以编码你的null并转义你的编码
例如。 48656c6c6f0020576f726c64可编码为48656c6c6f200102020576f726c64
如果双方同意2020 = 20和2001 = 00
更新我认为编码是您必须要做的,因为我尝试使用read
,结果有点太难了。可能还有另一种选择,但我还没有看到它。
这是我的脚本和两个测试运行:
dlamblin$ cat test.sh
echo "reading two lines of input, first line is length of second."
read len
read ans
echo "C string length of second line is:" ${#ans}
for ((c=0; c<$len; c++))
do
/bin/echo -n "${ans:$c:1},"
done
echo ' '
exit
dlamblin$ echo -e '12\0012Hello \0040World' | sh test.sh
reading two lines of input, first line is length of second.
C string length of second line is: 12
H,e,l,l,o, , ,W,o,r,l,d,
dlamblin$ echo -e '12\0012Hello \0000World' | sh test.sh
reading two lines of input, first line is length of second.
C string length of second line is: 5
H,e,l,l,o,,,,,,,,
#Octals \0000 \0012 \0040 are NUL NL and SP respectively
答案 1 :(得分:1)
您可以使用base64传递
周围的字节串$ cat > test.sh
echo $1 | base64 -d
$ chmod a+x test.sh
然后来自ruby:
irb
>> require 'base64'
=> true
>> `./test.sh "#{Base64.encode64 "\x01\x01\x04\x00"}"`
=> "\x01\x01\x04\x00"
答案 2 :(得分:1)
您应该通过标准输入而不是命令行传递数据。您可以使用IO.popen
来实现此目的:
IO.popen("./app/animations/fade.sh", "w+") do |f|
f.write "\x01\x01\x04\x00"
end
在阅读方面:
input = $stdin.read
@sp.write [input, "f", "\x12"]
(顺便说一下,命名Ruby脚本.rb
而不是.sh
更常见;如果fade.sh
是一个Ruby脚本,我假设您使用的语法在其示例内容中,您可能希望将其命名为fade.rb
)