Úkol :-)

Založil Zikáč, 27. 11. 2017, 23:14:10

Předchozí téma - Další téma

Zikáč

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.

Petr Krčmář

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

Zikáč

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.

Petr Krčmář

Zkus si vyvolat manuál pomocí man 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.

Zikáč

A mám použít adduser nebo useradd?

Petr Krčmář

Jak jsem napsal, rozhodně adduser. To je chytřejší obal nad nízkoúrovňovou utilitou useradd, tu nepoužívej.

Zikáč

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ě?

Petr Krčmář

Řekl bych, že to pouštíš jako běžný uživatel. Spravovat uživatele může jen root.

Zikáč

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?

Petr Krčmář

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.

Zikáč

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 :-)

Zikáč

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.

Petr Gajdůšek

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=

Zikáč

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

Petr Gajdůšek

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