我有一个json文件,其格式如下:
{
"ServerName1": {
"localip": "192.168.1.1",
"hostname": "server1"
},
"ServerName2": {
"localip": "192.168.1.2",
"hostname": "server2"
},
"ServerName3": {
"localip": "192.168.1.3",
"hostname": "server3"
}
}
我正在尝试编写一个使用Dialog创建一个菜单来运行ssh连接命令的shell脚本。我正在用jq进行解析,但不能超过第一个对象级别。我们有很多服务器,这将使连接它们变得更加容易。我的Dialog语句可以很好地处理静态数据,但是我们尝试使用JSON文件填充其余数据。所以我正在自杀,试图弄清楚如何仅将localip和主机名放入数组以循环到Dialog命令中,或者将有效地执行相同操作的东西吐出,到目前为止,我已经知道它可以吐出< / p>
Servername1 = {"localip":"192.168.1.1","hostname":"server1"}
。我是一个shell脚本新手,但是现在这很混乱。
这是到目前为止我一直在使用的jq命令:
jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" config.json
这是适用于静态数据的Dialog命令:
callssh(){
clear
ssh $1@$2
}
## Display Menu ##
dialog --clear --title "SSH Relayer"\
--menu "Please choose which server \n\
with which you would like to connect" 15 50 4 \
"Server 1" "192.168.1.1"\
"Server 2" "192.168.1.2"\
"Server 3" "192.168.1.3"\
Exit "Exit to shell" 2>"${INPUT}"
menuitem=$(<"${INPUT}")
case $menuitem in
"Server 1") callssh $sshuser 192.168.1.1;;
"Server 2") callssh $sshuser 192.168.1.2;;
"Server 3") callssh $sshuser 192.168.1.3;;
Exit) clear
echo "Bye!";;
esac
感谢您的帮助或指向正确的方向。
答案 0 :(得分:1)
要创建一个基于config.json将主机名映射到IP地址的bash数组:
declare -A ip_of
# Emit lines of the form:
# hostname localip (without quotation marks)
function hostname_ip {
local json="$1"
jq -r '.[] | "\(.hostname) \(.localip)"' "$json"
}
while read -r hostname ip ; do
ip_of["$hostname"]="$ip"
done < <(hostname_ip config.json)
您可以像这样循环遍历此bash数组:
for hostname in "${!ip_of[@]}" ; do
echo hostname=$hostname "=>" ${ip_of[$hostname]}
done
例如,假设“对话框”显示了主机名,
您可以将case
语句替换为:
callssh "$sshuser" "${ip_of[$menuitem]}"