Jakiś czas temu “zajszła” potrzeba zmiany loginu jednego użytkownika systemu. Jednym z rozwiązań jest założenie nowego konta, przekopiowanie plików ze starego $HOME do nowego i chown -R. Ale pozostaje jeszcze kwestia pozostałych plików w systemie (a to jakaś sesja w /tmp, a to jakieś “śmieci” utworzone poza katalogiem domowy). Ogólnie lipa. Dodajemy nowego usera to z automatu ma nowe UID (GID może, aczkolwiek nie musi, pozostać ten sam). W związku z tym pytanie – co zrobić z pozostałymi plikami? Jednym z rozwiązań jest łamaniec w stylu

find / -user UID_STAREGO_KONTA -exec chown nowy_user:nowa_grupa '{}' \;

. Niby OK. Ale przeszukanie dysku 200GB trochę czasu zajmie, zamęczy dysk i w ogóle lipa.  Innym rozwiązaniem jest skorzystanie z systemowego usermod -l old_name new_name. Ale i to rozwiązanie ma jedną wadę – cytując manuala:

The name of the user will be changed from LOGIN to NEW_LOGIN. Nothing else is changed. In particular, the user’s home directory name should probably be changed manually to reflect the new login name.

Czyli dostajemy nowy login tak jak chcieliśmy ale katalog domowy użytkownika nadal ma starą nazwę. Takie troszkę nieestetyczne rozwiązanie.

Czy jest zatem narzędzie, które rozwiąże wszystkie problemy? Ja niestety nie doszukałem się takowego, dlatego postanowiłem stworzyć własne. Skrypt nosi wdzięczną nazwę “re-login” można go pobrać stąd. Działanie jest proste – modyfikacja plików /etc/group, /etc/passwd, /etc/shadow oraz zmiana nazwy katalogu domowego.

Skrypt został przetestowany w środowisku produkcyjnym i działa bez zarzutu. Gdyby ktoś miał jakieś zastrzeżenia, uwagi to piszcie. Postaramy się poprawić.

Współudział przy tworzeniu skryptu: Mateusz ‘thalcave’ Chynowski jako “debugger” :) oraz lis6502 – wskazówki dotyczące seda. Skrypt został opublikowany na licencji GNU GPL v2 (lub późniejszej). Autorzy nie ponoszą żadnej odpowiedzialności za działanie i wykorzystanie skryptu (ostrzeżenie proforma;))

WykopShare