다음을 통해 공유


SSH를 통한 PowerShell 원격 작업

개요

PowerShell 원격 기능은 일반적으로 연결 협상 및 데이터 전송에 WinRM을 사용합니다. 이제 SSH를 Linux 및 Windows 플랫폼에서 사용할 수 있으며 진정한 다중 플랫폼 PowerShell 원격 기능이 지원됩니다.

WinRM은 PowerShell 원격 세션을 위한 강력한 호스팅 모델을 제공합니다. SSH 기반 원격 기능은 원격 엔드포인트 구성 및 JEA(Just Enough Administration)를 지원하지 않습니다.

SSH 원격을 사용하면 Windows 및 Linux 컴퓨터 간에 기본 PowerShell 세션 원격 작업을 수행할 수 있습니다. SSH 원격 처리는 대상 컴퓨터에 SSH 하위 시스템으로 PowerShell 호스트 프로세스를 실행합니다. 결국 엔드포인트 구성 및 JEA를 지원하기 위해 WinRM과 유사한 일반 호스팅 모델을 구현합니다.

이제 New-PSSession, Enter-PSSessionInvoke-Command cmdlet에 이 새 원격 연결을 지원하는 새 매개 변수 집합이 있습니다.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

원격 세션을 만들려면 HostName 매개 변수를 사용하여 대상 컴퓨터를 지정하고 사용자 이름에 UserName제공합니다. cmdlet을 대화형으로 실행할 때 암호를 입력하라는 메시지가 표시됩니다. KeyFilePath 매개 변수와 함께 프라이빗 키 파일을 사용하여 SSH 키 인증을 사용할 수도 있습니다. SSH 인증을 위한 키 만들기는 플랫폼에 따라 다릅니다.

일반 설정 정보

PowerShell 6 이상 및 SSH는 모든 컴퓨터에 설치해야 합니다. 컴퓨터와 원격으로 연결할 수 있도록 SSH 클라이언트(ssh.exe) 및 서버(sshd.exe)를 모두 설치합니다. Windows용 OpenSSH는 이제 Windows 10 빌드 1809 및 Windows Server 2019에서 사용할 수 있습니다. 자세한 내용은 OpenSSH사용하여 Windows 관리를 참조하세요. Linux의 경우 sshd 서버를 포함하여 SSH를 설치합니다. 이는 플랫폼에 적합합니다. 또한 SSH 원격 기능을 가져오려면 GitHub에서 PowerShell을 설치해야 합니다. 원격 컴퓨터에서 PowerShell 프로세스를 호스트하는 SSH 하위 시스템을 만들도록 SSH 서버를 구성해야 합니다. 또한 암호 또는 키 기반 인증을 사용하도록 설정해야 합니다.

Windows 컴퓨터에 SSH 서비스 설치

  1. 최신 버전의 PowerShell을 설치합니다. 자세한 내용은 Windows PowerShell 설치참조하세요.

    New-PSSession 매개 변수 집합을 나열하여 PowerShell에 SSH 원격 지원이 있는지 확인할 수 있습니다. SSH시작하는 매개 변수 집합 이름이 있습니다. 이러한 매개 변수 집합에는 SSH 매개 변수가 포함됩니다.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. 최신 Win32 OpenSSH를 설치합니다. 설치 지침은 OpenSSH 시작하기참조하세요.

    비고

    PowerShell을 OpenSSH의 기본 셸로 설정하려면 OpenSSHWindows 구성을 참조하세요.

  3. $Env:ProgramData\ssh에 있는 sshd_config 파일을 편집합니다.

    암호 인증이 사용하도록 설정되어 있는지 확인합니다.

    PasswordAuthentication yes
    

    원격 컴퓨터에서 PowerShell 프로세스를 호스트하는 SSH 하위 시스템을 만듭니다.

    Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
    

    비고

    PowerShell 7.4부터 SSH 서버 모드에서 PowerShell을 실행할 때 더 이상 -NoLogo 매개 변수를 사용할 필요가 없습니다.

    비고

    PowerShell 실행 파일의 기본 위치는 C:/progra~1/powershell/7/pwsh.exe. 위치는 PowerShell을 설치한 방법에 따라 달라질 수 있습니다.

    공백이 포함된 파일 경로에는 8.3의 짧은 이름을 사용해야 합니다. Windows용 OpenSSH에는 하위 시스템 실행 경로에서 공백이 작동하지 않는 버그가 있습니다. 자세한 내용은 해당 GitHub 이슈를 참조하세요.

    Windows에서 Program Files 폴더의 8.3 짧은 이름은 일반적으로 Progra~1. 그러나 다음 명령을 사용하여 확인할 수 있습니다.

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    C:\progra~1
    

    필요에 따라 키 인증을 사용하도록 설정합니다.

    PubkeyAuthentication yes
    

    자세한 내용은 OpenSSH 키관리를 참조하세요.

  4. sshd 서비스를 다시 시작합니다.

    Restart-Service sshd
    
  5. OpenSSH가 설치된 경로를 PATH 환경 변수에 추가합니다. 예: C:\Program Files\OpenSSH\. 이 항목을 사용하면 ssh.exe을(를) 찾을 수 있습니다.

Ubuntu Linux 컴퓨터에 SSH 서비스 설치

  1. 최신 버전의 PowerShell을 설치하십시오. Ubuntu에서 PowerShell을 설치하는 방법은 을 참조하십시오.

  2. Ubuntu OpenSSH Server설치합니다.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. /etc/ssh위치에서 sshd_config 파일을 편집합니다.

    암호 인증이 사용하도록 설정되어 있는지 확인합니다.

    PasswordAuthentication yes
    

    필요에 따라 키 인증을 사용하도록 설정합니다.

    PubkeyAuthentication yes
    

    Ubuntu에서 SSH 키를 만드는 방법에 대한 자세한 내용은 ssh-keygen대한 맨 페이지를 참조하세요.

    PowerShell 하위 시스템 항목을 추가합니다.

    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
    

    비고

    PowerShell 실행 파일의 기본 위치는 /usr/bin/pwsh. 위치는 PowerShell을 설치한 방법에 따라 달라질 수 있습니다.

    비고

    PowerShell 7.4부터 SSH 서버 모드에서 PowerShell을 실행할 때 더 이상 -NoLogo 매개 변수를 사용할 필요가 없습니다.

  4. ssh 서비스를 다시 시작합니다.

    sudo systemctl restart sshd.service
    

macOS 컴퓨터에 SSH 서비스 설치

  1. 최신 버전의 PowerShell을 설치합니다. 자세한 내용은 번역된 'macOS에서 PowerShell 설치'을 참조하세요.

    다음 단계에 따라 SSH 원격을 사용하도록 설정해야 합니다.

    1. System Settings을(를) 여십시오.
    2. General를 클릭합니다.
    3. Sharing클릭합니다.
    4. Remote Login 확인하여 Remote Login: On설정합니다.
    5. 적절한 사용자에 대한 액세스를 허용합니다.
  2. 위치 /private/etc/ssh/sshd_config에 있는 sshd_config 파일을 편집합니다.

    nano같은 텍스트 편집기를 사용합니다.

    sudo nano /private/etc/ssh/sshd_config
    

    암호 인증이 사용하도록 설정되어 있는지 확인합니다.

    PasswordAuthentication yes
    

    PowerShell 하위 시스템 항목을 추가합니다.

    Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
    

    비고

    PowerShell 실행 파일의 기본 위치는 /usr/local/bin/pwsh. 위치는 PowerShell을 설치한 방법에 따라 달라질 수 있습니다.

    비고

    PowerShell 7.4부터 SSH 서버 모드에서 PowerShell을 실행할 때 더 이상 -NoLogo 매개 변수를 사용할 필요가 없습니다.

    필요에 따라 키 인증을 사용하도록 설정합니다.

    PubkeyAuthentication yes
    
  3. sshd 서비스를 다시 시작합니다.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

비고

운영 체제를 업그레이드할 때 SSH 구성 파일을 덮어쓸 수 있습니다. 업그레이드 후 구성 파일을 확인해야 합니다.

인증

SSH를 통한 PowerShell 원격 작업은 SSH 클라이언트와 SSH 서비스 간의 인증 교환을 사용하며 인증 체계 자체를 구현하지 않습니다. 그 결과 다단계 인증을 포함하여 구성된 모든 인증 체계가 SSH에서 처리되고 PowerShell과 독립적으로 처리됩니다. 예를 들어 보안 강화를 위해 공개 키 인증 및 일회성 암호를 요구하도록 SSH 서비스를 구성할 수 있습니다. 다단계 인증의 구성은 이 설명서의 범위를 벗어습니다. PowerShell 원격에서 사용하기 전에 다단계 인증을 올바르게 구성하고 PowerShell 외부에서 작동하는지 확인하는 방법에 대한 SSH 설명서를 참조하세요.

비고

사용자는 원격 세션에서 동일한 권한을 유지합니다. 즉, 관리자는 관리자 권한 셸에 액세스할 수 있으며 일반 사용자는 액세스할 수 없습니다.

PowerShell 원격 사용 예제

원격을 테스트하는 가장 쉬운 방법은 단일 컴퓨터에서 시도하는 것입니다. 이 예제에서는 동일한 Linux 컴퓨터로 원격 세션을 다시 만듭니다. PowerShell cmdlet을 대화형으로 사용하므로 호스트 컴퓨터를 확인하고 암호를 묻는 SSH의 프롬프트가 표시됩니다. Windows 컴퓨터에서 동일한 작업을 수행하여 원격 작업이 작동하는지 확인할 수 있습니다. 그런 다음 호스트 이름을 변경하여 컴퓨터 간에 원격으로 연결합니다.

Linux에서 Linux로

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

Linux에서 Windows로

Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]

Windows에서 Windows로

C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

제한점

  • sudo 명령은 Linux 컴퓨터에 대한 원격 세션에서 작동하지 않습니다.

  • SSH를 통한 PSRemoting은 프로필을 지원하지 않으며 $PROFILE에 액세스할 수 없습니다. 세션이 완료되면 전체 파일 경로로 프로필을 소싱하여 프로필을 로드할 수 있습니다. 이는 SSH 프로필과 관련이 없습니다. PowerShell을 기본 셸로 사용하고 SSH를 통해 프로필을 로드하도록 SSH 서버를 구성할 수 있습니다. 자세한 내용은 SSH 설명서를 참조하세요.

  • PowerShell 7.1 이전에는 SSH를 통한 원격 통신에서 두 번째 홉 원격 세션을 지원하지 않았습니다. 이 기능은 WinRM을 사용하는 세션으로 제한되었습니다. PowerShell 7.1을 사용하면 대화형 원격 세션 내에서 Enter-PSSessionEnter-PSHostProcess 작동할 수 있습니다.

참고하십시오