Чтобы использовать для 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