Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Michal Švarc 22. 03. 2022, 06:59:57
-
Jednoduchá roura jako je třeba
pwd | ls
se dá snadno převést na SOUBORY=$(ls $(pwd))
(nalezeno zde (https://osy.pages.fel.cvut.cz/docs/cviceni/lab2/bash/))
když jsem ale zkusil převést
awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq | tr -s '\n' ','
na
failbanlog=$(tr -s '\n' ',' $(uniq $(sort $( awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log))))
dostanu tak akorát
sort: cannot read: 102.164.61.218: No such file or directory
log obsahuje něco jako
2022-03-22 06:37:55,991 fail2ban.actions [90770]: NOTICE [sshd] Ban 194.163.129.195
2022-03-22 06:39:20,425 fail2ban.filter [90770]: INFO [sshd] Found 176.111.173.242 - 2022-03-22 06:39:20
2022-03-22 06:42:10,058 fail2ban.filter [90770]: INFO [sshd] Found 92.255.85.135 - 2022-03-22 06:42:10
2022-03-22 06:48:10,435 fail2ban.filter [90770]: INFO [sshd] Found 61.177.172.175 - 2022-03-22 06:48:10
2022-03-22 06:49:47,895 fail2ban.filter [90770]: INFO [sshd] Found 179.43.187.173 - 2022-03-22 06:49:47
2022-03-22 06:52:11,570 fail2ban.filter [90770]: INFO [sshd] Found 112.85.42.124 - 2022-03-22 06:52:11
2022-03-22 06:52:15,043 fail2ban.filter [90770]: INFO [sshd] Found 112.85.42.124 - 2022-03-22 06:52:13
2022-03-22 06:52:17,072 fail2ban.filter [90770]: INFO [sshd] Found 112.85.42.124 - 2022-03-22 06:52:17
2022-03-22 06:52:17,131 fail2ban.actions [90770]: NOTICE [sshd] Ban 112.85.42.124
-
Jednoduchá roura jako je třeba
pwd | ls
se dá snadno převést na SOUBORY=$(ls $(pwd))
To není ani zdaleka totéž a je vlastně otázka, co si představujete, že by měl ten první příkaz vlastně dělat, protože ls nezpracovává svůj standardní vstup, takže i např. "echo ahoj | ls" prostě jen vypíše obsah aktuálního adresáře. Oproti tomu ten druhý příklad příkazu ls předá výstup pwd jako parametr(y).
Pokud chcete nahradit rouru, pak můžete použít process substitution a např.
cmd1 | cmd2
přepsat na
cmd2 < <(cmd1)
Používá se to např. pro konstrukce typu
while ...; do
done < <(some_cmd)
pokud potřebujete, aby tělo toho cyklu neběželo s vlastním environmentem, ale sdílelo ho se zbytkem skriptu.
V každém případě by ale bylo dobré začít tím, že si ujasníte, proč byste to vlastně chtěl takhle přepisovat. Ve vašem případě mi to moc jasné není, protože do command substitution můžete klidně dát i rouru:
failbanlog=$(awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq | tr -s '\n' ',')
-
Aha, zdá se že jsem došel k mylnému závěru při čtení toho článku.
Děkuji za odpověď.