簡體   English   中英

在遠程服務器上運行命令以構造JSON字符串

[英]Running commands on remote server to construct a JSON string

我需要獲取刪除服務器的本地時間和主機名。

以下命令在本地服務器上正確執行。

echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}"

並正確返回以下輸出:

{"hostname":"server1" , "date":"2018-10-29 17:43:51"}

但是,當我在遠程服務器上執行相同的命令時,它將失敗:

var1=`ssh server2 " echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}" "`

bash:“:找不到命令

bash:+%Y-%m-%d%H:%M:%S:找不到命令

`ssh server2 " echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}" "`

bash:“:找不到命令

bash:“}:找不到命令

bash:{主機名:主機名日期:找不到命令

嘗試:

var1=$(ssh server2 " echo "{\"hostname\":\"\$\(hostname\)\" , \"date\":\"\$\(date '+%Y-%m-%d %H:%M:%S'\)\"}" ")

基本上,您不能嵌套``反引號,因此必須使用$(),並且必須轉義要遠程執行的命令(主機名和日期)。

結合使用bash -s和帶引號的heredoc可以完全按原樣運行您的代碼,而無需進行任何更改:

ssh server2 bash -s <<'EOF'
echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}"
EOF

就是說,通常來說,使用字符串串聯生成JSON是一個壞主意(如果您的命令返回意外的輸出,則可能導致輸出實際上不是有效的JSON)。 考慮通過SSH傳遞內容時用換行符分隔內容,然后使用諸如jq類的語法感知工具在本地生成JSON:

IFS=$'\n' read -r -d '' hostname date < <(
  ssh server2 'hostname && date +"%Y-%m-%d %H:%M:%S" && printf "\0"'
)
jq --arg hostname "$hostname" --arg date "$date" \
  '{ "hostname": $hostname, "date": $date }'

Charles的答案最適合JSON。 如果沒有jq ,可以執行以下操作:

var1=$(ssh server2 bash -s << 'EOF'
  h=$(hostname)
  d=$(date)
  printf '{"hostname": "%s", "date": "%s" }\n' "$h" "$d"
EOF
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM