36

Как передать значение в команду ssh, чтобы среда, запускаемая на хост-компьютере, запускалась с определенной переменной среды, установленной по моему выбору?

РЕДАКТИРОВАТЬ: цель состоит в том, чтобы передать текущий рабочий стол kde (из dcop kwin KWinInterface currentDesktop) в новую созданную оболочку, чтобы я мог передать обратно места nfs в мой экземпляр JEdit на исходном сервере, который является уникальным для каждого рабочего стола KDE. (Используя такой механизм, как emacsserver/emacsclient)

Причина, по которой несколько экземпляров ssh могут быть запущены одновременно, заключается в том, что когда я настраиваю свою среду, я открываю кучу разных экземпляров ssh для разных машин.

5 ответов5

46

Опция SendEnv - ваш парень.

~/.ssh/config: (локально)

SendEnv MYVAR

/etc/ssh/sshd_config: (на удаленном конце)

AcceptEnv MYVAR

Теперь, каким бы ни было значение $MYVAR локально, оно становится доступным и в удаленном сеансе.
Если вы входите в систему несколько раз, у каждого сеанса будет своя копия $MYVAR , возможно с разными значениями.

~/.ssh/environment предназначен для других целей. Он действует как файл $ENV при удаленном выполнении команд без оболочки .

27

Вы можете передавать значения с помощью команды, аналогичной следующей:

ssh username@machine VAR=value cmd cmdargs

Вы можете проверить с:

ssh machine VAR=hello env

На tcsh похоже следующее работает:

ssh machine "setenv VAR <value>; printenv"
24

Там также ужасный, ужасный взлом.

Если ваш сценарий потребляет переменную на удаленном конце (то есть вы можете назвать ее как угодно), вы можете использовать переменные локали. Любая переменная в форме LC_ * будет передана дословно, без каких-либо требований к конфигурации.

Например, у нас есть несколько бастионных серверов на одном из моих клиентов. Я ненавижу подключаться к нему, просто подключаться к другому серверу ... и другому серверу ... каждый раз. У меня есть скрипт, который ведет себя так же, как SSH, за исключением того, что он умный.

По сути, если установлен LC_BOUNCE_HOSTS, он разбивает его на пробелы и снимает первый хост. Затем он прыгает и запускает тот же скрипт. На конечном узле этот список в конечном итоге пуст, поэтому он запускает команду. У меня также есть режим отладки (который отлично подходит во время сетевых проблем), который устанавливается LC_BOUNCE_DEBUG. Поскольку ssh магически передает все это, мне не нужно ничего делать, кроме как распознать конец списка хостов (что я делаю с опцией -).

Я чувствую себя грязным каждый раз, когда использую это, но оно работает везде, где я пробовал.

15

Файл ~/.ssh/environment может использоваться для установки переменных, которые вы хотите использовать для удаленных команд. Вам нужно будет включить PermitUserEnvironment в конфигурации sshd.

Переменные, установленные таким образом, экспортируются в дочерние процессы, поэтому вы можете:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

и myscript будет знать, что Фу - это Бар, а Джо - 37.

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

На Bash я проверил с:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .