Ho usato PowerShell per modificare le mie password di root RHEL tramite PuTTY, ma non so in cosa ho cambiato la mia password


8

Fondamentalmente il titolo. Il mio amico mi ha fornito uno script per cambiare in batch le password RHEL tramite Powershell e PuTTY, ma la nuova password che ho inserito non funziona quando provo ad accedere. Penso che il problema sia che non sfugge a uno dei caratteri speciali che è nella nuova password, ma non riesco a capire quale sarebbe stata la nuova password.

La "nuova password" che ho usato era simile a questa: a1b2c3d "4e5f6g7

Ho tentato di sostituire le stringhe sicure con stringhe regolari o di utilizzare telnet invece di SSH con una cattura di pacchetti per determinare esattamente cosa viene inviato, ma nulla di tutto ciò ha funzionato finora.

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 

Mi aspettavo che la nuova password fosse a1b2c3d "4e5f6g7; tuttavia, questo non funziona al momento dell'accesso.

Risposte:


16

Il problema è che stai provando a passare SecureString in qualcosa che prevede una stringa standard. La proprietà Password è in formato SecureString, non sarai in grado di passare questo per plink, verrà semplicemente tradotto come System.Security.SecureString Se la modifica della password effettivamente funzionasse, questa è la password che sarebbe stata impostata.

Per tradurre un SecureString in formato testo adatto al comando plink è necessario utilizzare la funzione come questo esempio da qui

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

È possibile testare i comandi utilizzando Write-Hostper generare il valore della riga di comando prima di eseguire il test con plink.exe effettivo. Oppure puoi eseguire ProcMon e filtrare su Operazione è Creazione processo, quindi quando vedi lanciare plink.exe puoi usare le proprietà per vedere l'intera riga di comando effettiva che viene superata.


6
Caro signore. Chi sulla Terra vorrebbe ... questo è così tanti livelli di errore (non tu, PowerShell). Ad ogni modo, hai il mio voto solo per il coraggio di entrare così profondamente nell'abisso.
— wvxvw,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.