如何使用sudo
在PowerShell Core中运行命令(例如get-childitem
)?
在当前用户不可见的路径上使用get-childitem
:
$ get-childitem -path /sys/kernel/debug
get-childitem : Access to the path '/sys/kernel/debug' is denied.
At line:1 char:1
+ get-childitem -path /sys/kernel/debug
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (/sys/kernel/debug:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
但是尝试使用sudo
会导致“找不到命令”:
$ sudo get-childitem -path /sys/kernel/debug
sudo: get-childitem: command not found
答案 0 :(得分:0)
要为 sudo 使用与在POSIX shell(bash等)中相同的语义,请创建包装函数及其别名。将它们放在您的$profile
中,以便您每次在 pwsh 中都可以使用。
$ cat $profile
function Invoke-MySudo { & /usr/bin/env sudo pwsh -command "& $args" }
set-alias sudo invoke-mysudo
pwsh
在提升的sudo
会话中运行。如果调用默认别名,例如pwd -> Get-Location
。结果:
$ sudo get-childitem -path /sys/kernel/debug | head
[sudo] password for user:
Directory: /sys/kernel/debug
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 5/22/19 8:35 AM acpi
d----- 5/22/19 8:35 AM asoc
d----- 5/22/19 3:32 PM bdi
d----- 5/22/19 3:32 PM block
因为当前的shell仍然是pwsh,所以管道具有在PowerShell中调用的命令的所有修饰,例如foreach-object
和where-object
。
要在提升用户的上下文中使用管道链接,请以字符串形式提供整个表达式。 sudo
命令之外的任何管道操作都将根据所调用命令的标准输出结果进行。
$ sudo 'get-childitem -path /sys/kernel/debug `
| where-object { $_.name -like ''b*'' } `
| foreach-object { write-host $_.fullname } ' `
| foreach-object {
"{0} ... {1}" -f $_.GetType(), $_.ToUpper() | write-host
}
System.String ... /SYS/KERNEL/DEBUG/BDI
System.String ... /SYS/KERNEL/DEBUG/BLOCK
System.String ... /SYS/KERNEL/DEBUG/BLUETOOTH
System.String ... /SYS/KERNEL/DEBUG/BTRFS