2016-05-16 9 views
1

Ich versuche, $ 1, $ 2 Variablen zu verwenden, die ich über die Befehlszeile zu einem Bash-Shell-Skript übergeben habe. Diese Variablen verwende ich innerhalb eines SSH-Aufrufs. Aber es scheint, dass die Variablen innerhalb von SSH nicht ersetzt werden, die äußeren werden ersetzt. Irgendeine Problemumgehung? Hier ist der CodeKommandozeilenparameter in der Bash-Shell-Skript in verschachtelten ssh

#!/bin/bash 

ssh -t "StrictHostKeyChecking=no" -i $1 [email protected]<<'EOF1' 

ssh -t -i $1 [email protected] <<'EOF2' 

exit 
EOF2 

exit 
EOF1 

Hier wird die erste $ 1 ersetzt, aber die zweite nicht. Sein im Allgemeinen Schlüsselname für Passwort-Authentifizierung weniger

+0

Wenn Sie eine bessere Antwort wollen als das, was ich bereits zur Verfügung gestellt haben, müssen Sie eine bessere Frage stellen. Code anzeigen, um das Problem möglicherweise zu reproduzieren? –

+1

Werfen Sie einen Blick auf [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). – Cyrus

+0

Haben Code hinzugefügt. –

Antwort

3

Verwenden printf %q eine eval -safe String-Version Ihrer Argumentliste zu generieren:

# generate a string which evals to list of command-line parameters 
printf -v cmd_str '%q ' "[email protected]" 

# pass that list of parameters on the remote shell's command line 
ssh "$host" "bash -s $cmd_str" <<'EOF' 
    echo "This is running on the remote host." 
    echo "Got arguments:" 
    printf '- %q\n' "[email protected]" 
EOF 

Für das, was Sie wirklich tun, die beste Praxis ist es wahrscheinlich, einen ProxyCommand zu verwenden - siehe the relevant documentation - und Ihren privaten Schlüssel über Agent-Weiterleitung verfügbar zu machen, anstatt ihn auf Ihrem Bounce-Host auf der Festplatte zu haben. Das heißt, es ist genug, um einfach die zuvor gegebene Antwort zu übernehmen Sie den Code in der Frage zu passen:

#!/bin/bash 
printf -v args '%q ' "[email protected]" 
echo "Arguments on original host are:" 
printf '- %q\n' "[email protected]" 
ssh -t "StrictHostKeyChecking=no" -i "$1" [email protected] "bash -s $args" <<'EOF1' 
    printf -v args '%q ' "[email protected]" 
    echo "Arguments on ip1 are:" 
    printf '- %q\n' "[email protected]" 
    ssh -t -i "$1" [email protected] "bash -s $args" <<'EOF2' 
    echo "Arguments on ip2 are:" 
    printf '- %q\n' "[email protected]" 
EOF2 
EOF1 
+0

Haben Code für bestimmtes Problem hinzugefügt. Danke –

+0

@ user3780835, ... entsprechend erweitert. –

+0

Danke Charles für deine Zeit. Ich würde auch in ProxyCommand schauen. –

1

Viel einfacher ist ssh behandeln das Tunneling für Sie zu lassen.

ssh -o ProxyCommand="ssh [email protected] nc -w 10 %h %p" [email protected] 

(Dieses Beispiel bei http://undeadly.org/cgi?action=article&sid=20070925181947 gefunden).

+0

Definitiv wahr - deshalb habe ich es in meiner Antwort [mit einem Link zum OpenSSH Cookbook-Abschnitt zu diesem Thema] erwähnt, nachdem das OP seine Frage erweitert hatte, um klarzustellen, was sie taten. Etwas expliziter zu sein - wie Sie es hier tun - tut nicht weh. –

+0

Hallo charles/chepner ist es möglich, dass der Schlüssel für IP2 auf meinem Haupt-Server und nicht auf IP1? (Die Anmeldung an IP2 über IP1 ist nur möglich, wenn auch) –

+0

sollte es sein, wenn Sie einen 'ssh-agent' auf dem lokalen Computer ausgeführt werden und ermöglichen Agenten mit der' -a' Option Weiterleitung ('ssh -A -o Proxycommand. ..'). – chepner

Verwandte Themen