将参数从PHP传递到远程shell脚本

时间:2015-11-27 01:45:40

标签: php linux bash shell

我正在从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,这需要我安装一个额外的包。

3 个答案:

答案 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"}]"
}