首页 > 解决方案 > 用bash变量替换curl命令中的IP

问题描述

我目前正在尝试制作一个与 Cloudflare API 交互的 DDNS 脚本,以捕获我的 IP 地址的更改并自动修复我的 Web 服务器的 IP 地址更改。到目前为止一切正常,除了我无法将 $IP 正确放入 curl 语句中。我首先从 bash 脚本中运行一个 python 脚本来获取 IP 地址,然后在 bash 脚本中运行 curl 语句。这是 python 脚本的样子(它返回一个类似“1.1.1.1”的 IP 地址,其中包含引号,因为 curl 命令需要引号)

#!/usr/bin/python3

import subprocess as sp

def main():
    command = "dig +short myip.opendns.com @resolver1.opendns.com";
    ip = sp.check_output(command, shell=True).decode('utf-8').strip('\n');
    ip_tmp = ip;
    ip_tmp = '"' + ip + '"';
    ip = ip_tmp;
    print(ip);


if __name__ == "__main__":
    main();

bash 脚本如下所示:

#!/bin/bash

IP=$("./getIP.py")

curl -X PUT "https://api.cloudflare.com/client/v4/zones/zone_id/dns_records/dns_id" \
     -H "X-Auth-Email: example.com" \
     -H "X-Auth-Key: authkey" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"example.com","content":$IP,"ttl":120,"proxied":true}'

我试图让 python 脚本只返回数字,然后在 bash 脚本中添加引号,现在反之亦然,我似乎无法让它工作。一旦变量替换为 ip 地址周围的引号,最后一行应该最终看起来像这样:

'{"type":"A","name":"example.com","content":"127.0.0.1","ttl":120,"proxied":true}'

标签: bashdnscloudflare

解决方案


json 结构周围的单引号可防止变量扩展。

您有几个现成的选项。

丑陋的报价在您的 json 内部/周围转义。

"{\"type\":\"A\",\"name\":\"example.com\",\"content\":$IP,\"ttl\":120,\"proxied\":true}"

让 python 将此数据写入文件并告诉 curl 使用该文件作为发布数据的来源。

curl -X PUT "https://api.cloudflare.com/client/v4/zones/zone_id/dns_records/dns_id" \
 -H "X-Auth-Email: example.com" \
 -H "X-Auth-Key: authkey" \
 -H "Content-Type: application/json" \
 --data @file_you_wrote_your_json_to.json

使用 python 请求或 urllib 模块向云耀斑发出请求。

更新您的 main() 函数以返回 IP 而不是打印它。

my_ip = main()
url = "https://api.cloudflare.com/client/v4/zones/zone_id/dns_records/dns_id"

myheaders = {
    "X-Auth-Email": "example.com",
    "X-Auth-Key": "authkey",
    "Content-Type": "application/json"
}

myjson = {
    "type":"A",
    "name":"example.com",
    "content":my_ip,
    "ttl":120,
    "proxied":true
}

requests.put(url, headers=myheaders, data=myjson)

推荐阅读