PowerShell 사생활 보호 모드

2021년에 (벌써 3년 전이라고?!), bash 터미널에서 “사생활 보호 모드"를 활성화하는 방법에 대해 글을 쓴 적이 있습니다. 요즘에는 윈도우 시스템도 사용하게 되어, PowerShell의 명령 기록을 잠시 비활성화하는 방법이 필요하게 되었죠.

PowerShell은 두 개의 명령 기록 모듈이 있습니다. 첫번째 모듈은 현재 세션으로만 한정되고, 그 세션에서 실행한 모든 명령 기록을 Get-History 명령으로 확인할 수 있습니다:

PS C:\Users\erics\OneDrive\Pictures> Get-History

  Id CommandLine
  -- -----------
   1 cd .\OneDrive\Pictures\
   2 ls

나머지 명령 기록 모듈은 PSReadLine이 저장하는데, 이게 문제가 되는 이유가 .bash_history처럼 (윈도우나 파일을 삭제할 때까지 보존되는) 파일에 명령 기록을 저장하기 때문입니다. 이 파일은 여기에서 찾아볼 수 있죠: $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine.

기본적으로, PowerShell쪽은 bash와 다르게 스페이스로 시작하는 명령도 기록에 저장해버리기 때문에 기본 설정값이 더 “열악하죠”.

다행히도, 이러한 문제점을 해결하기 위해 프로필 스크립트를 수정하는 방법이 있습니다.

(참고: 아래의 코드 대부분은 이 문제에 대한 GitHub issue에서 발췌해왔습니다!)

실행 정책 변경하기

PowerShell은 기본으로 신뢰하지 않는 스크립트를 실행하지 않도록 설정되어 있기 때문에, 실행 정책을 변경해야 합니다:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force

이때 사용 가능한 정책은 UnrestrictedBypass 2개입니다. Unrestricted는 스크립트를 실행하기 전 경고하고, Bypass는 아무런 경고 없이 아무거나 집어 실행하죠 (리눅스 셸과 bash+x 플래그가 달려 있는 아무 스크립트나 실행하는 것처럼요).

프로필 스크립트 수정하기

즐겨쓰는 텍스트 편집기에서 프로필 스크립트를 열어줍니다:

notepad++ $profile

그리고 다음을 붙여넣으시면 됩니다:

# 스페이스로 시작하는 명령 기록하지 않기
Set-PSReadLineOption -AddToHistoryHandler {
    param([string]$line)
    return $line.Length -gt 3 -and $line[0] -ne ' ' -and $line[0] -ne ';'
}

# 명령 기록 비활성화/활성화 wrapper
function Disable-PSReadLineHistory {
    $global:PSReadLineOldHistorySaveStyle = (Get-PSReadLineOption).HistorySaveStyle
    Set-PSReadLineOption -HistorySaveStyle SaveNothing
}

function Enable-PSReadLineHistory {
    # Only change the history style if we previously saved it in `Disable-PSReadLineHistory`
    if (Test-Path variable:PSReadLineOldHistorySaveStyle) {
        Set-PSReadLineOption -HistorySaveStyle $global:PSReadLineOldHistorySaveStyle
    }
}

이제 PowerShell의 명령 기록을 잠시 비활성화하고 싶을 때, Disable-PSReadLineHistory를 실행하면 됩니다. 현재 세션에서만 명령 기록을 멈춰주죠.

이게 기본으로 탑재되어 있었다면 얼마나 좋았을까요.

예전 명령 기록 삭제하기

만약 예전에 실행했던 민감한 명령들이 기록에 남아있는 경우, Clear-History를 실행한 후 위에 나와있는 PSReadLine의 명령 기록 파일을 삭제하여 없애버릴 수 있습니다.

아니면, Stack Overflow에 있는 이 스크립트를 사용하세요.

댓글