macです。 わさびぃ さん wrote: > え、これは、参考というより、そのものですね。 > ありがとうございます。 > > > それに、(これが危険だから避けて通っているのですが)、 > > Cだから、I/Oも制限なしに操作可能です。 > > 通常は、apache, nobodyの権限で動いていますが、 > > /etc/sudoersの設定で、別の権限を与えることもできるので > す。 > この部分ですが、見ると、そのような > ディレクトリがないのですが、もう少し詳しく > お願いできますか? 実際I/Oがないので、例示が難しいです。 DDNSのサーバーとして実装してみましょう。 クライアントは、内緒のURLに内緒の引数をつけて、 定期的にサーバーにHTTPで見に行き、 サーバーは、もし、IPに変化があれば、 zone fileを書き換え、namedをreloadする。 exsample.comは固定IPで、 www.exsample.com sub domainを動的に設定する。 =============================================================== #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #define PASSWD "BBDBABDB" int ChangeDNS(int serial, char *ip) { char buf[BUFSIZ]; FILE *fp; if ((fp = fopen("/etc/named.d/data-ext/exsample.com", "w")) == NULL) { return (errno); } fprintf(fp, "$TTL 15M ;\n"); fprintf(fp, "@ IN SOA exsample.com. postmaster.exsample.com. (\n"); fprintf(fp, "%d ; Serial\n", serial); fprintf(fp, "3H ; Refresh\n"); fprintf(fp, "1H ; Retry\n"); fprintf(fp, "15M ; Expire\n"); fprintf(fp, "15M ) ; TTL\n"); fprintf(fp, "@ IN NS exsample.com.\n"); fprintf(fp, "@ IN MX 5 exsample.com.\n"); fprintf(fp, "* IN MX 5 exsample.com.\n"); fprintf(fp, "@ IN A 218.222.193.18\n"); fprintf(fp, "www IN A %s\n", ip); fprintf(fp, "localhost IN A 127.0.0.1\n"); fclose (fp); if((fp = popen("/usr/sbin/rndc reload", "r")) == NULL) { return (errno); } while(fgets(buf, BUFSIZ, fp) != 0){} pclose (fp); return(0); } int main(int argc, char argv[], char *env[]) { FILE *fp; char buf[BUFSIZ]; int i; int serial; int n; char *p, *q; printf("Content-type: text/html; charset=Shift_JIS\n\n"); printf("<html>\n"); printf("<hader>\n"); printf("</hader>\n"); printf("<body>\n"); printf("<p>\n"); printf("<p>\n"); if ((q = getenv("QUERY_STRING")) != NULL) { printf("QUERY_STRING = %s\n", q); } else { printf("No QUERY_STRING\n"); } if ((p = getenv("REMOTE_ADDR")) == NULL) { printf("No IP\n"); } else if (strncmp(q,PASSWD,strlen(PASSWD)) != 0) { printf("Get out !\n"); } else { if ((fp = fopen("/home/httpd/html/ddns/lastip", "r+")) == NULL) { printf("<p>Can't open lastip<p>\n"); } else { rewind(fp); fgets(buf, BUFSIZ, fp); serial = atoi(buf); fgets(buf, BUFSIZ, fp); if (strncmp(buf, p, (strlen(buf)-1)) == 0) { printf("<p>same ip = %s, serial = %d</p>\n", p, serial); } else { printf("<p>ip change from %s to %s, serial = %d</p>\n", buf, p, serial); fflush(fp); rewind(fp); fprintf(fp, "%d\n%s", ++serial, p); if((n = ChangeDNS(serial, p)) != 0) { printf(strerror(n)); } fflush(fp); } fclose(fp); } } printf("</p>\n"); printf("</body>\n"); printf("</html>\n"); return(0); } =============================================================== file:/etc/named.d/data-ext/exsample.com file:/home/httpd/html/ddns/lastip はownerをapacheにすればよいが、 /usr/sbin/rndc reload は、実行できない。 そこで、 file:/etc/sudoers に apache localhost = NOPASSWD: /usr/sbin/rndc を追加する。 # ぜんぜんCGIでないか (^^; -- mac