Pchełki Powershell: sudo

https://xpil.eu/jmxr

Mój poprzedni pracodawca preferował systemy uniksopodobne, tak więc wszyscy pracownicy dostawali albo laptopy z Linuksem, albo Makówki. Na szczęście można było wybierać. Do Makówek mam niechęć: ideologiczną od zawsze, a praktyczną od czasów, kiedy na próbę kupiłem sobie iPhone-a (wytrzymałem z nim prawie pięć miesięcy, co moim zdaniem było i tak o jakieś pięć miesięcy za dużo).

Zbaczam z tematu.

Chodzi o to, że miałem parę lat temu okazję popracować z Linuksem nie tylko w wariancie "zainstaluję sobie na chwilę na partycji obok Windows i zaraz zapomnę", tylko w roli pełnowymiarowego, głównego i jedynego OS-a na swojej roboczej maszynie. No a skoro Linuks, to rzecz jasna cały ekosystem podręcznych poleceń w terminalu, gdyż - wbrew temu, co próbowali nam wciskać fanboye OpenSource - od wiersza poleceń w Linuksach się nie ucieknie, choćby człowiek nie wiem jak się natężał.

A tam niepodzielnie króluje komenda sudo, czyli krótko mówiąc "wykonaj polecenie z uprawnieniami administratora". Takie sudo wymaga podania hasła administratora (chyba, że skonfigurujemy bez hasła - da się), po czym uruchamia podaną komendę z pełnym dostępem do wszystkiego i jeszcze trochę.

Obrazek wygenerowany za pomocą DALL-E

Przykład:

$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)

$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1263 kB]
...

Teraz jednak już od dość długiego czasu pracuję z powrotem z Windows, gdzie domyślną konsolą jest Powershell, a w Powershellu sudo nie ma.

Ale można sobie naru..., w sensie, napisać. Całkiem zresztą prosto. Najpierw otwieramy do edycji nasz plik z profilem (notepad $profile) a potem dopisujemy na koniec pliku:

function sudo([string] $cmd)
{
    Start-Process powershell -Verb runAs -ArgumentList "-NoExit","-Command $cmd"
}

Od tej pory każda nowa sesja Powershell będzie uzbrojona w sudo

Tylko że trochę to koślawe. Pojedyncze komendy wykonają się bez problemu, na przykład po napisaniu sudo cmd otworzy nam się okienko starego, dobrego cmd z uprawnieniami admina.

Ale już komendy z parametrami się zesrają:

sudo del c:\windows

Tu już dostaniemy błąd: sudo: A positional parameter cannot be found that accepts argument 'c:\windows'.

Dzieje się tak, ponieważ dodatkowy parametr komendy del zostaje błędnie przekazany komendzie powershell. Żeby to skorygować, trzeba przepisać nasze sudo do takiej oto postaci:

function sudo {
    $scriptBlock = $args -join ' '
    Start-Process powershell -Verb runAs -ArgumentList "-NoExit", "-Command $scriptBlock"
}

W tym wariancie, powershell wykona komendę i przekaże jej parametry tak, jak byśmy się tego spodziewali.

Czemu tak? Dalibóg, nie mam pojęcia. Może kiedyś się wgryzę. Ale działa!

Jak pisał świętej pamięci dziadek Pratchett: "Any sufficiently advanced technology is indistinguishable from magic."

Rał miację.

https://xpil.eu/jmxr

1 Comment

  1. … i właśnie dlatego po stokroć wolę powłokę Linuksa od Windowsa. 🙂

    sudo kryje rzekomo niezmierzone możliwości przydzielania użytkownikom wielopoziomowych uprawnień. Podobno książka Michaela Lucasa elegancko je wszystkie wyjaśnia.

    Swoją drogą, FreeBSD posiada uproszczony wariant sudo, który nazywa się doas.

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.