about_PSSession_Details

about_PSSession_Details

PowerShell에서 세션(Session)은 그냥 "명령을 실행하는 공간" 정도로만 여기시는 분이 많은데요. 사실 세션은 원격 명령을 다룰 때 아주 중요한 개념이에요. 특히 직접 만들고 관리하는 PSSession은 원격 컴퓨터에 연결해서 여러 명령을 이어서 실행할 때 핵심적인 역할을 해요. 이 문서에서는 PowerShell 세션과 PSSession이 무엇인지, 그리고 언제 만들어 쓰면 좋은지를 차근차근 설명해 드릴게요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pssession_details?view=powershell-7.6

본문

간단한 설명 (Short description)

PowerShell 세션과 이 세션이 원격 명령에서 맡는 역할에 대해 자세히 설명하는 문서예요.

자세한 설명 (Long description)

세션은 PowerShell이 실행되는 환경을 말해요. 여러분이 PowerShell을 시작할 때마다 세션이 하나 만들어지죠. 여기에 더해 컴퓨터나 다른 컴퓨터에 "PowerShell 세션", 줄여서 PSSession 이라고 부르는 세션을 추가로 만들 수도 있어요.

PowerShell이 자동으로 만들어 주는 세션과 달리, 여러분이 직접 만든 PSSession은 여러분이 제어하고 관리해요.

PSSession은 원격 컴퓨팅에서 중요한 역할을 해요. 원격 컴퓨터에 연결된 PSSession을 만들면, PowerShell이 그 원격 컴퓨터와 영구적인 연결(지속적 연결) 을 맺어서 PSSession을 지원해 줘요. 이 PSSession 안에서 데이터를 공유하는 일련의 명령, 함수, 스크립트를 실행할 수 있죠.

이 문서는 PowerShell의 세션과 PSSession에 대한 자세한 내용을 다뤄요. 세션으로 할 수 있는 작업의 기본적인 내용은 about_PSSessions 문서를 참고하세요.

세션이란 (About sessions)

엄밀하게 말하면 세션은 PowerShell이 실행되는 실행 환경이에요. 세션마다 System.Management.Automation 엔진의 인스턴스 하나와, PowerShell이 실행되는 호스트 프로그램이 포함돼요. 호스트는 익숙한 PowerShell 콘솔일 수도 있고, Cmd.exe처럼 명령을 실행하는 다른 프로그램이거나, Windows PowerShell ISE(통합 스크립팅 환경)처럼 PowerShell을 호스트하도록 만들어진 프로그램일 수도 있어요. Windows 기준으로 보면 세션은 대상 컴퓨터에서 실행되는 Windows 프로세스 하나라고 할 수 있어요.

각 세션은 독립적으로 구성돼요. 세션마다 고유한 속성, 실행 정책, 프로필을 갖고 있죠. 세션이 만들어질 당시의 환경은, 컴퓨터의 환경을 나중에 바꿔도 세션이 살아 있는 동안 계속 유지돼요. 모든 세션은 전역 범위(global scope) 에서 생성되는데, 스크립트 안에서 만드는 세션도 예외가 아니에요.

한 세션에서는 한 번에 하나의 명령(또는 파이프라인)만 실행할 수 있어요. 동기적으로(하나씩) 실행되는 두 번째 명령은 첫 번째 명령이 끝날 때까지 최대 4분을 기다려요. 비동기적으로(동시에) 실행되는 두 번째 명령은 실패해요.

PSSession이란 (About PSSessions)

PowerShell을 시작할 때마다 세션이 하나 만들어져요. 또 PowerShell은 개별 명령을 실행하기 위해 임시 세션을 만들기도 해요. 하지만 그와 별개로, 여러분이 직접 제어하고 관리하는 세션(이게 바로 PSSession이에요)을 만들 수도 있어요.

PSSession은 원격 명령에서 아주 중요한 역할을 해요. Invoke-CommandEnter-PSSession cmdlet의 ComputerName 매개 변수를 쓰면, PowerShell이 명령을 실행할 임시 세션을 만들어서 명령이나 대화형 세션이 끝나는 즉시 그 세션을 닫아요.

하지만 New-PSSession cmdlet으로 PSSession을 만들면 이야기가 달라져요. PowerShell이 원격 컴퓨터에 영구 세션을 만들고, 여기서 여러 명령이나 대화형 세션을 실행할 수 있어요. 여러분이 만든 PSSession은 직접 삭제하거나, 그 세션을 만든 세션을 닫기 전까지 계속 열려 있고 사용 가능한 상태로 남아요.

원격 컴퓨터에 PSSession을 만들면, 시스템이 원격 컴퓨터에 PowerShell 프로세스를 하나 만들고, 로컬 컴퓨터에서 그 원격 프로세스로의 연결을 맺어요. 로컬 컴퓨터에 PSSession을 만들면, 새 프로세스와 연결이 모두 로컬 컴퓨터에 만들어져요.

언제 PSSession이 필요할까요? (When do I need a PSSession?)

Invoke-CommandEnter-PSSession cmdlet에는 ComputerName 매개 변수와 Session 매개 변수가 모두 있어요. 둘 중 아무거나 써서 원격 명령을 실행할 수 있죠.

  • ComputerName 매개 변수는 단일 명령이나 서로 연관이 없는 일련의 명령을 하나 또는 여러 컴퓨터에서 실행할 때 써요.
  • 데이터를 공유하는 명령을 실행하려면 원격 컴퓨터와의 영구 연결이 필요해요. 이때는 PSSession을 만들고, Session 매개 변수로 그 PSSession 안에서 명령을 실행하면 돼요.

원격 컴퓨터에서 데이터를 가져오는 다른 많은 cmdlet, 예를 들어 Get-Process, Get-Service, Get-EventLog, Get-WmiObject 같은 것들은 ComputerName 매개 변수만 있어요. 이 cmdlet들은 PowerShell 원격 기능(remoting)이 아니라 다른 기술로 원격 데이터를 가져와요. 그래서 Session 매개 변수가 없는데, 이런 명령을 PSSession 안에서 실행하고 싶다면 Invoke-Command cmdlet으로 감싸서 실행하면 돼요.

PSSession은 어떻게 만들까요? (How do I create a PSSession?)

PSSession을 만들 때는 New-PSSession cmdlet을 사용해요. New-PSSession으로 로컬 컴퓨터든 원격 컴퓨터든 PSSession을 만들 수 있어요.

어떤 컴퓨터에서든 PSSession을 만들 수 있나요? (Can I create a PSSession on any computer?)

원격 컴퓨터에 연결된 PSSession을 만들려면, 그 컴퓨터가 PowerShell에서 원격 기능(remoting)을 쓰도록 구성되어 있어야 해요. 그리고 현재 사용자가 원격 컴퓨터의 Administrators 그룹 멤버이거나, Administrators 그룹 멤버의 자격 증명을 제공할 수 있어야 해요. 자세한 내용은 about_Remote_Requirements 문서를 참고하세요.

다른 세션에서 내 PSSession을 볼 수 있나요? (Can I see my PSSessions in other sessions?)

Windows PowerShell 3.0부터는 Get-PSSession cmdlet의 ComputerName 매개 변수로, 지정한 원격 컴퓨터에 여러분이 만든 PSSession을 가져올 수 있어요.

활성 PSSession은 연결의 "서버 쪽"인 원격 컴퓨터에 유지되기 때문에, 어떤 컴퓨터의 어떤 세션에서든 가져올 수 있어요.

예를 들어 Server01 컴퓨터에서 Server02 컴퓨터로 이어지는 PSSession을 만든 다음 Server03 컴퓨터로 옮겨 갔다면, 아래처럼 명령을 써서 그 세션을 가져올 수 있어요.

Get-PSSession -ComputerName Server02

세션에서 연결을 끊어도, 직접 삭제하거나 시간 초과(timeout)되기 전까지는 그 세션이 원격 컴퓨터에 계속 유지돼요.

Windows PowerShell 2.0에서는 현재 세션에서 직접 만든 PSSession만 가져올 수 있어요. 다른 세션에서 만든 PSSession은 가져올 수 없죠. 자세한 내용은 Get-PSSession 문서를 참고하세요.

다른 사람이 내 컴퓨터에 만든 PSSession도 볼 수 있나요? (Can I see the PSSessions that others have created on my computer?)

다른 사람이 만든 PSSession을 가져오고 관리할 수 있는 경우는 딱 두 가지예요. 그 PSSession을 만든 사용자의 자격 증명을 제공할 수 있거나, 그 PSSession이 사용하는 세션 구성에 RunAs 자격 증명이 포함된 경우예요. 그 외에는 여러분이 직접 만든 PSSession만 가져오고, 연결하고, 사용하고, 관리할 수 있어요.

다른 컴퓨터에서 PSSession에 연결할 수 있나요? (Can I connect to a PSSession from a different computer?)

Windows PowerShell 3.0부터 Windows 컴퓨터의 PSSession은 세션이 만들어진 곳과 독립적이에요. 활성 PSSession은 연결의 원격 쪽, 즉 "서버 쪽" 컴퓨터에 유지돼요.

Windows 컴퓨터에서 Disconnect-PSSession cmdlet을 쓰면 PSSession에서 연결을 끊을 수 있어요. 이때 PSSession은 로컬 세션과 연결이 끊어지지만, 원격 컴퓨터에는 계속 유지돼요. 끊어진 PSSession에서는 명령이 계속 실행돼요. PowerShell을 닫고 출발점이 된 컴퓨터를 종료해도 PSSession은 방해받지 않아요.

그리고 몇 시간이 지난 뒤에도, 다른 Windows 컴퓨터의 새 세션에서 Get-PSSession cmdlet으로 PSSession을 가져오고 Connect-PSSession cmdlet으로 다시 연결할 수 있어요. 자세한 내용은 about_Remote_Disconnected_Sessions 문서를 참고하세요.

컴퓨터가 멈추면 PSSession은 어떻게 되나요? (What happens to my PSSession if my computer stops?)

연결이 끊긴 PSSession은 세션이 만들어진 곳과 독립적이에요. PSSession의 연결을 끊은 뒤 출발점이 된 컴퓨터를 닫으면, 그 PSSession은 원격 컴퓨터에 계속 유지돼요.

여기에 더해, PowerShell은 컴퓨터 재부팅, 일시적인 정전, 네트워크 장애처럼 의도치 않게 끊어진 활성 PSSession을 복구하려고 시도해요. 출발점이 된 세션이 아직 사용 가능하면 PSSession을 활성(Opened) 상태로 유지하거나 복구하려 하고, 그렇지 않으면 연결 끊김(disconnected) 상태로 만들어요.

여기서 "활성" PSSession이란 명령을 실행 중인 세션을 말해요. 연결된(끊겨 있지 않은) PSSession에서 명령이 실행 중일 때 연결된 세션이 닫히면, PowerShell은 그 PSSession을 원격 컴퓨터에 유지하려고 해요. 하지만 PSSession에서 실행 중인 명령이 없으면, 연결된 세션이 닫힐 때 PowerShell이 그 PSSession도 함께 닫아요. 자세한 내용은 about_Remote_Disconnected_Sessions 문서를 참고하세요.

PSSession에서 백그라운드 작업을 실행할 수 있나요? (Can I run a background job in a PSSession?)

네, 됩니다. 백그라운드 작업(job) 은 현재 세션과 상호작용하지 않고 백그라운드에서 비동기적으로 실행되는 명령이에요. 작업을 시작하는 명령을 제출하면, 그 명령은 작업 개체(job object)를 반환하지만 실제 작업은 완료될 때까지 백그라운드에서 계속 실행돼요.

로컬 컴퓨터에서 백그라운드 작업을 시작하려면 Start-Job 명령을 사용해요. 이 작업을 임시 연결(ComputerName 매개 변수 사용)이나 PSSession(Session 매개 변수 사용)에서 실행할 수 있어요.

원격 컴퓨터에서 백그라운드 작업을 시작하려면 Invoke-Command cmdlet에 AsJob 매개 변수를 쓰거나, Invoke-Command cmdlet으로 원격 컴퓨터에서 Start-Job 명령을 실행하면 돼요. AsJob 매개 변수를 쓸 때는 ComputerName이나 Session 매개 변수를 사용할 수 있어요.

Invoke-CommandStart-Job 명령을 실행할 때는 반드시 PSSession 안에서 실행해야 해요. 여기서 ComputerName 매개 변수를 쓰면, 작업 개체가 반환될 때 PowerShell이 연결을 끝내 버리고 작업이 중단돼요.

자세한 내용은 about_Jobs 문서를 참고하세요.

대화형 세션을 실행할 수 있나요? (Can I run an interactive session?)

네, 가능해요. 원격 컴퓨터와 대화형 세션을 시작하려면 Enter-PSSession cmdlet을 사용해요. 대화형 세션에서 입력하는 명령은, 마치 원격 컴퓨터에 직접 입력한 것처럼 원격 컴퓨터에서 실행돼요.

대화형 세션은 임시 세션(ComputerName 매개 변수 사용)이나 PSSession(Session 매개 변수 사용)에서 실행할 수 있어요. PSSession을 쓰면, PSSession이 이전 명령의 데이터를 유지하고, 대화형 세션 중에 만들어진 데이터도 나중의 명령에서 쓸 수 있게 유지해 줘요.

대화형 세션을 끝내도 PSSession은 열린 상태로 남아 있어 사용할 수 있어요.

자세한 내용은 Enter-PSSession 문서와 Exit-PSSession 문서를 참고하세요.

PSSession을 꼭 삭제해야 하나요? (Must I delete the PSSessions?)

네, 꼭 삭제해야 해요. PSSession은 프로세스예요. 프로세스는 사용하지 않을 때도 메모리와 기타 자원을 쓰는 독립된 환경이죠. PSSession을 다 쓰고 나면 삭제하세요. PSSession을 여러 개 만들었다면, 사용하지 않는 것은 닫고 현재 사용 중인 것만 유지하는 게 좋아요.

PSSession을 삭제할 때는 Remove-PSSession cmdlet을 사용해요. 이 cmdlet이 PSSession을 삭제하고, 그 세션이 쓰던 모든 자원을 해제해 줘요.

New-PSSessionOptionIdleTimeOut 매개 변수를 쓰면, 지정한 시간만큼 유휴 상태인 PSSession을 자동으로 닫게 할 수도 있어요. 자세한 내용은 New-PSSessionOption 문서를 참고하세요.

한 가지 주의할 점이 있어요. PSSession 개체를 변수에 저장해 두고 그 PSSession을 삭제하거나 시간 초과로 닫아 버리면, 변수에는 여전히 PSSession 개체가 남아 있어요. 하지만 그 PSSession은 더 이상 활성 상태가 아니므로 사용하거나 복구할 수 없어요.

모든 세션과 PSSession이 똑같나요? (Are all sessions and PSSessions alike?)

아니에요, 똑같지 않아요. 개발자는 선택된 공급자(provider)와 cmdlet만 포함된 사용자 지정 세션을 만들 수 있어요. 한 세션에서는 잘 작동하는 명령이 다른 세션에서는 작동하지 않는다면, 그 원인이 세션이 제한되어 있기 때문일 수 있어요.

더 알아보기