8

自給自足になりたいので、DNSDynamicやDYNDNSなどのサービスなしでやっていきたいです。そして、私は自分でできるサービスにお金を払うのは好きではありません。

だからここにシナリオがあります-私は私のメインのウェブサイトをホスティング会社でホストしています。音楽などを載せたホームサーバーもあります。しかし問題は、私のISP(BT)が消費者に静的IPアドレスを提供していないことです。

メインドメインのサブドメイン(メインホストを指す)がホームIPを指すようにしたい。これは、私が自分で行った単純なAレコードを使用して行われます。

これは、cPanelのAレコードをホームサーバーの現在のIPに更新するためのPHPスクリプト(ホームサーバー上のcronジョブによって実行される)を作成したいということです。

ここにいくつかのサンプルコードがあります-もちろん、欠けているのは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"]; ?>

ホームサーバーがUbuntuを実行しているので、cronジョブを設定する方法をすでに理解しており、をcron.php使用してローカルホストディレクトリで自分を呼び出すチュートリアルを読んだことがありますwget

私はこのリンクを試しましたが、彼が何をしていたのか理解できませんでした。前もって感謝します。

4

3 に答える 3

14

ドキュメントとそのドキュメントへのjordih.netリンクに基づいて、cPanelのJSON-API用にこのライブラリを作成しました。あまり文書化されていませんが、その要点は次のとおりです。

を呼び出してzone_recordsオブジェクトを作成します

$zones = new zone_records("cpaneluser", "pass", "website_to_login", "domain_of_records")

レコードを変更するサーバーからこれを実行している場合、ログインするWebサイトは通常127.0.0.1であることに注意してください。

呼び出されると、メンバーにアクセスできます$zones->DNSrecords。これには、DNS AレコードとCNAMEレコードの配列が含まれています(どちらもDNSrecordオブジェクトです)。その他(TXTを除く)は、クラスに追加(関数)を追加しないと編集できないため、関係ありません。

各DNSレコードにはいくつかのメンバー(たとえば、target、ttl、name、type)がありますが、「magic」メソッドを追加したため、これらのメンバーprivateにアクセスできます。「magic」メソッドは、ttlとtargetのみを変更するために実装されています(このAPI関数を使用して他のプロパティを変更することはできません。そうしようとすると、オブジェクトは例外を発生させます)。$record->ttl__get__set

使用できます

$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に例が示されています)。

于 2012-12-21T09:13:36.717 に答える
2

編集:以下のリンクが壊れています。参考までに、スクリプト全体を次に示します。

#!/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";
}

「username」と「password」を独自の資格情報に置き換える必要があります。

スクリプトを実行し、ドメイン名、サブドメイン名、およびサブドメインの新しい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(または他の言語)への翻訳はかなり簡単なはずだと思います。スクリプトの作成者は、ここにいくつかの背景情報を投稿しています。

于 2012-12-21T01:02:34.470 に答える
0

質問された元の質問、つまり、変更されたIPを指すようにWebアドレスの更新を自動化する方法を解決するためのLinux用のbashスクリプトがあります。よく知られていてうまく機能しているddclientは多くのプロバイダーの標準ツールですが、残念ながら(まだ)cPanel駆動のプロバイダーでは機能していません(私はserverprofis.deを使用していますが、他にもたくさんのリストがあります)。

bashスクリプトはgithubにあり、cPanelにあるクレデンシャルなどをコードで編集し、cronジョブを追加して数分ごとに実行しました。スクリプトは、ddclientと同様に、IPが変更されたかどうかを確認し、プロバイダーの最後の更新と比較して変更が検出されない場合は停止します。IPが変更された場合、新しいIPを指すようにプロバイダーのレコードが変更されます。

これまでのところうまく機能しています。

于 2018-11-21T07:29:17.147 に答える