Đã sử dụng PowerShell để thay đổi mật khẩu gốc RHEL của tôi thông qua PuTTY, nhưng tôi không biết tôi đã thay đổi mật khẩu của mình thành gì


8

Về cơ bản tiêu đề. Bạn tôi đã cung cấp cho tôi một tập lệnh để thay đổi hàng loạt mật khẩu RHEL thông qua Powershell và PuTTY, nhưng mật khẩu mới tôi nhập không hoạt động khi tôi cố gắng đăng nhập. Tôi nghĩ vấn đề là nó không thoát khỏi một trong những ký tự đặc biệt đó là trong mật khẩu mới, nhưng tôi không thể biết mật khẩu mới sẽ là gì.

"Mật khẩu mới" tôi đã sử dụng tương tự như sau: a1b2c3d "4e5f6g7

Tôi đã cố gắng thay thế các chuỗi bảo mật cho các chuỗi thông thường hoặc sử dụng telnet thay vì SSH bằng một gói chụp để xác định chính xác những gì đang được gửi, nhưng không có chuỗi nào hoạt động cho đến nay.

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 

Tôi dự kiến ​​mật khẩu mới sẽ là a1b2c3d "4e5f6g7; tuy nhiên, điều này không hoạt động khi đăng nhập.

Câu trả lời:


16

Vấn đề là bạn đang cố gắng chuyển SecureString vào thứ gì đó mong đợi một chuỗi tiêu chuẩn. Thuộc tính Mật khẩu ở định dạng SecureString, bạn sẽ không thể chuyển thông tin này sang plink, nó sẽ được dịch là System.Security.SecureString Nếu thay đổi mật khẩu thực sự hoạt động thì đây là mật khẩu sẽ được đặt.

Để dịch SecureString sang định dạng văn bản phù hợp với lệnh plink, bạn cần sử dụng chức năng như ví dụ này từ đây

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

Bạn có thể kiểm tra các lệnh của mình bằng cách sử dụng Write-Hostđể xuất giá trị dòng lệnh trước khi kiểm tra với plink.exe thực tế. Hoặc bạn có thể chạy ProcMon và bộ lọc trên Hoạt động là Quá trình tạo, sau đó khi bạn thấy plink.exe được khởi chạy, bạn có thể sử dụng các thuộc tính để xem dòng lệnh thực tế đầy đủ đang được thông qua.


6
Thưa ngài. Ai trên trái đất sẽ ... đây là quá nhiều cấp độ sai (không phải bạn, PowerShell). Dù sao, bạn có upvote của tôi chỉ vì sự can đảm để đi sâu vào vực thẳm này.
wvxvw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.