我正在从PHP脚本执行位于远程机器上的shell脚本。所以,假设PHP脚本在A上运行,而shell脚本在B(10.0.0.37)上运行。
我有以下代码运行良好
$cmd = "ssh 10.0.0.37 /usr/tmp/script.sh";
exec($cmd, $output);
现在,我想将参数传递给shell脚本,最好是JSON格式。
echo json_encode($arg)
的输出如下:
[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}]
我想将此作为参数传递给shell脚本。所以,
$data = json_encode($data);
$cmd = "ssh 10.0.0.37 /usr/tmp/script.sh $data";
exec($cmd, $output);
但是,我发现shell脚本没有正确读取该参数。我尝试在$ data周围放单引号,但没有用。此外,尝试使用escapeshellarg($data)
,仍然无法正常工作。
echo escapeshellarg($data)
的输出是
'[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}]'
此外,如果有任何其他格式可以在shell脚本中轻松解析,那么我会撒谎使用该格式(不一定是JSON)。我发现我可能不得不使用'jq'
来解析json,这需要我安装一个额外的包。
答案 0 :(得分:0)
Bash不太擅长接受作为参数的JSON字符串......
解决bash试图解析参数的一种方法是让你的php脚本将JSON字符串写入文件,并使bash脚本用jq解析该文件
答案 1 :(得分:0)
我能够使用serilaize发送json数据。以下是代码。
$data = json_encode($arg)
$data = escapeshellarg($data);
$data = serialize($data);
$data = str_replace('"','\"',$data);
$cmd = "ssh 10.0.0.37 /usr/tmp/script.sh $data";
我现在可以在shell脚本中获取数据。
答案 2 :(得分:0)
<强> PHP:强>
<?php
$json = '[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}]';
$cmd = $json;
$cmd = addslashes($cmd);
// addslashes does not escapes curly braces
$cmd = strtr($cmd, array('{' => '\\{', '}' => '\\}'));
$cmd = escapeshellarg($cmd);
$cmd = "ssh localhost echo $cmd";
echo "\n$cmd\n\n";
exec($cmd, $output);
var_dump($output)
Shell(/tmp/1.sh):
#!/bin/sh
echo "$1"
外壳输出:
ssh localhost /tmp/1.sh '[\{\"original_name\":\"pdf_convert\",\"changed_name\":\"pdf_convert_1\"\},\{\"original_name\":\"video_encode\",\"changed_name\":\"video_encode_1\"\},\{\"original_name\":\"video_transcode\",\"changed_name\":\"video_transcode_1\"\}]'
array(1) {
[0]=>
string(200) "[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}]"
}