Bash: info mail o dokončení příkazu

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bash: info mail o dokončení příkazu
« Odpověď #15 kdy: 04. 08. 2016, 09:47:44 »
No ty mi dáváš teda... rouru musíš eskejpovat jako \| , případně dát celej příkaz do uvozovek, takže
Kód: [Vybrat]
mail_notify ps -aux \| grep syslognebo
Kód: [Vybrat]
mail_notify "ps -aux | grep syslog"nicméně s rourou to hodí exit status pouze posledního příkazu v rouře, takže celý předělat takto:
Kód: [Vybrat]
    DEFAULT_MAIL=mail@kdesi.cosi
    VERBOSE=NO
    IFS=''
    params_count=$#;
    params_array=( "$@" )
    param=0
    while [ $param -lt $params_count ]; do
        if [ ${params_array[$param]} = "-v" ]; then
            VERBOSE=YES
            let param++
            continue
        fi
        if [ ${params_array[$param]} = "-n" ]; then
            VERBOSE=NO
            let param++
            continue
        fi
        if [ ${params_array[$param]} = "-a" ]; then
            let param++
            DEFAULT_MAIL=${params_array[$param]}
            let param++
            continue
        fi
        while [ $param -lt $params_count ]; do
            command+=${params_array[$param]}" "
            let param++
        done
        break
    done
    mail_body="Prikaz: $command\n"
    origcommand=$command;
    if [ $VERBOSE = "YES" ]; then
        commandadd=" 2>&1; "
    else
        commandadd=" > /dev/null; "
    fi
    commandadd+='mypipe=(${PIPESTATUS[@]}); '
    commandadd+='echo -e "\nVysledky:"; '
    commandadd+='IFS="|"; '
    commandadd+='read -r -a parts <<< "$origcommand"; '
    commandadd+='for (( c=0; c<${#mypipe[@]}; c++)); do echo ${parts[$c]} : exit status ${mypipe[$c]} | sed -e "s/^[[:space:]]*//" | sed -e "
s/[[:space:]]*$//" ;done;'
    if [ $VERBOSE = "YES" ]; then
        mail_body+="\nVystup:\n"
    fi
    mail_body+=$(eval $command $commandadd)
    echo -e $mail_body | mail -s "Hotovo: $(echo -e $origcommand)" $DEFAULT_MAIL

a na konci mailu ti to vypíše exit statusy všech částí roury po jedné.


Re:Bash: info mail o dokončení příkazu
« Odpověď #16 kdy: 04. 08. 2016, 12:28:58 »
Uz to skoro mam.

Skript notify.sh:
Kód: [Vybrat]
#!/bin/bash

mail_notify() {
exit_status="$?"
cmd_output="$($@)"
hostname=`cat /etc/hostname`
        mail_body="Prikaz: \n"
        mail_body+="----------------------------------\n"
        mail_body+=`history | tail -n 1 | cut -c 8-`
mail_body+="\n----------------------------------\n\n\n"
mail_body+="Vystup:\n"
mail_body+="----------------------------------\n"
mail_body+=$cmd_output
        mail_body+="\n----------------------------------\n"
mail_body+="\n\nExit status: $exit_status"
IFS=''
echo $cmd_output
echo -e $mail_body | mail -s "PRIKAZ [$hostname]: $exit_status" mujmail@gmail.com
}

V bashrc mam:
Kód: [Vybrat]
source notify.sh
A ukazka pouziti:
Kód: [Vybrat]
$ mail_notify ls -lh / | grep "etc"
drwxr-xr-x 182 root root  12K srp  2 22:11 etc
$

Otazka zni: proc v mailu je vystup prikazu bez grepu (za rourou), ale na stdout se to vypise spravne? viz obrazek v priloze
"Kdo v zájmu bezpečí obětuje část své svobody, v konečném důsledku přijde o svobodu i svou bezpečnost."

Tuxik

  • *****
  • 1 473
    • Zobrazit profil
    • E-mail
Re:Bash: info mail o dokončení příkazu
« Odpověď #17 kdy: 04. 08. 2016, 12:42:55 »
No to sem ti psal, musíš tu rouru escapovat, místo | napiš \| , jinak to provede pouze
Kód: [Vybrat]
mail_notify ls -lh /a až výstup toho prožene přes rouru a do
Kód: [Vybrat]
grep "etc"

Navíc i když to escapuješ, při použití roury bude exitcode pouze pro poslední příkaz v rouře, takže viz zdroják výše, kterej to pořeší a vypíše exitcode pro každou z částí zvlášť.