因為 Linux 用習(xí)慣了模聋,沒有 su/sudo命令總覺得不太方便,經(jīng)過一番搜索,決定自己來實現(xiàn)一個 su 命令瞳浦。
基本思路是:
- 通過別名來調(diào)用一個自定義函數(shù)(函數(shù)可以寫在類似于 .bashrc 這樣的文件里)
- 函數(shù)要能提權(quán)(不需要繞過UAC)
實現(xiàn)
那么我們先確定 .bashrc 類似的配置文件的位置。
> Get-Variable PROFILE
Name Value
---- -----
PROFILE C:\Users\Yourname\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
然后用編輯器(如 Notepad++ 或 Notepad2)打開這個文件废士,在里面輸入如下內(nèi)容:
function su-fun {Start-Process powershell -Verb runAs -argumentlist '-NoExit', "cd '$pwd'"}
set-alias su su-fun
set-alias sudo su-fun
保存即可叫潦。
解析:
首先我們看這一句
Start-Process powershell -Verb runAs -argumentlist '-NoExit', "cd '$pwd'"
前半段很好理解,Start-Process powershell -Verb runAs
就是新建一個 Powershell 窗口官硝,后面的 -verb runAs
就是 “Run as Administrator 的意思矗蕊,也就是以管理員身份啟動一個新的 Powershell 窗口短蜕。
后半段是什么意思呢?細(xì)心的人會發(fā)現(xiàn)傻咖,通過之前那句命令啟動的 shell 的工作目錄是在默認(rèn)工作目錄朋魔,也就是C:\Windows\System32
,而不是我們之前的位置卿操。那么我們怎么樣吧工作目錄傳遞過去呢警检?
首先我想到的是 start-process
的 -WorkingDirectory <String>
參數(shù),但是實際測試發(fā)現(xiàn)不管用害淤,應(yīng)該是安全起見扇雕,RunAs 和 WorkingDirectory 不能同時啟用,請參見 Stack Overflow
In practice, as of PSv5 – and the docs do not mention that – the -WorkingDirectory parameter is not respected if you start a process elevated (with administrative privileges, which is what -Verb RunAs – somewhat obscurely – does): the location defaults to $env:SYSTEMROOT\system32 (typically, C:\Windows\System32)
與此同時窥摄,該貼答主還貼出了解決方案
Start-Process -FilePath powershell.exe -Verb Runas -ArgumentList '-NoExit', '-Command', 'cd C:\ws'
也就是說镶奉,把 cd xxx
作為一個命令傳入新開的 Powershell 中。
但我們不能照搬嘛崭放,我們要把 C:\ws
改成我們的當(dāng)前目錄腮鞍,而在 Powershell 中,存有當(dāng)前目錄的變量就是 $pwd
莹菱,于是命令便順理成章地變成了
Start-Process -FilePath powershell.exe -Verb Runas `
-ArgumentList '-NoExit', '-Command', "cd '$pwd'"
$pwd
外加上了引號移国,避免路徑中包含空格時出問題
命令有了,怎么讓這個命令擁有別名呢道伟?當(dāng)然迹缀,我們可以把這個命令保存為批處理腳本放到 C:\Windows\System32
,但這樣畢竟不優(yōu)雅蜜徽,有沒有不用腳本也能達(dá)到相同效果的呢祝懂?我首先想到的就是 Set-Alias
這個命令,Alias 就是別名的意思嘛拘鞋。但是 Set-Alias
不能設(shè)置這么長的命令的別名砚蓬,怎么辦呢?
又是一番搜索盆色,找到了這個How to create a complex powershell alias
里面提到灰蛙,可以先用 function 把要執(zhí)行的代碼塊包起來,然后給這個 function 一個別名隔躲。
于是整體思路就出來了:在配置文檔里面用 function 創(chuàng)建代碼塊摩梧,并且給它一個別名。
function sudo-fun {Start-Process powershell -Verb runAs -argumentlist '-NoExit', "cd '$pwd'"}
set-alias sudo sudo-fun
DEBUG
若出現(xiàn)如圖所示錯誤宣旱,是因為你的系統(tǒng)為了自保護(hù)仅父,默認(rèn)禁用了ps腳本(也就是我們的配置文件)的執(zhí)行,我們需要用管理員身份執(zhí)行這個命令 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
來允許它
這樣子就可以了
參考文檔:Start-Process - Microsoft Docs
EOF