Usé PowerShell para cambiar mis contraseñas raíz RHEL a través de PuTTY, pero no sé a qué cambié mi contraseña

8

Básicamente el título. Mi amigo me proporcionó un script para cambiar por lotes las contraseñas de RHEL a través de Powershell y PuTTY, pero la nueva contraseña que ingresé no funciona cuando intento iniciar sesión. Creo que el problema es que no se escapa uno de los caracteres especiales en la nueva contraseña, pero no puedo entender cuál habría sido la nueva contraseña.

La "nueva contraseña" que utilicé fue similar a esta: a1b2c3d "4e5f6g7

Intenté reemplazar las cadenas seguras por cadenas normales, o usar telnet en lugar de SSH con una captura de paquetes para determinar qué se está enviando exactamente, pero nada de eso ha funcionado hasta ahora.

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 

Esperaba que la nueva contraseña fuera a1b2c3d "4e5f6g7; sin embargo, esto no funciona al iniciar sesión.

portland_admin
fuente

Respuestas:

16

El problema es que está intentando pasar SecureString a algo que espera una cadena estándar. La propiedad Contraseña está en formato SecureString, no podrá pasar esto a plink, solo se traducirá como System.Security.SecureString. Si el cambio de contraseña realmente funcionó, esta es la contraseña que se habría establecido.

Para traducir un SecureString a un formato de texto adecuado para el comando plink, debe usar la función como este ejemplo desde aquí

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

Puede probar sus comandos mediante la Write-Hostsalida del valor de la línea de comandos antes de probar con plink.exe real. O puede ejecutar ProcMon y filtrar en Operación es Crear proceso, luego, cuando vea plink.exe lanzado, puede usar propiedades para ver la línea de comando real completa que se está pasando.

Malcolm McCaffery
fuente
66
Querido señor. Quién en la Tierra ... esto es tantos niveles de error (no tú, el PowerShell). De todos modos, tienes mi voto positivo solo por el coraje de llevar esto tan profundo al abismo.
wvxvw