Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用shell脚本从远程服务器SSH读取.json文件_Json_Bash_File_Jq - Fatal编程技术网

如何使用shell脚本从远程服务器SSH读取.json文件

如何使用shell脚本从远程服务器SSH读取.json文件,json,bash,file,jq,Json,Bash,File,Jq,我在一个远程服务器上有一个json文件,我想使用shell脚本从中读取数据,我尝试了下面的代码,但没有成功 #!/usr/bin/env bash #!/usr/bin/sh echo "hey" ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/.ssh/cloud_private_key user@adresse << EOF script cd /data/Doc1/ da

我在一个远程服务器上有一个json文件,我想使用shell脚本从中读取数据,我尝试了下面的代码,但没有成功

#!/usr/bin/env bash
#!/usr/bin/sh

echo "hey"


ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i 
/home/.ssh/cloud_private_key user@adresse << EOF

script
cd /data/Doc1/
databasename=`jq '.ref_Version' re.json`
echo "hello $databasename"
EOF
我得到:

hey
[user@adresse ~]$ [user@adresse data]$ [user@adresse Doc1]$ 
 hello 
[user@adresse ~]$ [user@adresse data]$ [user@adresse Doc1]$ hey22

首先,您的
JSON
无效,您在末尾有一个额外的逗号
,请将其更改为:

{
    "fileMetadata": {
        "ref_Version": "125"
    }
}
使用
jq
命令,您永远不会指定返回值的子键,它应该是:

jq '.fileMetadata.ref_Version' re.json
输出:

"125"

考虑在本地运行
jq
,而不是在SSH的另一端:

#!/usr/bin/env bash
set -o pipefail  # consider it a failure if any part of a pipeline fails.

getJson() {
  local address filename_q
  address=$1
  printf -v filename_q '%q' "$2"
  ssh \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i /home/.ssh/cloud_private_key \
    "$address" "cat $filename_q"
}

if databaseName=$(getJson user@address /data/Doc1/re.json \
                  | jq -r '.fileMetadata.ref_Version'); then
  echo "Hello $databaseName"
else
  echo "Unable to retrieve or parse JSON" >&2
fi

类似地,您的JSON需要一些修补程序才能形成良好的格式
{“fileMetadata”:{“ref_Version”:“125”}
是一种有效的重新格式。

这里的换行符肯定不正确--文件名需要紧跟在
-i
之后。在你的脚本中真的是这样吗,还是在进入网站时就被吞食了?就目前而言,这是正确的,但它并没有解决所有的问题。在herdoc内部,backtick括起来的字符串将在本地运行,f/e,并且在SSH退出后,提取的值不会在本地计算机上设置。类似地,
回送“Hello$databasename”
将使用
databasename
的本地值,而不是在SSH启动后建立的值。当然,这两个问题都可以通过更改
来解决。非常感谢您的帮助,添加此“
#!/usr/bin/env bash
set -o pipefail  # consider it a failure if any part of a pipeline fails.

getJson() {
  local address filename_q
  address=$1
  printf -v filename_q '%q' "$2"
  ssh \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i /home/.ssh/cloud_private_key \
    "$address" "cat $filename_q"
}

if databaseName=$(getJson user@address /data/Doc1/re.json \
                  | jq -r '.fileMetadata.ref_Version'); then
  echo "Hello $databaseName"
else
  echo "Unable to retrieve or parse JSON" >&2
fi