我有多部手机,我正在尝试获取手机的正常运行时间。我已为所有手机启用 REST API,并希望运行 CURL 脚本来获取正常运行时间的价值。我有一个脚本可以获取 Polycom 手机的价值。以下命令有效,但我想使用 3000 多个设备执行此操作。当我运行包含 100 个命令的脚本时,我得到了输出,但它们都混杂在一起。我有一个 txt 和 excel 文件,其中包含所有电话的 IP 地址,所有 3000 台设备的用户名和密码都相同。我正在寻找一种方法来运行所有命令,然后获取带有 IPADDRESS 的文本文件并返回请求结果( IPADRESS:"Status": "2000"" 或类似的内容)。我主要想要一种简单的方法来查看每个 IP 地址的每条curl 行的结果。
命令
curl -d "{\"data\": [\"UpTimeSinceLastReboot\"]}" -H "Content-Type: application/json" -k https://USERNAME:PASSWORD@IPADDRESS/api/v1/mgmt/config/get
输出
{“Status”: “2000”, “data”: {"UpTimeSinceLastReboot": "<DAYS_HOURS_MINUTES_SECONDS>"}
我能够添加 >> /tmp/filename.txt 以输出包含所有响应的 txt 文件,但无法准确地将其与手机的 IP 地址进行匹配。
答案1
在所有示例中,我假设该文件每行一个 IP。
1.卷曲与魔法
您可以通过以下方式实现您的目标curl(1)
和周围的一些魔法
curl -d "{\"data\": [\"UpTimeSinceLastReboot\"]}" \
-H "Content-Type: application/json" \
-k \
-u USERNAME:PASSWORD \
-w ",%{remote_ip}\t" \
<(sed 's#^#https://#;s#$#/api/v1/mgmt/config/get#' /path/to/file) \
| tr -ds '\n\t' '\t\n'
为了更好地理解,我将命令分成多行:
- 我将凭据从 URL 移至curl 参数
- 密钥是从子shell输入的,为ip加上协议前缀https://并附加路径/api/v1/mgmt/config/get
- -w 选项写入远程IP回应后。稍后在 tr 中使用该格式
,REMOTE_IP<TAB>
来创建所需的格式 - 通过管道将其通过
tr(1)
删除响应末尾可能的换行符并在末尾创建换行符(这不太好,但应该可以工作)。
注意:本例中的结果是
RESPONSE,IP
…
2.for循环
for ip in $(cat /path/to/file)
do
echo -ne "$ip\t"
curl -d "{\"data\": [\"UpTimeSinceLastReboot\"]}" -H "Content-Type: application/json" -k https://USERNAME:PASSWORD@$ip/api/v1/mgmt/config/get
done
结果:
IP,RESPONSE
…
3. while 循环
while 循环
while read ip
do
echo -ne "$ip\t"
curl -d "{\"data\": [\"UpTimeSinceLastReboot\"]}" -H "Content-Type: application/json" -k https://USERNAME:PASSWORD@$ip/api/v1/mgmt/config/get
done < /path/to/file
结果:
IP,RESPONSE
…