Я хочу передать переменную среды через SSH.
"Правильный" способ - использовать SendEnv/~/.ssh/environment
, но для этого требуется, чтобы сервер поддерживал AcceptEnv или PermitUserEnvironment, чего в моем случае нет.
Поэтому вместо этого я думаю установить переменную на удаленном сайте следующим образом:
FOO=val
export FOO
ssh server export FOO=$FOO'; do_stuff_which_uses_FOO'
Эта часть проста. Я хочу универсальное решение, поэтому независимо от содержания $ FOO оно будет работать. Например
FOO=" '\""
export FOO
QFOO=`quote "$FOO"` # quote will return "\ \ \'\\\""
export QFOO
ssh server export FOO=$QFOO'; do_stuff_which_uses_FOO'
Это работает независимо от того, является ли отправляющая или получающая оболочка sh или bash.
Тем не менее, мне также нужно, чтобы он работал для csh/tcsh. И я не буду знать заранее, на какой оболочке работает принимающая сторона. Это означает, что мне нужно написать код, который будет работать как в /bin /sh, так и в /bin /csh.
До сих пор мне удалось заставить его работать на sh/bash:
ssh server // followed by the below quoted
eval `echo $SHELL | grep -E "/(t)?csh" > /dev/null && echo setenv FOO \\\ \\\ \\\\\'\\\\\" || echo export FOO=\\\ \\\ \\\\\'\\\\\";` ; echo "$FOO"
Я также могу заставить его работать для csh/tcsh (у пользователя csh
есть csh в качестве оболочки входа в систему):
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"
Если $ FOO это * или? он отлично работает с BASH:
ssh server eval\ \`echo\ \$SHELL\ \|\ grep\ -E\ \"/\(t\)\?csh\"\ \>\ /dev/null\ \&\&\ echo\ setenv\ FOO\ \\\\\\\\\\\*\\\;\ \|\|\ echo\ export\ FOO=\\\\\\\\\\\*\\\;\`\;echo\ \"\$FOO\"\ a;
Но это не с 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.
Кажется * а? отказаться от цитирования.
Чтобы ответить на этот вопрос, ваше решение должно:
- иметь возможность передавать переменную среды на удаленный сервер
- не использовать SendEnv/AcceptEnv/PermitUserEnvironment
- работать независимо от того, является ли исходная оболочка sh/bash/csh/tcsh
- работать независимо от того, является ли оболочка назначения sh/bash/csh/tcsh
- работать независимо от содержания переменной среды. В частности, это должно по крайней мере работать для: \n * пробел '"? <>! $ \ и любая их комбинация.
Если вы можете найти лучший способ передачи переменной, чем заключить ее в кавычки, то это тоже хорошо.