본문 바로가기

Slack 채널 정리

powershell 로 winrm 이용하는 예

오늘 작업한 powershell 로 winrm 이용해서 원격 컴에 현재 날짜시간으로 디렉토리 생성한 후에 생성한 디렉토리에 로컬 파일을 복사해넣는 스크립트 중 중요 부분입니다.

$PSSession = New-PSSession -ComputerName 202.***.***.** -Credential "로긴ID" 

$RemoteDir = "D:\workspaces\Deployment"
Invoke-Command -Session $PSSession -ErrorAction Stop -ScriptBlock {param($param1) cd $param1} -ArgumentList $RemoteDir

$CUR_DATE = (get-date).toString('yyyyMMddHm')
Invoke-Command -Session $PSSession -ErrorAction Stop -ScriptBlock {param($cDate) new-item -itemtype directory "$cDate"} -ArgumentList $CUR_DATE
Copy-Item -Path ".\test.sbbundle" -Destination "$RemoteDir\$CUR_DATE" -ToSession $PSSession

코드에서 New-PSSession -ComputerName 202.***.***.** -Credential "로긴ID" 이 부분은 감 오겠지만 리모트 컴 연결해서 세션 생성하는 부분입니다. (물론 이 코드들 사용하려면 로컬과 리모트 컴 사이에 winrm 통신할 수 있도록 설정 작업이 선행되어야 합니다만 그 부분은 건너 뛰겠습니다)  이런 식으로 하면 코드 실행 시 리모트 데스크탑 실행할 때와 유사하게 패스워드 입력 묻는 창이 뜹니다. 보안상 이게 안전하겠지만 이게 영 번거롭다면 다음과 같이 해서 패스워드 매번 입력 필요없이 자동 연결될 수 있게도 가능합니다.

$pw = convertto-securestring -AsPlainText -Force -String 패스워드문자열
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist 로긴ID, $pw
$PSSession = new-pssession -computername

리모트IP 또는 리모트컴명 -credential $cred연결 성공해서 세션 생성되면 Invoke-Command -Session $PSSession ... 식으로 원격컴에서 명령 실행 가능합니다.
-ScriptBlock {dir d:\temp} 이런 식으로 ScriptBlock 옵션을 이용해서 명령을 전달할 수 있는데 이 때 원격 명령에 동적으로 패러미터를 넘기려면 직접 변수 사용은 안되더군요. 변수를 넘기려면
-ScriptBlock {param($param1) cd $param1} -ArgumentList $RemoteDir  처럼 -ArgumentList 를 이용해서 외부에서 변수값 주입해줘야 합니다.
로컬 파일을 원격컴에 복사해려면 Copy-Item 부분 참고하시면 됩니다.간단한 구문들이라서 이해에 어려움은 없을겁니다. 엊그제 코딩 외에 오늘 파워쉘로 추가 코딩하면서 배운 것 덤으로 하나.
파워쉘에서 외부 프로그램 실행 후에 그 창에 추가로 타이핑해서 문자를 입력해야 하는 경우가 있을 수 있을겁니다.
가령 파워쉘에서 배치 스크립트 실행하고 그 배치스크립트 실행 창에 quit 입력하고 엔터키 치려면 다음과 같이 SendKey 라는 api 이용하여 자동화할 수 있습니다.

start-process "cmd.exe" "/k test.bat"
$wshell = New-Object -ComObject wscript.shell;
Sleep 1
$wshell.SendKeys('quit{Enter}')

'Slack 채널 정리' 카테고리의 다른 글

제목 붙이기 애매한 shell script  (0) 2019.12.03
node.js child_process 한글 출력 문제  (0) 2019.12.03
grep, pgrep, fgrep  (0) 2019.12.03
정규식 ([\s\S]?)  (0) 2019.12.03
intelliJ 변수 할당 핫키  (0) 2019.12.03