Portál AbcLinuxu, 12. května 2025 15:19
while read ip; do if $(echo $ip|grep -q '#') then echo "Lokalita $ip" else # echo totofunguje ssh $ip ls fi done < /serverlist.txt #### serverlist.txt ### #praha 1.2.3.4 #brno 2.3.4.5 #ostrava 1.4.7.8
#!/bin/bash while read ip do if $(echo $ip|grep -q '#'); then echo "Lokalita $ip"; else ip=${ip#*:} ssh $ip ls fi done < ~/serverlist.tx
haaja@book ~ $ cat serverlist.txt #praha:127.0.0.1 brno:127.0.0.1
#praha 1.2.3.4 #brno 1.2.3.5 #ostrava 1.2.3.6Nemuze to byt nejakym nastavenim ssh ,pouzima fedoru 5 h7
Problém je v tom, že potomek, v tomto případě ssh
, zdědí veškeré deskriptory otevřených souborů od svého rodiče, v tomto případě shellu provádějícího skript. Protože máte přesměrovaný standardní vstup při provádějí skriptu while
, bude i ssh
spušten s takto přesměrovaným vstupem a podle všeho vám ho "vyluxuje". Vyřešit to můžete např. takto:
#!/bin/bash exec 3<serverlist.txt while read ip <&3; do if [ "${ip#*#}" != "${ip}" ] then echo "Lokalita $ip" else ssh "$ip" ls fi done
exec
vám otevře ten soubor coby handle 3 a read
necháte číst z tohoto otevřeného souboru (ampersand mu říká, že trojka je číslo deskriptoru a ne jméno souboru). Tím nedojde k přesměrování standardního vstupu a ssh
pracuje s vaším terminálem, což potřebujete.
Omlouvám se.Jj, chtělo by to fixnout bug #534
To "nebyla vyřešena" jsem dal já, omylem jsem kliknul na "byla" vyřešena a aby to nemátlo, tak jsem to chtěl vrátit a jediné co mě napadlo, bylo použít tlačítko "nebyla". Aby se k tomu příspěvku někdo vrátil.
while read ip; do if $(echo $ip|grep -q '#') then echo "Lokalita $ip" else # echo totofunguje ssh -n $ip ls fi done < /serverlist.txt
exec 3<serverlist.txt while read ip ; do if [ "${ip#*#}" != "${ip}" ] then echo "Lokalita $ip" else ssh "$ip" ls fi <&3 done
ssh
zdědí deskriptor, kterým čtete obsah souboru serverlist.txt
, jako svůj standardní vstup.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.