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

8

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 tenté 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.

portland_admin
la source

Réponses:

16

Le problème est que vous essayez de passer SecureString dans 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 en 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 d' 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-Hostpour 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.

Malcolm McCaffery
la source
6
Cher Seigneur. Qui diable le ferait ... c'est autant de niveaux de mal (pas vous, le PowerShell). Quoi qu'il en soit, vous avez mon vote positif juste pour le courage d'aller aussi loin dans l'abîme.
wvxvw