about_PSSessions — 원격 컴퓨터와 연결을 유지하는 PowerShell 세션
about_PSSessions — 원격 컴퓨터와 연결을 유지하는 PowerShell 세션
원격 컴퓨터에서 PowerShell 명령을 실행할 때마다 새로 연결을 만들고 끊는 일을 반복하지 않아도 되게 해 주는 게 PSSession이에요. 이 개념이 왜 필요한지, 어떻게 만들고 쓰고 닫는지 하나씩 차근차근 살펴볼게요.
본문
원격 컴퓨터에서 PowerShell 명령을 실행하는 방법은 두 가지예요. 명령을 실행할 때마다 ComputerName 매개 변수만 넣는 방법과, PSSession을 만들어서 그 세션 안에서 명령을 실행하는 방법이 있어요.
PSSession을 만들면 PowerShell이 원격 컴퓨터와 영구적인 연결(persistent connection) 을 맺어요. 그래서 같은 세션에서 이어지는 여러 명령을 실행할 수 있죠. 같은 PSSession 안에서 실행되는 명령들은 변수 값, 별칭, 함수 같은 데이터를 서로 공유할 수 있어요.
원격이 아니라 로컬 컴퓨터에도 PSSession을 만들 수 있어요. 로컬 PSSession은 PowerShell의 원격 인프라를 사용해서 세션을 만들고 유지해요.
Windows PowerShell 3.0부터 Windows의 PSSession은 세션이 만들어진 그 세션과 독립적으로 동작해요. 활성 PSSession은 원격 컴퓨터(연결의 서버 쪽)에 유지되거든요. 덕분에 Windows에서는 원격 컴퓨터의 PSSession에서 연결을 끊었다가, 나중에 같은 컴퓨터나 다른 Windows 컴퓨터에서 다시 연결할 수 있어요.
이 문서에서는 PSSession을 만들고, 쓰고, 조회하고, 삭제하는 방법을 다뤄요. 더 심화된 내용이 궁금하다면 about_PSSession_Details 문서를 봐요.
참고:
PSSession은 PowerShell 원격 인프라를 사용해요. 그래서 로컬과 원격 컴퓨터가 모두 원격 처리가 설정되어 있어야 해요. 자세한 내용은 about_Remote_Requirements를 참고해요.Windows Vista 이상에서 로컬 컴퓨터에
PSSession을 만들려면 PowerShell을 "관리자 권한으로 실행" 옵션으로 시작해야 해요.
세션(session)이 뭘까요?
세션은 PowerShell이 실행되는 환경이에요.
PowerShell을 시작할 때마다 세션이 하나 만들어지고, 그 안에서 명령을 실행할 수 있어요. 세션에 모듈이나 스냅인 같은 항목을 추가할 수도 있고, 변수·함수·별칭 같은 항목을 만들 수도 있어요. 그런 항목들은 세션 안에서만 존재하고, 세션이 끝나면 함께 사라져요.
여기에 더해 사용자가 직접 관리하는 세션, 그게 바로 'PowerShell 세션' 또는 PSSession이에요. 로컬이나 원격 컴퓨터에 만들 수 있고, 기본 세션처럼 명령 실행과 항목 추가·생성이 가능해요. 다만 자동으로 시작되는 세션과 달리, 우리가 직접 제어할 수 있어요. 조회하고, 만들고, 설정하고, 제거하고, 연결을 끊거나 다시 연결하고, 같은 PSSession 안에서 여러 명령을 실행할 수 있죠. PSSession은 우리가 지우거나 타임아웃되기 전까지는 계속 사용할 수 있어요.
보통은 원격 컴퓨터에서 이어지는 여러 명령을 실행하려고 PSSession을 만들어요. 원격 컴퓨터에 PSSession을 만들면 PowerShell이 그 세션을 뒷받침하기 위해 원격 컴퓨터와 영구 연결을 맺어요.
한편, Invoke-Command나 Enter-PSSession의 ComputerName 매개 변수로 원격 명령을 실행하거나 대화형 세션을 시작하면, PowerShell은 원격 컴퓨터에 임시 세션을 만들고 명령이 끝나거나 대화형 세션이 끝나는 즉시 닫아버려요. 이런 임시 세션은 우리가 제어할 수 없고, 하나의 명령이나 한 번의 대화형 세션에만 쓸 수 있어요.
참고로 PowerShell에서 말하는 "현재 세션(current session)" 은 지금 우리가 작업하고 있는 세션을 가리켜요. 임시 세션이든 PSSession이든, 어떤 세션이든 그 자리에서 작업 중인 세션이 바로 현재 세션이에요.
왜 PSSession을 쓸까요?
원격 컴퓨터에 영구 연결이 필요할 때 PSSession을 써요. PSSession에서는 변수 값, 함수 내용, 별칭 정의 같은 데이터를 공유하는 일련의 명령들을 실행할 수 있어요.
사실 PSSession 없이도 원격 명령은 실행할 수 있어요. 원격 가능한 cmdlet의 ComputerName 매개 변수를 쓰면 하나의 명령이나 서로 연관 없는 명령 몇 개를 여러 컴퓨터에서 실행할 수 있어요.
다만 Invoke-Command나 Enter-PSSession의 ComputerName 매개 변수를 쓸 때는 원격 컴퓨터와 임시 연결을 만든 다음, 명령이 끝나면 그 연결을 닫아 버려요. 그 사이에 만들었던 데이터 요소들은 연결이 닫히면 전부 사라져요.
또 Get-Eventlog나 Get-WmiObject처럼 ComputerName 매개 변수를 가진 다른 cmdlet들은 데이터를 가져오는 데 다른 원격 기술을 써요. 그 중 어떤 것도 PSSession처럼 영구 연결을 만들지 않아요.
PSSession 만들기
PSSession을 만들려면 New-PSSession cmdlet을 써요. 원격 컴퓨터에 만들려면 New-PSSession cmdlet의 ComputerName 매개 변수를 사용해요.
예를 들어, 다음 명령은 Server01 컴퓨터에 새 PSSession을 만들어요.
New-PSSession -ComputerName Server01
명령을 실행하면 New-PSSession이 PSSession을 만들고, 그 세션을 나타내는 객체를 반환해요. 만들 때 그 객체를 변수에 저장해 둘 수도 있고, 나중에 Get-PSSession 명령으로 조회할 수도 있어요.
예를 들어, 다음 명령은 Server01에 새 PSSession을 만들고 결과 객체를 $ps 변수에 저장해요.
$ps = New-PSSession -ComputerName Server01
여러 컴퓨터에 PSSession 만들기
여러 컴퓨터에 PSSession을 만들려면 New-PSSession cmdlet의 ComputerName 매개 변수를 사용해요. 원격 컴퓨터 이름을 쉼표로 구분해서 나열하면 돼요.
예를 들어 Server01, Server02, Server03 컴퓨터에 PSSession을 만들려면 다음과 같이 입력해요.
New-PSSession -ComputerName Server01, Server02, Server03
New-PSSession은 각 원격 컴퓨터에 PSSession을 하나씩 만들어요.
PSSession 조회하기
현재 세션에서 만든 PSSession을 조회하려면 ComputerName 매개 변수 없이 Get-PSSession cmdlet을 사용해요. Get-PSSession은 New-PSSession이 반환하는 것과 같은 종류의 객체를 반환해요.
다음 명령은 현재 세션에서 만들어진 모든 PSSession을 가져와요.
Get-PSSession
PSSession의 기본 표시는 ID와 기본 표시 이름을 보여줘요. 세션을 만들 때 대체 표시 이름을 지정할 수도 있어요.
Id Name ComputerName State ConfigurationName
--- ---- ------------ ----- ---------------------
1 Session1 Server01 Opened Microsoft.PowerShell
2 Session2 Server02 Opened Microsoft.PowerShell
3 Session3 Server03 Opened Microsoft.PowerShell
PSSession을 변수에 저장할 수도 있어요. 다음 명령은 PSSession들을 가져와 $ps123 변수에 저장해요.
$ps123 = Get-PSSession
PSSession cmdlet을 쓸 때는 PSSession을 ID, 이름, 또는 instance ID(GUID)로 참조할 수 있어요. 다음 명령은 ID로 PSSession을 가져와 $ps01 변수에 저장해요.
$ps01 = Get-PSSession -Id 1
Windows PowerShell 3.0부터 PSSession은 원격 컴퓨터에 유지돼요. 특정 원격 컴퓨터에서 만든 PSSession을 조회하려면 Get-PSSession cmdlet의 ComputerName 매개 변수를 사용해요. 다음 명령은 Server01 원격 컴퓨터에서 만든 PSSession들을 가져와요. 여기에는 현재 세션에서 만든 것과, 로컬 컴퓨터나 다른 컴퓨터의 다른 세션에서 만든 것도 포함돼요.
Get-PSSession -ComputerName Server01
Windows PowerShell 2.0에서 Get-PSSession은 현재 세션에서 만들어진 PSSession만 가져와요. 로컬 컴퓨터에 연결되어 명령을 실행하고 있더라도, 다른 세션이나 다른 컴퓨터에서 만든 PSSession은 가져오지 못해요.
PSSession에서 명령 실행하기
하나 또는 여러 PSSession에서 명령을 실행하려면 Invoke-Command cmdlet을 사용해요. Session 매개 변수로 PSSession을 지정하고, ScriptBlock 매개 변수로 명령을 지정해요.
예를 들어 $ps123 변수에 저장된 세 개의 PSSession 각각에서 Get-ChildItem("dir") 명령을 실행하려면 다음과 같이 입력해요.
Invoke-Command -Session $ps123 -ScriptBlock { Get-ChildItem }
PSSession 삭제하기
PSSession 사용이 끝났다면 Remove-PSSession cmdlet으로 PSSession을 삭제하고, 사용 중이던 리소스를 해제해요.
Remove-PSSession -Session $ps
또는
Remove-PSSession -Id 1
원격 컴퓨터에서 PSSession을 제거하려면 Remove-PSSession cmdlet의 ComputerName 매개 변수를 사용해요.
Remove-PSSession -ComputerName Server01 -Id 1
PSSession을 삭제하지 않으면 타임아웃될 때까지 계속 사용할 수 있어요.
유휴 PSSession의 만료 시간을 설정하려면 New-PSSessionOption cmdlet의 IdleTimeout 매개 변수를 쓸 수도 있어요. 자세한 내용은 New-PSSessionOption을 참고해요.
PSSession cmdlet 목록
PSSession cmdlet 목록을 보려면 다음과 같이 입력해요.
Get-Help *-PSSession
Connect-PSSession:PSSession을 현재 세션에 연결해요.Disconnect-PSSession: 현재 세션에서PSSession연결을 끊어요.Enter-PSSession: 대화형 세션을 시작해요.Exit-PSSession: 대화형 세션을 끝내요.Get-PSSession: 현재 세션의PSSession을 가져와요.New-PSSession: 로컬 또는 원격 컴퓨터에 새PSSession을 만들어요.Receive-PSSession: 연결이 끊긴 세션에서 실행된 명령의 결과를 가져와요.Remove-PSSession: 현재 세션의PSSession을 삭제해요.
참고: 연결이 끊긴 세션(disconnected session)은 Windows에서만 지원돼요.
Connect-PSSession,Disconnect-PSSession,Receive-PSSessioncmdlet도 Windows에서만 사용할 수 있어요. 연결이 끊긴 세션에 대한 자세한 내용은 about_Remote_Disconnected_Session을 참고해요.
더 읽을거리
PSSession에 대해 더 자세히 알고 싶다면 about_PSSession_Details 문서를 봐요.