Как запустить команду PowerShell pwsh с помощью sudo - PullRequest
0 голосов
/ 23 мая 2019

Как использовать sudo для запуска команды (например, get-childitem) в PowerShell Core?

Использование 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 голосов
/ 23 мая 2019

Чтобы использовать для sudo ту же семантику, что и в оболочке POSIX (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

Поскольку текущая оболочка все еще 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...