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.