web-dev-qa-db-ja.com

PowerShellを使用してPuTTY経由でRHELルートパスワードを変更しましたが、パスワードを何に変更したのかわかりません

基本的にタイトル。私の友人は、PowershellとPuTTYを介してRHELパスワードをバッチ変更するスクリプトを提供してくれましたが、ログインしようとしたときに、入力した新しいパスワードが機能しません。問題は、新しいパスワードを入力しましたが、新しいパスワードがどうなるかわかりません。

私が使用した「新しいパスワード」はこれに似ていました:a1b2c3d "4e5f6g7

安全な文字列を通常の文字列に置き換えるか、SSHではなくtelnetを使用してパケットキャプチャを送信し、何が送信されているかを正確に判断しようとしましたが、これまでのところ機能していません。

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
portland_admin

問題は、SecureStringを標準文字列が必要なものに渡そうとしていることです。 PasswordプロパティはSecureString形式です。これをplinkに渡すことはできず、System.Security.SecureStringとして変換されます。パスワードの変更が実際に機能したため、これがパスワードが設定されたはずです。

SecureStringをplinkコマンドに適したテキスト形式に変換するには、この例のような関数を here から使用する必要があります

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

実際のplink.exeでテストする前に、Write-Hostを使用してコマンドライン値を出力することにより、コマンドをテストできます。または ProcMon を実行し、操作のフィルターがProcess Createの場合、plink.exeが起動したことを確認したら、プロパティを使用して、渡されている実際のコマンドライン全体を確認できます。

16