Использовал PowerShell для изменения моих корневых паролей RHEL через PuTTY, но я не знаю, что я изменил свой пароль на

В основном заголовок. Мой друг предоставил мне сценарий для пакетного изменения паролей RHEL через Powershell и PuTTY, но новый пароль, который я ввел, не работает, когда я пытаюсь войти в систему. Я думаю, проблема в том, что он не экранирует один из специальных символов, который в новом пароле, но я не могу понять, каким был бы новый пароль.

«Новый пароль», который я использовал, был похож на этот: a1b2c3d «4e5f6g7

Я попытался заменить защищенные строки на обычные строк или используйте telnet вместо SSH с захватом пакетов, чтобы определить, что именно отправляется, но пока ничего из этого не сработало.

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 

Я ожидал, что новый пароль будет a1b2c3d "4e5f6g7; однако это не работает при входе в систему.

8
задан 15 July 2019 в 20:49
1 ответ

Проблема в том, что вы пытаетесь передать SecureString во что-то, ожидающее стандартной строки. Свойство Password имеет формат SecureString, вы не сможете передать его в plink, оно будет просто переведено как System.Security.SecureString Если бы смена пароля действительно сработала, это был бы пароль. набор.

Чтобы преобразовать SecureString в текстовый формат, подходящий для команды plink, вам необходимо использовать функцию, подобную этому примеру, из здесь

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

Вы можете протестировать свои команды, используя Write-Host для вывода командной строки значение перед тестированием с фактическим plink.exe. Или вы можете запустить ProcMon и отфильтровать операцию «Создание процесса», затем, когда вы увидите, что запущен plink.exe, вы можете использовать свойства, чтобы увидеть полную фактическую командную строку, которая передается.

16
ответ дан 2 December 2019 в 22:48

Теги

Похожие вопросы