web-dev-qa-db-fra.com

J'ai utilisé PowerShell pour changer mes mots de passe root RHEL via PuTTY, mais je ne sais pas en quoi j'ai changé mon mot de passe

Fondamentalement, le titre. Mon ami m'a fourni un script pour modifier par lots les mots de passe RHEL via Powershell et PuTTY, mais le nouveau mot de passe que j'ai entré ne fonctionne pas lorsque j'essaie de me connecter. Je pense que le problème est qu'il n'échappe pas à l'un des caractères spéciaux qui sont dans le nouveau mot de passe, mais je ne peux pas comprendre quel aurait été le nouveau mot de passe.

Le "nouveau mot de passe" que j'ai utilisé était similaire à ceci: a1b2c3d "4e5f6g7

J'ai essayé de remplacer les chaînes sécurisées par des chaînes régulières, ou d'utiliser telnet au lieu de SSH avec une capture de paquets pour déterminer exactement ce qui est envoyé, mais rien de tout cela n'a fonctionné jusqu'à présent.

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 

Je m'attendais à ce que le nouveau mot de passe soit a1b2c3d "4e5f6g7; cependant, cela ne fonctionne pas lors de la connexion.

8
portland_admin

Le problème est que vous essayez de passer SecureString à quelque chose qui attend une chaîne standard. La propriété Password est au format SecureString, vous ne pourrez pas la transmettre à plink, elle sera simplement traduite comme System.Security.SecureString Si le changement de mot de passe a réellement fonctionné, c'est ce mot de passe qui aurait été défini.

Pour traduire une SecureString au format texte adapté à la commande plink, vous devez utiliser une fonction comme cet exemple de ici

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

Vous pouvez tester vos commandes en utilisant Write-Host pour afficher la valeur de la ligne de commande avant de tester avec plink.exe réel. Ou vous pouvez exécuter ProcMon et filtrer sur Operation is Process Create, puis lorsque vous voyez plink.exe lancé, vous pouvez utiliser les propriétés pour voir la ligne de commande réelle complète qui est transmise.

16
Malcolm McCaffery