我想自给自足,因此没有DNSDynamic和DYNDNS等服务。而且我不想支付我自己可以做的服务。
所以这就是场景 - 我的主网站是由托管公司托管的。我还有一个带有音乐等的家庭服务器。但问题是我的ISP(BT)不向消费者提供静态IP地址。
我希望我的主域(指向我的主要主机)的子域指向我的家庭IP。这是通过简单的A记录完成的 - 我自己完成了。
这归结为我希望制作一个PHP脚本(由我的家庭服务器上的cron作业运行)来将cPanel中的A记录更新为我家庭服务器的当前IP。
这里有一些示例代码 - 当然缺少的是与cPanel沟通的API代码,我非常感谢能为我填补空白的人
<?php
$current_ip = file_get_contents("http://mydomain.com/getip.php");
$username = "CPANEL_USERNAME";
$password = "CPANEL_PASSWORD";
$domain = "CPANEL_DOMAIN";
$request = file_get_contents("http://someapipage?username=".$username."&pw=".$password."&domain=".$domain."&ip=".$current_ip);
?>
http://mydomain.com/getip.php
中的代码简直就是
<?php echo $_SERVER["REMOTE_ADDR"]; ?>
我已经掌握了如何设置cron作业,因为我的主服务器正在运行Ubuntu,而且我已经阅读了使用cron.php
在我的localhost目录中调用wget
的教程。
我试过this link,但我无法理解他在做什么。提前谢谢。
答案 0 :(得分:10)
我刚刚根据他们的文档和jordih.net链接到该文档为cPanel的JSON-API编写了这个库。它没有那么好记录,但它的要点是:
通过调用
创建zone_records对象$zones = new zone_records("cpaneluser", "pass", "website_to_login", "domain_of_records")
请注意,如果您要从要更改记录的服务器运行此网站,则要登录的网站通常为127.0.0.1。
调用后,您可以访问成员$zones->DNSrecords
。它包含DNS A记录和CNAME记录的数组(两者都是DNSrecord对象)。其他(TXT除外)是不相关的,因为如果没有额外的添加(函数),你就无法编辑它们。
每个DNS记录都有一些成员(例如target,ttl,name,type),虽然private
可以通过$record->ttl
访问,因为我添加了“magic”__get
方法。实现“魔术”__set
方法仅更改ttl和目标(使用此API函数无法更改其他属性,如果尝试这样做,对象将引发异常)。
您可以使用
$zones->addrecord($type, $target, $name, $ttl)
添加记录,或
$zones->deleterecord($line)
删除区域文件中$line
行的记录 - 您可以通过$record->line
找到该记录。
如果您想在ZoneEdit模块中创建一些自己的查询,可以调用
$zones->doquery("function_from_API", array("parameters=>"here"), array("headers"=>"here"))
它将返回cPanel响应(addrecord和deleterecord方法也是如此)。最后,我建议你使用try {...} catch (Exception $e) {...}
因为我的对象会在出现问题时抛出异常(当然可以编辑它们)。
此代码位于公共域中 - 您可以在https://github.com/ShadowLNC/cpanel_dns获取它(classdns.php是主文件,dns_update.php显示示例)。
答案 1 :(得分:1)
修改:以下链接现已中断。以下是整个脚本供参考:
#!/usr/bin/perl
# -------------------------------------------------------------------------------
# neobitti_update_ip.pl
#
# Version 1.0 - 16.01.2012
#
# PERL script to dynamically update the IP of a host via the cPanel-API. This
# script was written to work with the Finnish hoster Neobitti but it might work
# with other hosters which use cPanel too.
#
# Copyright (C) 2012 Stefan Gofferje - http://stefan.gofferje.net/
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# -------------------------------------------------------------------------------
use strict;
use LWP::UserAgent;
use MIME::Base64;
use XML::Simple;
use Data::Dumper;
# --- Command line parameters ------------------------------------------------
my $param_domain=$ARGV[0];
my $param_host=$ARGV[1];
my $param_ip=$ARGV[2];
# --- cPanel information -----------------------------------------------------
# Storing passwords in clear text is ugly!
my $cpanel_domain = "example.com";
my $user = "username";
my $pass = "password";
my $auth = "Basic " . MIME::Base64::encode( $user . ":" . $pass );
# --- Deactivate SSL certificate validation ----------------------------------
# This is ugly but neccessary because Neobitti uses self-signed SSL
# certificates which will fail validation
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
# --- Find out the linenumber for the A-record we want to change -------------
sub getlinenumber_a {
my $domain=$_[0];
my $hostname=$_[1].".";
my $xml = new XML::Simple;
my $request = HTTP::Request->new( GET => "https://$cpanel_domain:2083/xml-api/cpanel?cpanel_xmlapi_module=ZoneEdit&cpanel_xmlapi_func=fetchzone&domain=$domain" );
$request->header( Authorization => $auth );
my $response = $ua->request($request);
my $zone = $xml->XMLin($response->content);
my $linenumber="";
print $response->content . "\n";
print $zone . "\n";
print $zone->{'data'}->{'status'} . "\n";
print $zone->{'data'}->{'record'} . "\n";
if ($zone->{'data'}->{'status'} eq "1") {
my $count = @{$zone->{'data'}->{'record'}};
my $oldip="";
for (my $item=0;$item<=$count;$item++) {
my $name=$zone->{'data'}->{'record'}[$item]->{'name'};
my $type=$zone->{'data'}->{'record'}[$item]->{'type'};
print $name;
if ( ($name eq $hostname) && ($type eq "A") ) {
$linenumber=$zone->{'data'}->{'record'}[$item]->{'Line'};
$oldip=$zone->{'data'}->{'record'}[$item]->{'record'};
print "Found $hostname in line $linenumber with IP $oldip.\n"; # DEBUG
}
}
} else {
$linenumber="0";
print $zone->{'event'}->{'data'}->{'statusmsg;'}
}
return($linenumber);
}
# --- Change the IP address record for a certain linenumber ------------------
sub setip {
my $domain=$_[0];
my $linenumber=$_[1];
my $newip=$_[2];
my $result="";
my $xml = new XML::Simple;
my $request = HTTP::Request->new( GET => "https://$cpanel_domain:2083/xml-api/cpanel?cpanel_xmlapi_module=ZoneEdit&cpanel_xmlapi_func=edit_zone_record&domain=$domain&line=$linenumber&address=$newip" );
$request->header( Authorization => $auth );
my $response = $ua->request($request);
my $reply = $xml->XMLin($response->content);
if ($reply->{'data'}->{'status'} eq "1") {
$result="1";
} else {
$result=$reply->{'data'}->{'statusmsg'};
}
return($result);
}
# --- Main procedure ---------------------------------------------------------
print "Trying to find the linenumber for $param_host in $param_domain...\n";
my $line=getlinenumber_a($param_domain,$param_host);
if ( ($line ne "0") && ($line ne "") ) {
print "Trying to update IP...\n";
my $result=setip ($param_domain,$line,$param_ip);
if ($result eq "1") {
print "Update successful!\n";
} else {
print "$result\n";
}
} else {
print "Error - check domain and hostname!\n";
}
您需要使用自己的凭据替换“用户名”和“密码”。
运行脚本并传入域名,子域名和子域的新IP:
./neobitti_update_ip.pl <domain> <subdomain> <ip>
示例:
./neobitti_update_ip.pl example.com subdomain.example.com 93.184.216.34
以下是我的原始答案,其中包含指向来源的链接:
有一个Perl脚本正在执行您在此处请求的确切内容:
http://stefan.gofferje.net/it-stuff/scripts/50-dynamic-dns-update-via-cpanel-api
如果它必须是PHP,我想从Perl转换为PHP(或任何其他语言)应该相当简单。该脚本的作者发布了一些background information here。
答案 2 :(得分:0)
有一个用于Linux的bash脚本可以解决最初提出的问题,即如何自动更新网址以指向不断变化的IP。众所周知且运行良好的ddclient是许多提供程序的标准工具,但不幸的是,(尚未)为cPanel驱动的提供程序工作(我使用serverprofis.de,但还有很多其他程序)。
bash脚本位于github,我刚刚在代码中编辑了cPanel上的凭据等,然后添加了一个cron作业每隔几分钟执行一次。该脚本像ddclient一样检查IP是否已更改,如果与提供程序的最后更新相比未检测到更改,则该IP将停止。如果IP已更改,它将更改提供者处的记录以指向新IP。
到目前为止效果很好。