分类 Windows 下的文章

用 powershell 实现 DDNS 功能

最近想实现在外面访问家里的迷你电脑,因为电脑的 IPv6 地址是通过 SLACC 分配的,不能在路由器上获得迷你电脑的 IPv6 地址,所以需要在电脑上实现 DDNS 功能。就写了一个脚本,实现了已下功能:

  1. 从本地网卡获取 IPv6 的第一个首选地址,通过 cloudfalre api 获取 dns 记录的 ipv6 地址
  2. 对比获取的 IPv6 地址与 cloudflare 中的 dns 记录是否一致
  3. 如果比对失败则通过 cloudflare api 更新 dns 解析
  4. 发生错误则发送 telegram 通知

下面是脚本内容:

# ------------------------------------------------------------------------------
# 脚本名称: UpdateDNS.ps1
# 描述: 获取本机 IPv6 首选地址,通过 Cloudflare API 更新 DNS 记录,并发送 Telegram 通知
# 作者: [opswill]
# 日期: [2024/12/12]
# 版本: 1.0
# ------------------------------------------------------------------------------
# 注意: 请确保已正确配置 API Token 和其他变量
# ------------------------------------------------------------------------------
# 设置 PowerShell 执行策略
Set-ExecutionPolicy Bypass -Scope Process -Force

# 配置 Cloudflare API 和 Telegram Bot 信息
$apiToken = ""
$zoneId = ""
$recordId = ""
$domain = ""
$botToken = ""
$chatId = ""

# 日志文件路径
$logFilePath = "C:\DDNS.log"  # 请替换为你的日志文件路径

function Log-Message {
    param(
        [string]$Message
    )
    $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
    $logEntry = "$timestamp - $Message"
    Add-Content -Path $logFilePath -Value $logEntry
}

function Send-TelegramMessage {
    param(
        [string]$BotToken,
        [string]$ChatId,
        [string]$Message
    )

    $telegramApiUrl = "https://api.telegram.org/bot$BotToken/sendMessage"
    $body = @{
        chat_id = $ChatId
        text    = $Message
    } | ConvertTo-Json -Depth 10

    try {
        $bytes = [System.Text.Encoding]::UTF8.GetBytes($body)
        Invoke-WebRequest -Uri $telegramApiUrl -Method POST -Body $bytes -ContentType "application/json" -UseBasicParsing | Out-Null
    } catch {
        Log-Message "发送Telegram通知失败,错误信息:$_"
    }
}

function Get-IPv6Address {
    $ipv6Address = Get-NetIPAddress -InterfaceAlias "vEthernet (vSwitch-Public-Ethernet)" | 
                   Where-Object { $_.AddressFamily -eq "IPv6" -and $_.PrefixOrigin -eq "RouterAdvertisement" -and $_.SuffixOrigin -eq "Link" } | 
                   Select-Object -First 1 -ExpandProperty IPAddress

    if (-not $ipv6Address) {
        throw "未找到有效的 IPv6 地址。"
    }

    return $ipv6Address
}

function Get-CurrentDNSRecord {
    $uri = "https://api.cloudflare.com/client/v4/zones/$zoneId/dns_records/$recordId"
    $headers = @{
        "Authorization" = "Bearer $apiToken"
    }

    try {
        $response = Invoke-WebRequest -Uri $uri -Method GET -Headers $headers -UseBasicParsing
        $responseObj = $response.Content | ConvertFrom-Json
        if ($responseObj.success) {
            return $responseObj.result.content
        } else {
            throw "获取DNS记录失败,错误信息:$($responseObj.errors | ConvertTo-Json -Depth 10)"
        }
    } catch {
        throw "获取当前DNS记录失败,错误信息:$_"
    }
}

function Update-DNSRecord {
    param(
        [string]$ipv6Address
    )

    # 准备 API 请求
    $uri = "https://api.cloudflare.com/client/v4/zones/$zoneId/dns_records/$recordId"
    $headers = @{
        "Content-Type"  = "application/json"
        "Authorization" = "Bearer $apiToken"
    }

    # 准备请求体
    $body = @{
        name    = $domain
        ttl     = 60
        content = $ipv6Address
        type    = "AAAA"  # 使用 AAAA 记录类型更新 IPv6 地址
    } | ConvertTo-Json -Depth 10

    try {
        $response = Invoke-WebRequest -Uri $uri -Method PATCH -Headers $headers -Body $body -ContentType "application/json" -UseBasicParsing
        return $response
    } catch {
        throw "发送API请求更新DNS记录失败,错误信息:$_"
    }
}

# 记录开始时间
Log-Message "脚本开始执行"

# 获取 IPv6 地址
try {
    $ipv6Address = Get-IPv6Address
    Log-Message "从本机网卡获取到IPv6地址: $ipv6Address"
} catch {
    $message = "Windows DDNS: 获取IPv6地址失败,错误信息:$_"
    Send-TelegramMessage -BotToken $botToken -ChatId $chatId -Message $message
    Log-Message $message
    exit
}

# 获取当前 DNS 记录
try {
    $currentDNSRecord = Get-CurrentDNSRecord
    Log-Message "当前 $domain 的 DNS 记录内容: $currentDNSRecord"

    # 比较当前 DNS 记录与本机 IPv6 地址
    if ($currentDNSRecord -ne $ipv6Address) {
        Log-Message "DNS 记录与本机 IPv6 地址不一致,准备更新 DNS 记录。"
        
        # 发送 API 请求更新 DNS 记录
        $response = Update-DNSRecord -ipv6Address $ipv6Address
        $responseObj = $response.Content | ConvertFrom-Json

        if ($responseObj.success) {
            $logMessage = "成功更新 DNS 记录: $domain -> $ipv6Address"
            Log-Message $logMessage
        } else {
            $message = "Windows DDNS: 更新DNS记录失败,错误信息:$($responseObj.errors | ConvertTo-Json -Depth 10)"
            Send-TelegramMessage -BotToken $botToken -ChatId $chatId -Message $message
            Log-Message $message
        }
    } else {
        Log-Message "DNS 记录与本机 IPv6 地址一致,无需更新。"
    }
} catch {
    $message = "Windows DDNS: $_"
    Send-TelegramMessage -BotToken $botToken -ChatId $chatId -Message $message
    Log-Message $message
}

# 记录结束时间
Log-Message "脚本执行结束"

按 win + r 然后输入 taskschd.msc 创建一个新的计划任务,从而实现开机未登录和登录状态定期执行,这样就可以通过域名在外面访问家里的迷你电脑了。

windows 下修改路由表

在Windows下修改路由表的命令和linux是一样的,都是route命令,用法感觉相似,但不太一样.
1.查看路由表

route print   

默认会在最上面显示所有网络接口,下面打印所有路由表,显示会比较多,可以用 “ -4 ”只显示ipv4的路由,当然也可以用“ -6” 来显示ipv6的路由:

route print  -4  打印tcp/ip v4 的路由表 

print 后面还可以接通配符 “ * ”

route print 192*    显示192开头的路由

也可以用 netstat -nr 来查看路由表和route print是一样的。
2.添加路由

route add 10.11.11.0 mask 255.255.255.0  10.11.15.1

这样是临时添加重启就会消失,如果要永久添加要加 “ -p ”参数

route -p add  10.11.11.0 mask 255.255.255.0  10.11.15.1

windows的配置都是保存在注册表中的,永久路由的保存位置:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes

3.删除路由

route delete 10.11.11.0

也可以写上掩码或者用通配符:

route delete 192.168.88.0 mask 255.255.255.0
route delete 192.*

4.修改路由:

route change 192.168.1.1 mask 255.255.255.0 127.56.0.1  
route change 192.168.1.1 mask 255.255.255.0 127.56.0.1  metric 2 if 2

change 参数只支持修改网关和优先级。

参考文章:
http://www.yongfa365.com/Item/Route-Table-Windows-Command.html
http://blog.sina.com.cn/s/blog_8a7012cf01014yz4.html

使用sc命令手动添加删除服务

在管理Windows服务器时,有些程序在安装时并没有添加到服务里,在任务管理器里无法像服务一样方便的启动/停止/重启等操作,设置开机启动也比较麻烦,这时就可以用系统自带的sc命令来手动将程序添加到服务中。
添加服务:

sc create forward_8080 binpath= "D:\bin\forward.exe -d"

注意sc命令的所有等号后面都要加一个空格,这里是binpath的“=”和后面的路径要加一个空格。

设置成开机启动:

sc config forward_8080 start= auto

一样在等号后面要加个空格。
也可以写在一起:

sc create forward_8080 binpath= "D:\bin\forward.exe -d" start= auto

启动/停止/查询状态:

sc start forward_8080
sc stop  forward_8080
sc query forward_8080

删除服务:

sc delete forward_8080

添加详细描述信息:

sc  description forward_8080  "tcp  forword to backend server,port 8080,backend server x.x.x.x"

更改服务显示名:

sc config forward_8080 displayname= TCP_8080

命令很强大,还有很多其它参数,看命令自带帮助就行了,用法很简单。

参考文章:
http://support2.microsoft.com/kb/251192/zh-cn

电脑中的一些常用工具

电脑上的工具:

pchunter - 系统分析神器
virtualbox - 轻量级虚拟机
xmanager enterprise - windows下管理linux的工具,个人感觉比securityCRT要好用
conEmu - windows下cmd增强工具,还有一个cmder可以在windows下支持linux命令
babun - 在windows下使用linux命令的工具,可以和conEmu整合
cherrytree - 跨平台富文本笔记软件
hfs - 小巧的webserver
vlc - 开源强大的跨平台支持所有格式的播放器
foxmail - 邮件客户端
teamviewer - 远程协助
FeedDemon - RSS客户端 知道RSS的人都知道
UltraISO - 刻录光盘制作启动盘神器
YUMI - linux/windows多启动制作工具
comodo - 老牌hips防火墙,裸奔就靠它了
turecrypt - 文件加密工具
Internet Download Manager (IDM) - 下载神器
Free Download Manager (FDM)- 比IDM还神的下载神器
Notepad++/UltraEdit/VS code/sublime text - 文本编辑神器
Haroopad - Markdown编辑器,写博专用
Edraw Max Pro - 画网络拓扑图,流程图

在线工具:
查看ip地址(可以在linux下)
http://ip.cn
http://www.ifconfig.me

脚本和命令集锦
http://www.commandlinefu.com/commands/browse

测试服务器速度
http://alibench.com
http://ce.cloud.360.cn
http://www.17ce.com
http://www.speedtest.net

在线系统管理视频教程
http://sysadmincasts.com/

在线格式工厂
http://www.online-convert.com/

在线下载各大网站视频
http://www.flvcd.com/

-----2015/8/10更新--------

windows下搭建类linux环境

Windows下有很多工具可以实现类linux环境,我采用的是conEmu+babun来实现。

一.简介

  1. conEmu 是window下的多标签命令行工具,可以方便的新建cmd、cmd admin、powershell、powershell admin多种命令行,设置很多,功能强大。
  2. babun 如果你不想折腾,又想在windows下有像linux一样的命令行,那就试试这个吧,比cygwin、git bash、cmder 方便。
    更详细的说明自己去这两个软件的官网看吧。

二.下载

  1. babun :http://babun.github.io/
  2. conEmu : https://code.google.com/p/conemu-maximus5/

三.安装

  1. conEmu 安装不多说了,一路next
  2. babun 安装
    下载好babun后解压,执行: babun.bat /t c:\cmd , 安装过程中注意一下有没有错误,如果是删掉后重新安装的,经常会遇一堆error,一般重启一下电脑就可以,安装好之后会在c:\cmd下生成一个.babun的目录,babun所有文件都在这个目录中。
    注意安装目录不要有空格,这个是cygwin要求的。

四.一些配置

- 阅读剩余部分 -

Armory钱包重装时遇到的错误

  比特币的几个流行的钱包Bitcoin-Qt、Multibit和Armory都用过,从功能和实用性来说Armory无疑是最强的钱包了,原来装Armory钱包的电脑配置比较低,虽然开的东西不多但运行Armory时会变的很卡,于是换了一个配置高的电脑,两台电脑同在一个局域网里,全新安装的话更新钱包时间太长,为了节省时间,采用手动的方式把Armory钱包的文件复制到新电脑。
Armory会调用Bitcoin-Qt,看程序目录就知道使用了QT和Python,虽然支持windows,但不是原生的Windows程序,这些从Linux下移植的程序基本上都是绿色程序,只要将所有目录都打包到新电脑就可以了。

要复制的文件:
程序目录:D:\Program Files\Armory , D:\Program Files\bitcoin
数据目录:C:\Users\XXX\AppData\Roaming\Armory , C:\Users\XXX\AppData\Roaming\bitcoin

复制完成后启动Armory遇到两个问题:
 1.启动时检查区块更新完成后,进行rebuilt database 时会崩溃,提示windows has stopped working,每次都是这样,解决方法: C:\Users\XXX\AppData\Roaming\Armory\databases下有两个文件夹,一大一小,大的是Armory从bitcoin的区块转换后的数据文件,小的是类似数据索引文件,删除小的文件夹就可以了

 2.启动时Armory一直提示是 Armory is offline,没有检查区块更新,当然也无法使用。在setting里手动指定了Bitcoin-qt的程序目录和数据目录还是不行,试了好多方法都不行,后来看到有个导出程序日志的功能(Linux下的程序日志功能就是好啊),于是导了一份出来,用记事本打开后发现有两个地方有error,是一个Python文件抛的异常,说C:\Users\XXX\AppData\Roaming\bitcoin\bitcoin.conf有问题,我印象中bitcoin-QT是没有这个文件的,打开一看果然是Armory生成的,虽然不知道是干什么的,但果断改名字,重启Armory搞定!

最新文章

最近回复

  • myogg: 您好,这个能不能将发...
  • 大青蛙子: 照着大佬的命令行复刻...
  • see: 把虚拟机平台下面其他...
  • see: 感觉是兼容性问题,我...
  • see: 做了。因为inter...
  • see: 遇到一个ipv6问题...
  • pluveto: 这功能很好
  • mgt: 从fail2ban的...
  • see: 设置容器 allo...
  • see: 本例子中的上游是 d...

分类

归档

统计

  • 文章总数:169篇
  • 分类总数:5个
  • 评论总数:129条
  • 页面总数:173个
  • 本站运行:5103天

其它