如何使用Sudo运行PowerShell PWSH命令



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

与您在posix shell(bash等(中使用的 sudo 使用相同的语义,创建包装器函数和一个别名。将它们放在您的$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"的重写。
  • 所需的命令通过sudo在高架pwsh会话内运行。如果称为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

由于当前的外壳仍然是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

相关内容

  • 没有找到相关文章

最新更新