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


8

В основном название. Мой друг предоставил мне скрипт для пакетного изменения паролей 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, однако он не работает при входе в систему.

Ответы:


16

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


6
О Боже. Кто на Земле ... так много уровней неправильно (не вы, PowerShell). В любом случае, у вас есть мой голос только за смелость проникнуть так глубоко в пропасть.
wvxvw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.