오늘은 Powershell Remote 실행 관련하여 매개변수를 받는 경우 생기는 이슈에 대해 이야기 해보겠습니다.
예를 들어 A서버에서 B서버로 Remote PowerShell 명령어를 사용하여 붙는 경우에는 일반적으로 Invoke-Command를 사용합니다.
Invoke-Command는 ScriptBlock 명령어를 지정한 서버에 실행하게 됩니다.
ScriptBlock의 경우 일반적으로 다음 양식을 따릅니다.
{ "명령어" }
그런데 원격지 서버로 명령어를 수행할때 변수가 사용되는 경우 이슈가 생깁니다.
Invoke-Command 명령어의 경우 Remote 세션을 새로 만들기 때문에 기존에 가지고 있는 Local 세션과 다른 세션이 만들어지므로 변수 값을 인식을 못합니다.
예를 들어
$sb=123
Invoke-Command { Get-ChildItem $sb } -ComputerName B
위와 같은 명령어가 있는 경우
ComputerName B와 연결된 세션에서는 $sb 변수를 인지하지 못하게 됩니다.
그래서 로컬 변수를 원격의 변수로 넣어주기 위해서는 다음과 같은 작업을 진행합니다.
$d = "C:\Test"
$sb = { Get-ChildItem "$using:d" }
Invoke-Command -ScriptBlock $sb -ComputerName B
여기서 using이 로컬 변수를 원격의 새로 생긴 세션에 변수를 가져오는 역할을 합니다.
해당 서버에 호스트네임으로 접속하는 경우에 이슈가 없으나 IP로 접근하는경우
winrm s winrm/config/client '@{TrustedHosts="서버 아이피"}'
를 입력해야합니다.
모든 원격 서버를 승인하기 위해서는 서버 아이피 대신 Remote Computer를 입력합니다.
오늘은 Powershell Remote 실행 관련하여 매개변수를 받는 경우 생기는 이슈에 대해 이야기 해보겠습니다.
예를 들어 A서버에서 B서버로 Remote PowerShell 명령어를 사용하여 붙는 경우에는 일반적으로 Invoke-Command를 사용합니다.
Invoke-Command는 ScriptBlock 명령어를 지정한 서버에 실행하게 됩니다.
ScriptBlock의 경우 일반적으로 다음 양식을 따릅니다.
{ "명령어" }
그런데 원격지 서버로 명령어를 수행할때 변수가 사용되는 경우 이슈가 생깁니다.
Invoke-Command 명령어의 경우 Remote 세션을 새로 만들기 때문에 기존에 가지고 있는 Local 세션과 다른 세션이 만들어지므로 변수 값을 인식을 못합니다.
예를 들어
$sb=123
Invoke-Command { Get-ChildItem $sb } -ComputerName B
위와 같은 명령어가 있는 경우
ComputerName B와 연결된 세션에서는 $sb 변수를 인지하지 못하게 됩니다.
그래서 로컬 변수를 원격의 변수로 넣어주기 위해서는 다음과 같은 작업을 진행합니다.
$d = "C:\Test"
$sb = { Get-ChildItem "$using:d" }
Invoke-Command -ScriptBlock $sb -ComputerName B
여기서 using이 로컬 변수를 원격의 새로 생긴 세션에 변수를 가져오는 역할을 합니다.
해당 서버에 호스트네임으로 접속하는 경우에 이슈가 없으나 IP로 접근하는경우
winrm s winrm/config/client '@{TrustedHosts="서버 아이피"}'
를 입력해야합니다.
모든 원격 서버를 승인하기 위해서는 서버 아이피 대신 Remote Computer를 입력합니다.