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.