2011-08-09 9 views
3

grettings,SSH Shell Script plusieurs commandes sortie

Je veux exécuter 2 commandes sur ssh dans un script shell et récupérer la sortie de ma machine locale

exemple

ssh user @ host « commande1 "> /local/1.txt

ssh user @ host "Command2"> /local/2.txt

Je veux cela, mais avec une seule connexion est possible

s'il vous plaît ne pas répondre à des solutions « Attendez-vous » ...

Merci beaucoup;)

Répondre

3

Si vous ne me dérange pas d'utiliser le même fichier pour stocker la sortie; puis:

ssh [email protected] "command1; command2" > /local/1-2.txt 

S'il importe, alors essayez quelque chose comme ceci:

ssh [email protected]host "command1 > /somepath/1.txt; command2 > /somepath/2.txt; ..." 
scp [email protected]:/somepath/*.txt somelocalpath/ 

Si vous voulez toujours juste une seule connexion, peut-être cela pourrait fonctionner pour vous:

ssh [email protected] "command1; echo "this_is_a_separator"; command2" > /local/1-2.txt 
sed -n '1,/this_is_a_separator/ {p}' /local/1-2.txt > /local/1.txt 
sed -n '/this_is_a_separator/,$ {p}' /local/1-2.txt > /local/2.txt 

Le Le partage de fichiers locaux peut se faire de plusieurs autres façons, ce n'était que l'un d'entre eux.

+0

cette commande sed est pas bon car il quitte le séparateur sur les deux fichiers et les sauts de ligne: P – Killercode

+0

Faites attention si la sortie de commande1 ne se termine pas par une nouvelle ligne: vous pourriez avoir le séparateur à la fin d'une ligne de données. – jfg956

1

Modifier: ne fonctionne pas si la sortie de command1 ne se termine pas par une nouvelle ligne.

Édition: ne fonctionne pas non plus si une ou les deux commandes ne produisent pas de sortie. Besoin d'un outil plus flexible -> awk. Voir une autre solution

Pour faire la même chose que:

ssh [email protected] "command1" > /local/1.txt 
ssh [email protected] "command2" > /local/2.txt 

dans une seule connexion, et sans fichier temporaire, vous pouvez faire:

ssh [email protected] "command1 | sed -e 's/^/1/' ; command2 | sed -e 's/^/2/'" | \ 
sed -n -e '/^1/{s/^.//;w /local/1.txt 
};/^2/{s/^.//;w /local/2.txt 
}' 

Vous avez besoin des nouvelles lignes après /local/1.txt et /local/2.txt, parce que si ils ne sont pas là, sed continuera à penser que vous écrivez un nom de fichier.

0

Comme la solution précédente avec sed est brisé à cause de fin de traitement de ligne, cette solution utilise awk.

Donc, pour faire la même chose que:

ssh [email protected] "command1" > /local/1.txt 
ssh [email protected] "command2" > /local/2.txt 

dans une seule connexion, et sans fichier temporaire, vous pouvez faire:

ssh [email protected] "command1 | sed -e 's/^/1/'; echo -e '\na'; command2 | sed -e 's/^/2/'; echo" | \ 
awk -v f1=/local/1.txt -v f2=/local/2.txt \ 
'BEGIN{state=0; printf "" > f1} 
/^1/ {printf "%s%s", state == 1 ? "\n" : "", substr($0, 2) > f1; state=1} 
/^$/ && state == 1 {printf "\n" > f1} 
/^a$/ {state=2; close (f1); printf "" > f2} 
/^2/ {printf "%s%s", state == 3 ? "\n" : "", substr($0, 2) > f2; state=3} 
/^$/ && state == 3 {printf "\n" > f2} 
END{close (f2)}'