如何使用shell脚本从远程服务器SSH读取.json文件
我在一个远程服务器上有一个json文件,我想使用shell脚本从中读取数据,我尝试了下面的代码,但没有成功如何使用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
#!/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