基本的にタイトル。私の友人は、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であると予想していましたが、これはログイン時に機能しません。
問題は、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が起動したことを確認したら、プロパティを使用して、渡されている実際のコマンドライン全体を確認できます。