Ich möchte eine Umgebungsvariable über SSH übertragen.
Der "richtige" Weg ist die Verwendung von SendEnv / ~/.ssh/environment
, aber dafür muss der Server AcceptEnv oder PermitUserEnvironment unterstützen, was in meinem Fall nicht der Fall ist.
Daher überlege ich mir stattdessen, die Variable auf der Remote-Site wie folgt festzulegen:
FOO=val
export FOO
ssh server export FOO=$FOO'; do_stuff_which_uses_FOO'
Dieser Teil ist einfach. Ich möchte eine generische Lösung, unabhängig vom Inhalt von $ FOO. Z.B
FOO=" '\""
export FOO
QFOO=`quote "$FOO"` # quote will return "\ \ \'\\\""
export QFOO
ssh server export FOO=$QFOO'; do_stuff_which_uses_FOO'
Dies funktioniert unabhängig davon, ob es sich bei der sendenden oder empfangenden Shell um sh oder bash handelt.
Ich brauche es jedoch auch, um mit csh / tcsh zu arbeiten. Und ich werde nicht im Voraus wissen, welche Shell das empfangende Ende ausführt. Das bedeutet, dass ich etwas codieren muss, das sowohl in / bin / sh als auch in / bin / csh funktioniert.
Bisher habe ich es geschafft, es für sh / bash zum Laufen zu bringen:
ssh server // followed by the below quoted
eval `echo $SHELL | grep -E "/(t)?csh" > /dev/null && echo setenv FOO \\\ \\\ \\\\\'\\\\\" || echo export FOO=\\\ \\\ \\\\\'\\\\\";` ; echo "$FOO"
Ich kann es auch für csh / tcsh zum Laufen bringen (der Benutzer csh
hat csh als Login-Shell):
ssh csh@server // followed by the below quoted
eval `echo $SHELL | grep -E "/(t)?csh" > /dev/null && echo setenv FOO \\\ \\\ \\\\\'\\\\\" || echo export FOO=\\\ \\\ \\\\\'\\\\\";` ; echo "$FOO"
Wenn $ FOO * ist oder? es funktioniert gut mit BASH:
ssh server eval\ \`echo\ \$SHELL\ \|\ grep\ -E\ \"/\(t\)\?csh\"\ \>\ /dev/null\ \&\&\ echo\ setenv\ FOO\ \\\\\\\\\\\*\\\;\ \|\|\ echo\ export\ FOO=\\\\\\\\\\\*\\\;\`\;echo\ \"\$FOO\"\ a;
Aber es schlägt fehl mit csh:
ssh csh@server eval\ \`echo\ \$SHELL\ \|\ grep\ -E\ \"/\(t\)\?csh\"\ \>\ /dev/null\ \&\&\ echo\ setenv\ FOO\ \\\\\\\\\\\*\\\;\ \|\|\ echo\ export\ FOO=\\\\\\\\\\\*\\\;\`\;echo\ \"\$FOO\"\ a;
No match.
FOO: Undefined variable.
Es scheint * und? sich weigern, mit zitiert zu werden.
Um diese Frage zu beantworten, sollte Ihre Lösung:
- in der Lage sein, eine Umgebungsvariable auf den Remote-Server zu übertragen
- Verwenden Sie nicht SendEnv / AcceptEnv / PermitUserEnvironment
- Funktioniert unabhängig davon, ob es sich bei der Quell-Shell um sh / bash / csh / tcsh handelt
- Funktioniert unabhängig davon, ob es sich bei der Zielshell um sh / bash / csh / tcsh handelt
- arbeiten unabhängig vom Inhalt der Umgebungsvariablen. Insbesondere sollte es zumindest funktionieren für: \ n * Leerzeichen '"? <>! $ \ Und jede Kombination davon.
Wenn Sie einen besseren Weg finden, die Variable zu übertragen, als sie in Anführungszeichen zu setzen, ist das auch in Ordnung.
Antworten:
Ich habe jetzt ein funktionierendes Modell für alle Charaktere außer \ n:
quelle
Können Sie die Variable einfach base64-codieren? Der einfachste Weg, damit umzugehen, besteht wahrscheinlich darin, die Daten einfach als binär zu behandeln.
Möglicherweise müssen Sie mit dem Zitat in der
ssh
Zeile herumspielen, aber das ist der Kern der Sache. Dies sollte Shell-Spezifika in Bezug auf das Zitieren entfernen, könnte aber einige mit Unterbefehlen einführen (ich bin mit nichts außerhalb von nicht viel vertrautbash
).quelle
echo setenv U
perl -e '($a="212223c2a425262f28293d410a417b5b5d7d5e7e2a41") =~ s/(..)/chr hex $1/eg;print $a'
openssl
verfügbar? hints.macworld.com/article.php?story=20030721010526390