[英]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.