bash - 用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}'
解决方案
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)
推荐阅读
- java - Math.random() 函数在 for 循环中不起作用
- ndepend - 计算 NDepend 中间接使用的程序集的数量
- python - 用python解析表达式:从字符串到整数
- angular - 如何在角度 4 中绘制箭头?
- python - 美化终端中的 JSON 输出 - Visual Studio Code - Python
- java - 在 Spring -boot 中使用 ForEach 进行迭代
- laravel - Laravel api路由不起作用,它总是重定向
- laravel - 如何使用 nexmo 应用内语音进行多个通话?
- qt - 无法在通过 UART 连接到 Zigbee 的 2 个 Raspberry 之间发送和接收图像
- coq - 改进依赖类型的反向函数