Ich habe PowerShell verwendet, um meine RHEL-Root-Passwörter über PuTTY zu ändern, aber ich weiß nicht, in was ich mein Passwort geändert habe

8

Grundsätzlich der Titel. Mein Freund hat mir ein Skript zum Batch-Ändern von RHEL-Passwörtern über Powershell und PuTTY zur Verfügung gestellt, aber das neue Passwort, das ich eingegeben habe, funktioniert nicht, wenn ich mich anmelden möchte. Ich denke, das Problem ist, dass es keinem der Sonderzeichen entgeht im neuen Passwort, aber ich kann nicht herausfinden, was das neue Passwort gewesen wäre.

Das "neue Passwort", das ich verwendet habe, war ähnlich: a1b2c3d "4e5f6g7

Ich habe versucht, die sicheren Zeichenfolgen durch reguläre Zeichenfolgen zu ersetzen oder Telnet anstelle von SSH durch eine Paketerfassung zu verwenden, um festzustellen, was genau gesendet wird, aber bisher hat nichts davon funktioniert.

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 

Ich habe erwartet, dass das neue Passwort a1b2c3d "4e5f6g7 ist; dies funktioniert jedoch beim Anmelden nicht.

portland_admin
quelle

Antworten:

16

Das Problem ist, dass Sie versuchen, SecureString an etwas zu übergeben, das eine Standardzeichenfolge erwartet. Die Password-Eigenschaft hat das SecureString-Format. Sie können dies nicht an plink übergeben. Sie wird lediglich als System.Security.SecureString übersetzt. Wenn die Kennwortänderung tatsächlich funktioniert hätte, wäre dieses Kennwort festgelegt worden.

Um einen SecureString in ein für den Plink-Befehl geeignetes Textformat zu übersetzen, müssen Sie die Funktion wie in diesem Beispiel von hier aus verwenden

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 { }
}

Sie können Ihre Befehle testen, indem Sie Write-Hostden Befehlszeilenwert vor dem Testen mit der tatsächlichen Datei plink.exe ausgeben. Oder Sie können ProcMon ausführen und nach Operation is Process Create filtern. Wenn dann plink.exe gestartet wird, können Sie Eigenschaften verwenden, um die vollständige tatsächliche Befehlszeile anzuzeigen, die übergeben wird.

Malcolm McCaffery
quelle
6
Lieber Herr. Wer um alles in der Welt würde ... das sind so viele Ebenen von Unrecht (nicht du, die PowerShell). Wie auch immer, Sie haben meine Zustimmung nur für den Mut, dies tief in den Abgrund zu bringen.
wvxvw