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ę.
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ę.
… 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.