Назад | Перейти на главную страницу

Использовал 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, однако это не работает при входе в систему.

Проблема в том, что вы пытаетесь передать 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, вы можете использовать свойства, чтобы увидеть полную фактическую командную строку, которая передается.