Debian fórum

Mimo mí­su => Volná diskuze => Téma založeno: Zikáč 27. 11. 2017, 23:14:10

Název: Úkol :-)
Přispěvatel: Zikáč 27. 11. 2017, 23:14:10
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.
Název: Re:Úkol :-)
Přispěvatel: Petr Krčmář 28. 11. 2017, 08:24:52
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:

Kód: [Vybrat]
#!/bin/bash
echo -n "Zadej jmeno: "
read jmeno
echo "Uzivatel se jmenuje" $jmeno
Název: Re:Úkol :-)
Přispěvatel: Zikáč 28. 11. 2017, 13:52:43
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.
Název: Re:Úkol :-)
Přispěvatel: Petr Krčmář 28. 11. 2017, 14:16:45
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.
Název: Re:Úkol :-)
Přispěvatel: Zikáč 28. 11. 2017, 18:25:25
A mám použít adduser nebo useradd?
Název: Re:Úkol :-)
Přispěvatel: Petr Krčmář 28. 11. 2017, 19:06:44
Jak jsem napsal, rozhodně adduser. To je chytřejší obal nad nízkoúrovňovou utilitou useradd, tu nepoužívej.
Název: Re:Úkol :-)
Přispěvatel: Zikáč 28. 11. 2017, 20:25:33
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ě?
Název: Re:Úkol :-)
Přispěvatel: Petr Krčmář 28. 11. 2017, 21:39:58
Řekl bych, že to pouštíš jako běžný uživatel. Spravovat uživatele může jen root.
Název: Re:Úkol :-)
Přispěvatel: Zikáč 28. 11. 2017, 21:46:44
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?
Název: Re:Úkol :-)
Přispěvatel: Petr Krčmář 28. 11. 2017, 22:08:12
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.
Název: Re:Úkol :-)
Přispěvatel: Zikáč 29. 11. 2017, 21:23:29
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 :-)
Název: Re:Úkol :-)
Přispěvatel: Zikáč 09. 12. 2017, 19:47:54
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.
Název: Re:Úkol :-)
Přispěvatel: Petr Gajdůšek 10. 12. 2017, 01:10:31
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
Kód: [Vybrat]
man 5 systemd.timera na popis voleb OnBootSec= a OnUnitActiveSec=, případně OnUnitInactiveSec=
Název: Re:Úkol :-)
Přispěvatel: Zikáč 10. 12. 2017, 12:50:48
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..
Název: Re:Úkol :-)
Přispěvatel: Petr Gajdůšek 10. 12. 2017, 17:18:45
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í.

Kód: [Vybrat]
$ 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).
Kód: [Vybrat]
$ sudo journalctl --no-tail --follow --boot
Název: Re:Úkol :-)
Přispěvatel: Zikáč 11. 12. 2017, 20:52:30
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.
Název: Re:Úkol :-)
Přispěvatel: Petr Gajdůšek 12. 12. 2017, 04:45:15
Musíš ten script přece volat s parametry, který očekává.
Kód: [Vybrat]
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:
Kód: [Vybrat]
/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.
Kód: [Vybrat]
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
Kód: [Vybrat]
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!