如何使用sudo运行PowerShell pwsh命令

时间:2019-05-22 21:11:31

标签: powershell-core

如何使用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

1 个答案:

答案 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
  • / usr / bin / env sudo -这样可以避免递归调用别名“ sudo”。或在当前会话中对名称“ sudo”的任何其他重写。
  • 所需的命令通过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-objectwhere-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