linux - hoe begin je te luisteren naar stdin en de lijnen om te leiden?

Ik heb een eenvoudig script geschreven dat door een gegeven lijst met hosts loopt en een gegeven commando op deze hosts uitvoerde. het script ziet er basiclly uit als:

while read host; do
    ssh -f [email protected]$host [email protected]
echo < servers

Ik wil het script kunnen uitvoeren zodat het "luistert" naar regels van stdin en ze in de lus uitvoert in plaats van $ @. Het script stopt met werken door een normale beëindiging - ctrl + c ..

Enig idee?

0
Moet dit in bash zijn?
toegevoegd de auteur robert, de bron
Dat do ontbreekt een gedaan
toegevoegd de auteur Chen Levy, de bron

2 antwoord

Als ik de vraag goed lees, wil je een aantal opdrachten naar een aantal servers sturen, die allemaal afzonderlijk worden doorgegeven.

Hiervoor moet je de binnenste lus in een buitenste leeslus wikkelen; iets dat lijkt op:

while read command; do
    while read host; do
        ssh -f [email protected]$host "$command"
        echo 
    done < servers
done

Tijdens het uitvoeren kunt u een opdracht typen en deze wordt op alle servers uitgevoerd. Het oplossen van problemen met shell escape-tekens die naar het externe systeem worden verzonden, is een oefening voor de ontwikkelaar.

2
toegevoegd

Je script doet dat al! Gewoon begrijpen hoe het werkt - sla het op in some.bash bestand:

user="myuser"
while read host; do
    ssh -f [email protected]$host [email protected]
done

$ @ betekent het toevoegen van de resterende parameters van de commandoregel, als u er geen gebruikt, voegt deze er geen toe

read host will read the line - not just word.

Dus eigenlijk, als je het uitvoert:

www.somehost.com
--> ssh -f [email protected]
www.somehost.com other parameters
--> ssh -f [email protected] other parameters
0
toegevoegd
Dit neemt de argumenten voor ssh van de opdrachtregel van het script, geen standaardinvoer.
toegevoegd de auteur chepner, de bron
De OP wil de opdrachten van stdin , niet de hosts.
toegevoegd de auteur Dennis Williamson, de bron