无法通过curl cron重新启动路由器

mu0hgdu0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(98)

我试图使用curl设置一个cron来定期重新启动我的WD N900路由器。
使用Chrome的开发者工具,当我通过它的WebGUI登录路由器时,它会把我带到“authentication.cgi”。下面是它的基本组件复制为一个curl(bash):

curl 'http://192.168.1.1/authentication.cgi' \
  -H 'Cookie: QPYVIXOAZD=admin; uid=lseKLfq8zc' \
  --data-raw 'USERNAME=admin&DIGEST=XXXXXXXXXXXXXXXXXXX'

关键组件是cookie条目,其中的uid对于该特定登录是唯一的。
为了重启路由器,我浏览了几页,最后找到了“service.cgi”。下面是它的基本组件,复制为curl(bash):

curl 'http://192.168.1.1/service.cgi' \
  -H 'Cookie: QPYVIXOAZD=admin; uid=lseKLfq8zc' \
  --data-raw 'EVENT=REBOOT'

要从service.cgi通过curl成功重新启动,cookie uid必须与authentication. cgi中的uid相同。否则,它不会重新启动,并显示“授权失败”。
如果不首先通过WebGUI登录获得cookie(这违背了curl的目的),我如何才能让它工作呢?
我尝试设置一个cookie jar(curl -c/tmp/cookie-jar.txt....)并删除“Cookie:...”行,这导致了另一个“Authorization failure”以及一个空的cookie文件保存:

# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

我还尝试了“curl - u myusername:mypassword”(带和不带--digest或--noauth选项),但都无济于事(“授权失败”)。
如有任何建议,我们将不胜感激。

fiei3ece

fiei3ece1#

当你说:
要从service.cgi通过curl成功重新启动,cookie uid必须与authentication.cgi中的uid相同。否则,它不会重新启动,并显示“授权失败”。
我将此解释为首先需要获取当前有效的cookie值。
在执行authentication.cgi'请求的地方,然后在后续的service.cgi请求中使用uid
我认为可能有问题的是cookie文件是空的。有可能在响应中没有返回cookie。但我发现curl cookie框有问题。所以我自己处理cookie。
对我来说,我使用PHP脚本来解决类似这样的问题。
我所要做的是运行一个cron作业来运行一个PHP脚本来实现这一点。
如果你不知道PHP,我会为你写它。
cron作业如下所示:

/usr/local/bin/php /home/<user>/backup/reboot.php

我真的希望这个curl命令对您有用,否则这个答案没有意义:

curl 'http://192.168.1.1/authentication.cgi' \
  -H 'Cookie: QPYVIXOAZD=admin; uid=lseKLfq8zc' \
  --data-raw 'USERNAME=admin&DIGEST=XXXXXXXXXXXXXXXXXXX'

这将是我的第一步,这是reboot.php给定上述cron作业设置。这是基于我的基本curl故障排除过程。我已经在你的位置很多次。我开发了这个超过十年前。

<?
header('Content-Type: text/plain');    $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://192.168.1.1/authentication.cgi');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type' => 'application/x-www-form-urlencoded',
]);
curl_setopt($ch, CURLOPT_COOKIE, 'QPYVIXOAZD=admin; uid=lseKLfq8zc');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'USERNAME=admin&DIGEST=XXXXXXXXXXXXXXXXXXX');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$response = curl_exec($ch);
echo curl_error($ch);
var_export($response);

echo "\nheader out: " . curl_getinfo($ch,CURLINFO_HEADER_OUT);
?>

相关问题