2016-03-23 6 views
0

Dies ist, was ich zu tun versucht:Wie kann ich SSH in einen zweiten Server, einen Befehl ausführen und die Ausgabe einer Variablen zuweisen?

fromServer=$(ssh -A first.com ssh second.com rpm -qa | grep exampleString) 
echo $fromServer 

Echo druckt nicht alles. Wenn ich manuell in dem ersten shh und dann in der zweiten ssh dann den Befehl ausführen I Ausgabe:

ssh first.com 
ssh second.com 
rpm -qa | grep exampleString 

Wie kann ich diese drei Schritte in eine Zeile kombinieren und die Ausgabe in eine Variable speichern?

+0

beachten Sie, dass Ihre | grep wahrscheinlich auf Ihrem Ursprungsserver ausgeführt wird, nicht die, die in die Sie sshing. –

+0

Sie müssen Anführungszeichen oder eine andere Technik verwenden, um Ihre Befehle zu gruppieren und den Hostnamen vom Befehl vom Parameter zu unterscheiden. Was ist der Befehl, der an den ersten ssh übergeben wurde? Was ist der Befehl an den zweiten weitergegeben? Wie finden die jeweiligen Muscheln das heraus? – mpez0

+0

'ssh second.com rpm -qa | grep exampleString 'oder' ssh second.com rpm -qa | grep exampleString 'schien das Verhalten nicht zu ändern. Wie sonst kann ich die Befehle gruppieren? – Nelson

Antwort

1

Verwenden Sie eine korrekte Angabe oder Flucht:

fromServer=$(ssh -A first.com 'ssh second.com rpm -qa | grep exampleString') 
echo $fromServer 

oder

fromServer=$(ssh -A first.com ssh second.com rpm -qa \| grep exampleString) 
echo $fromServer 

% VAR=$(ssh -C [email protected] ls -la \| grep vim) 
% echo $VAR 
-rw------- 1 user user  15153 Mar 22 13:45 .vimrc 

edit: oooooooh, hinterhältig, ich habe nicht gesehen, Sie taten zwei SSH ☺

Dann brauchst du ein bisschen mehr Zitate, weil du dich nicht haben willst Das Rohr wird von first.com interpretiert. Hier sind drei Möglichkeiten, um daran zu arbeiten:

fromServer=$(ssh -A first.com ssh second.com rpm -qa \\\| grep exampleString) 
fromServer=$(ssh -A first.com 'ssh second.com rpm -qa \| grep exampleString') 
fromServer=$("ssh -A first.com 'ssh second.com rpm -qa | grep exampleString'") 

Was passiert ist, dass Sie ausführen möchten:

[email protected] % rpm -qa | grep exampleString 

auf dem second.com Server, so dass Sie das Rohr zu entkommen, so dass es durch die first.com nicht interpretiert ist Server:

[email protected] % ssh second.com rpm -qa \| grep exampleString 
or 
[email protected] % ssh second.com 'rpm -qa | grep exampleString' 

aber dann wieder, müssen Sie das von Ihrer lokalen Workstation auf first.com, ausgeführt haben, wie Sie immer noch nicht wollen um zu sehen, interpretiert das Rohr, müssen Sie eine zweite Schicht zu entkommen/zitieren hinzuzufügen:

[email protected] % ssh first.com "ssh second.com 'rpm -qa | grep exampleString'" 
or 
[email protected] % ssh first.com 'ssh second.com rpm -qa \| grep exampleString' 

und dann, sobald Sie einen Ausgang erhalten sind sicher, dass Sie, dass ganzer Befehls der Ausgabe in einer Variablen setzen können:

VAR=$(ssh first.com "ssh second.com 'rpm -qa | grep exampleString'") 

HTH

+0

Hinzufügen der '' schien kein Verhalten zu ändern. – Nelson

+0

Und der Schrägstrich schien auch nichts zu tun. – Nelson

+0

Ihr Problem ist die Pipe, die Sie zwischen Ihrer aktuellen Arbeitsstation und dem Host von 'second.com' nicht interpretieren möchten. Aus diesem Grund müssen Sie den gesamten Ausdruck doppelt angeben oder das Pipe-Zeichen zweimal mithilfe von entfernen Backslashes. – zmo

Verwandte Themen