使用 PowerShell 通过 PuTTY 更改我的 RHEL 根密码,但我不知道我将密码改成了什么

使用 PowerShell 通过 PuTTY 更改我的 RHEL 根密码,但我不知道我将密码改成了什么

基本上就是标题。我的朋友给我提供了一个脚本,可以通过 Powershell 和 PuTTY 批量更改 RHEL 密码,但是当我尝试登录时,我输入的新密码不起作用。我认为问题是它没有转义新密码中的一个特殊字符,但我不知道新密码是什么。

我使用的“新密码”类似于:a1b2c3d“4e5f6g7

我尝试用常规字符串替换安全字符串,或者使用 telnet 而不是 SSH 并进行数据包捕获以确定到底发送了什么,但到目前为止这些都没有起作用。

System.Management.Automation.PSCredential -argumentlist "root",$newrootPassword
     $newrootPassword2 = Read-Host "Retype new root password" -AsSecureString
     $newrootCredential2 = new-object -typename System.Management.Automation.PSCredential -argumentlist "root",$newrootPassword2


    putty.exe -ssh -pw $oldrootCredential.GetNetworkCredential().Password root@$_

    echo y | plink.exe -ssh -v -pw $oldrootCredential.GetNetworkCredential().Password root@$_ "echo root:'$newrootPassword' | chpasswd" 2>&1 

我预计新密码是 a1b2c3d"4e5f6g7;然而,这在登录时不起作用。

答案1

问题是您试图将 SecureString 传递给需要标准字符串的东西。Password 属性采用 SecureString 格式,您无法将其传递给 plink,它只会被翻译为系统.安全.安全字符串如果密码更改确实有效,那么这就是应该设置的密码。

要将 SecureString 转换为适合 plink 命令的文本格式,您需要使用类似此示例的函数这里

function Get-PlainText()
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.Security.SecureString]$SecureString
    )
    BEGIN { }
    PROCESS
    {
        $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString);

        try
        {
            return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr);
        }
        finally
        {
            [Runtime.InteropServices.Marshal]::FreeBSTR($bstr);
        }
    }
    END { }
}

您可以Write-Host在使用实际的 plink.exe 进行测试之前,使用输出命令行值来测试您的命令。或者您可以运行进程监控并且操作上的过滤器是进程创建,那么当您看到 plink.exe 启动时,您可以使用属性来查看传递的完整实际命令行。

相关内容