Ahoj všichni :-)
Jsem tady nový (defacto i ve světě Linuxu), a ve škole jsem dostal úkol vytvořit skript v shellu s následujícím zadáním:
Vytvoření nového účtu uživatele, jehož domovský adresář bude zadán při/po spuštění skriptu.
Vytvoření nového uživatele bych zvládl, zadání domovského adresáře též, ale pokud ten úkol dobře chápu, je požadováno, že jméno uživatele i domovský adresář se vytvoří podle požadavků uživatele. A to je pro mě oříšek. Nevím, jak to napsat, aby po spuštění skriptu se vytvořil dotaz na jméno uživatele a cestu, kde chce vytvořit domovský adresář.
Nevěděl byste někdo, jak to vytvořit?
Předem všem děkuji za jakoukoliv pomoc :-)
P.S. Google už jsem zkoušel asi 4 hodiny projíždět, ale bohužel jsem nenarazil na nic kloudného.
Ke čtení uživatelských vstupů slouží v shellu příkaz read, který jako parametr přijímá název proměnné, do které bude vstup uložen. Vyzkoušej:
#!/bin/bash
echo -n "Zadej jmeno: "
read jmeno
echo "Uzivatel se jmenuje" $jmeno
Tohle jsem zkoušel ještě včera, každopádně děkuji :-)
Hlavní problém mi dělá to zadání domovského adresáře.. Nevím, jaký parametr použít. Použiju read, ale co dál?
Ještě jednou děkuji.
Zkus si vyvolat manuál pomocí man adduser (https://www.root.cz/man/8/adduser/) a najdi si v něm parametr, který určuje domovský adresář uživatele. Tomu předáš jako argument proměnnou s obsahem, který zadal uživatel.
A mám použít adduser nebo useradd?
Jak jsem napsal, rozhodně adduser. To je chytřejší obal nad nízkoúrovňovou utilitou useradd, tu nepoužívej.
Když to napíšu takto:
echo -n "Zadej jmeno uzivatele: "
read jmeno
echo -n "Zadej domovsky adresar: "
read home
adduser --home $home $jmeno
Při spuštění mi to píše:
adduser - příkaz nenalezen
Co dělám špatně?
Řekl bych, že to pouštíš jako běžný uživatel. Spravovat uživatele může jen root.
V zadání úkolu je:
soubor s řešením (použitým příkazem nebo příkazy), které musí být spustitelné na jiném systému stejných parametrů a u kteréhokoli uživatele (nesmí být závislé na jménu uživatele či typu jeho oprávnění).
Tak teď nevím..
Jak mám ten skript napsat, aby se spouštěl s požadavkem na root přístup?
Ale notak, přece nečekáš celý postup. Obecná rada zní: použij chytře Google. Když se ho zeptáš "how to run command as root", dozvíš se, že existuje příkaz sudo.
Tak nakonec jsem na to přišel. Sudo mi zezačátku nechtěl fungovat, ale pak jsme se nějak domluvili :-)
Děkuji moc za rady :-)
Opět zdravím všechny :-)
A opět máme úkol, tentokrát to snad bude jednodušší. Mám spouštět skript každých 20 minut po restartu. To jak nastavit spouštění každých 20 minut bych už měl pomocí crontab, ale jak tam přidat ten restart(reboot)? Googlování ukazuje na @reboot, ale to se mi nějak nezdá. Byla by možná rada?
P.S.: Mám spouštět ten skript, který jsem tvořil na začátku tohoto vlákna - vytvoření uživatele.
Předem děkuji.
Ahoj,
nemám zkušenosti, ale kdybych chtěl co nejjednodušeji něco spouštět každých 20 minut po restartu, podíval bych se nejdříve na man 5 systemd.timer
a na popis voleb OnBootSec= a OnUnitActiveSec=, případně OnUnitInactiveSec=
Zkoušel jsem hledat podle tvé rady. Našel jsem tento postup:
https://jason.the-graham.com/2013/03/06/how-to-use-systemd-timers/
Vše se mi povedlo nastavit bez problémů, skript se ale vůbec nespustí. Je na tom postupu něco špatně?
Díky..
Ten postup je v pořádku.
Snad jen zvýšit přesnost pomocí AccuracySec=, protože výchozí hodnota je 1 minuta, takže se ti skript bude volat každých 20 - 21 minut.
Zkontroluj status toho timeru a podívej se na logy.
TIP: Pokud ten script něco zapíše na standardní výstup (nebo standardní chybový výstup) tak se to objeví v logách. Toho můžeš využít k ladění.
$ sudo systemctl status myscript.timer
$ sudo journalctl --no-tail --follow --boot --unit myscript.service
Případně všechny logy (při omezení na unitu mně journalctl vynechává logy).
$ sudo journalctl --no-tail --follow --boot
Ta kontrola statutu se hodila, moc díky. Jen mám teď problém - skript se má spustit automaticky a při jeho spuštění mám zadat jméno a domovský adresář nového uživatele. Měl jsem skript takto:
#!/bin/bash
user=$1
home_directory=$2
sudo adduser $user --home $home_directory
Pokud to nastavím a spustím, nic se nestane, pouze v logu napíše, že adduser potřebuje vstupní parametry. Zadání úkolu je takové, že skript nesmí být interaktivní. Když zadám do skriptu hodnoty přímo do příkazu adduser, uživatel se co 20 minut vytvoří.
Co s tím?
P.S.: Pokud skript výše napsaný spustím manuálně, zadám heslo sudo a terminál se zavře.
Musíš ten script přece volat s parametry, který očekává.
muj_skript.sh <uzivatel> <home>
Přidej ty parametry do ExecStart= své systemd unity, stejně jako bys script spouštěl z příkazové řádky.
Jinak ten script má celkem dost problémů:
Volání adduser bys měl ošetřit pro libovolné (i nevalidní) hodnoty parametrů, např. obsahující mezery nebo začínající pomlčkou:
/usr/sbin/adduser --home="$home_directory" -- "$user"
Pokud má být script neinteraktivní, nemá v něm co dělat volání interaktivního sudo. Můžeš explicitně kontrolovat ještě před voláním adduser, zda je skript spuštěn pod rootem, jinak skončit chybou; místo toho abys nechal na nedostatek práv selhat až volání adduser.
if [[ $(whoami) != root ]]; then echo "You must run this script as root" >&2; exit 1; fi
Volat adduser jenom tehdy, pokud uživatel neexistuje, aby ses vyhnul neustálému selhávání a logování chyby. Ke zjištění, zda uživatel existuje se dá použít návratový kód příkazu getent passwd
if ! getent passwd -- "$user" >/dev/null; then ... fi
Mohl bys lépe parsovat parametry scriptu a případně vypisovat help.
http://wiki.bash-hackers.org/scripting/posparams
Hodně zdaru!