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
이때 사용 가능한 정책은 Unrestricted
와 Bypass
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의 명령 기록 파일을 삭제하여 없애버릴 수 있습니다.