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.

Skomentuj Borys Anuluj pisanie odpowiedzi

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.