Usei o PowerShell para alterar minhas senhas de root RHEL via PuTTY, mas não sei para que alterei minha senha.

8

Basicamente o título. Meu amigo me forneceu um script para alterar em lote as senhas RHEL via Powershell e PuTTY, mas a nova senha inserida não funciona quando tento fazer login. Acho que o problema é que ela não escapa a um dos caracteres especiais que são na nova senha, mas não consigo descobrir qual teria sido a nova senha.

A "nova senha" que usei foi semelhante a esta: a1b2c3d "4e5f6g7

Tentei substituir as cadeias seguras por cadeias regulares ou usar o telnet em vez do SSH com uma captura de pacotes para determinar exatamente o que está sendo enviado, mas nada disso funcionou até agora.

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 

Eu esperava que a nova senha fosse a1b2c3d "4e5f6g7; no entanto, isso não funciona no login.

portland_admin
fonte

Respostas:

16

O problema é que você está tentando passar o SecureString para algo que espera uma sequência padrão. A propriedade Password está no formato SecureString, você não poderá passar isso para plink, apenas será traduzido como System.Security.SecureString Se a alteração da senha realmente funcionasse, seria a senha que teria sido definida.

Para converter um SecureString para o formato de texto adequado ao comando plink, você precisa usar a função como este exemplo daqui

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

Você pode testar seus comandos usando Write-Hostpara gerar o valor da linha de comandos antes de testar com o plink.exe real. Ou você pode executar o ProcMon e filtrar em Operation is Process Create; quando você vê o plink.exe iniciado, pode usar as propriedades para ver a linha de comando real completa que está sendo aprovada.

Malcolm McCaffery
fonte
6
Querido senhor. Quem na Terra iria ... isso é tantos níveis de erro (não você, o PowerShell). De qualquer forma, você tem o meu voto positivo apenas pela coragem de aprofundar isso no abismo.
Wdxvw