Menggunakan PowerShell untuk mengubah kata sandi root RHEL saya melalui Putty, tapi saya tidak tahu apa yang saya ubah kata sandi saya

8

Pada dasarnya judulnya. Teman saya memberi saya skrip untuk mengubah kata sandi RHEL secara batch melalui Powershell dan Putty, tetapi kata sandi baru yang saya masukkan tidak berfungsi ketika saya mencoba masuk. Saya pikir masalahnya adalah bahwa itu tidak lepas dari salah satu karakter khusus yang di kata sandi baru, tapi saya tidak tahu apa kata sandi baru itu.

"Kata sandi baru" yang saya gunakan mirip dengan ini: a1b2c3d "4e5f6g7

Saya mencoba untuk mengganti string aman untuk string biasa, atau menggunakan telnet daripada SSH dengan paket capture untuk menentukan apa yang sebenarnya dikirim, tetapi tidak ada yang bekerja sejauh ini.

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 

Saya mengharapkan kata sandi baru menjadi a1b2c3d "4e5f6g7; namun, ini tidak berfungsi saat login.

portland_admin
sumber

Jawaban:

16

Masalahnya adalah Anda mencoba untuk melewati SecureString menjadi sesuatu yang mengharapkan string standar. Properti Kata Sandi dalam format SecureString, Anda tidak akan dapat mengirimkannya ke plink, ini hanya akan diterjemahkan sebagai System.Security.SecureString Jika perubahan kata sandi benar-benar berfungsi, inilah kata sandi yang akan ditetapkan.

Untuk menerjemahkan SecureString ke format teks yang cocok untuk perintah plink, Anda perlu menggunakan fungsi seperti contoh ini dari sini

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

Anda dapat menguji perintah Anda dengan menggunakan Write-Hostnilai baris perintah output sebelum pengujian dengan plink.exe yang sebenarnya. Atau Anda dapat menjalankan ProcMon dan memfilter pada Operation is Process Create, kemudian ketika Anda melihat plink.exe diluncurkan, Anda dapat menggunakan properti untuk melihat baris perintah aktual aktual yang dilewati.

Malcolm McCaffery
sumber
6
Yatuhan. Siapa di bumi akan ... ini begitu banyak tingkat kesalahan (bukan Anda, PowerShell). Ngomong-ngomong, kamu punya upvote saya hanya untuk keberanian untuk mendapatkan ini jauh ke dalam jurang.
wvxvw