使用PowerShell通过PuTTY更改了我的RHEL root密码,但是我不知道将密码更改为


8

基本上是标题。我的朋友为我提供了一个脚本,用于通过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;但是,登录后无法使用。

Answers:


16

问题是您正在尝试将SecureString传递给需要标准字符串的内容。Password属性为SecureString格式,您将无法将其传递给plink,它将被转换为System.Security.SecureString如果密码更改确实有效,则应设置该密码。

要将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进行测试之前,可以通过使用输出命令行值来测试命令。或者,您可以运行ProcMon并在“操作是流程创建”上进行筛选,然后在看到plink.exe启动时,可以使用属性查看正在传递的完整实际命令行。


6
亲爱的主。地球上谁会...这是很多错误的层次(不是您,PowerShell)。无论如何,您有我的支持,只是为了有勇气将它深入深渊。
wvxvw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.