Назад | Перейти на главную страницу

SSH - установка переменных env для каждого соединения - общий хост godaddy

Моя проблема в том, что мне нужно установить переменные env (например, GIT_EXEC_PATH) на сервере. Мне нужны эти переменные для каждого соединения (так что и с помощью bash, и с помощью удаленных команд). Мне удалось установить эти переменные с помощью bash с помощью .bash_profile, но у меня проблемы с удаленными командами. Я обнаружил, что можно писать команды в ~ / .ssh / authorized_keys перед фактическим ключом rsa, но я не хочу писать туда всегда, мне нужно постоянное решение ... Я обнаружил, что ~ / .ssh / rc файл выполняется при каждом входе в систему ssh, поэтому я поместил туда свои объявления переменных env, но это не сработало. Переменные заданы в rc файле, но после этого исчезли. : S Может быть, файл rc работает в подоболочке: S Есть ли способ определить эти переменные в bash и удаленных командах без дублирования кода?

Редактировать:

Я отредактировал вопрос, потому что сервер является разделяемым хостом godaddy, поэтому он имеет уникальную конфигурацию. Файлы / etc / ssh / sshd_config и / etc / ssh / ssh_config пусты. В этих файлах есть комментарии, если вам интересно, я могу скопировать их сюда.

  1. Источник ~ / .bash_profile (только соединениями bash),
  2. ~ / .bashrc никогда не используется,
  3. ~ / .profile никогда не используется,
  4. среда ~ / .ssh / никогда не используется,
  5. источник ~ / .ssh / rc (как bash, так и удаленный), но я думаю, что он вызывается в подоболочке, потому что переменные исчезают.
  6. ~ / .Ssh / authorized_keys получает каждый раз, но я должен писать команды перед каждым ключом rsa (поэтому я не хочу настраивать его).

Резюме:

Я могу хорошо настроить bash (с помощью .bash_profile), но я не могу настроить удаленные вызовы. Это проблема. Я ищу файл, полученный как с помощью команд bash, так и с помощью удаленных команд.

Например:

Команда git-upload-pack находит exe-файл, потому что переменная env GIT_EXEC_PATH установлена, но с удаленным: "git clone user@domain.com: myrepo local / myrepo" сервер не находит эту команду, потому что GIT_EXEC_PATH не установлен.

Edit2:

В соответствии с этот, и мои журналы printenv: ~ / .ssh / rc работает в обычной оболочке, а не в подоболочке, поэтому это загадка, почему переменные env не прилипают ...

Я создал исполняемый файл: ~ / logenv:

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

И поместите это в ~ / .ssh / rc:

export AAA=teszt
source ~/logenv

Через bash войти и "исходный логенв" результат был:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

Удаленно "ssh myuser@domain.com 'exec ~ / logenv'" результат был:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

Итак, файл rc получен, но после этого переменные разочаровывают ...: S

Предполагая, что у вас есть UsePAM yes в /etc/ssh/sshd_config, и если вы хотите, чтобы эти переменные среды были установлены для каждого пользователя, вы можете настроить переменные среды pam для вас. Если у вас есть переменные среды, определенные в /etc/gitenv вы можете добавить эту строку в /etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

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

Я устанавливаю переменную среды для своих SSH-соединений, используя ~/.ssh/environment. Файл может содержать переменную в виде VAR=value, нет необходимости явно экспортировать их.

Однако этот файл конфигурации пользователя по умолчанию игнорируется процессом сервера SSH, если для параметра PermitUserEnvironment установлено значение yes. Поэтому вам нужно обязательно отредактировать / etc / sshd_config на SSH-сервере, чтобы добавить или обновить этот параметр:

PermitUserEnvironment yes

Вам необходимо перезагрузить конфигурацию SSH-сервера. В RHEL или Suse Linux вы делаете (как root)

/sbin/service sshd reload

(Возможно, замените sshd на ssh, если он не работает)

В Ubuntu (используя выскочку) вы делаете

sudo reload ssh

В любом другом Linux вы можете попробовать (как root)

/etc/init.d/sshd reload

(Замените sshd на ssh или openssh или что-то еще, что соответствует сценарию инициализации сервера SSH)

У меня больше нет общего хоста godaddy, поэтому я не могу проверить, действительны ли предложенные решения. Это останется принятым ответом, поскольку он сработал, когда я задал вопрос. Другие ответы также могут сработать. Я позволил сообществу решить это, проголосовав за.

Хорошо. Решение в том, что на общем хосте godaddy нет решения. Я все перепробовал, но ничего не работает, поэтому решил, что останусь с ~ / .ssh / authorized_keys:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

В ~ / connect.sh:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

И в ~ / .env_profile:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

Поэтому мне нужно скопировать command = "..." на каждый ключ rsa в authorized_keys. Это дублирование кода, но я не думаю, что есть другое решение для общих хостов godaddy.

Если вы используете bash в качестве оболочки попробуйте добавить настройки среды в .bashrc.

Сначала проверьте, запускается ли это при входе в систему, это может быть не так, поскольку в стандартных файлах часто есть что-то вроде:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

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

.profile является более общим местом для размещения подобной конфигурации и соблюдается большинством оболочек (в настройке Debian по умолчанию это ~/.profile это зовет ~/.bashrc в первую очередь). Возможно, вам потребуется более внимательное редактирование .profile в случае, если он когда-либо интерпретируется другими оболочками - т.е. старайтесь избегать использования bash специальные расширения.

редактировать

Если у тебя есть .bash_profile отредактируйте это вместо .profile: bash будет использовать его в пользу более общего файла, и вы можете безопасно использовать там специфические для bash вещи.

Вы можете использовать команду для всех пользователей / ключа без добавления части команды в authorized_keys, добавив эту строку в файл sshd_config:

ForceCommand ~/connect.sh

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

Предлагаю вам другой подход.

Вы настраиваете файл с объявлением вашей переменной среды, а затем получаете его каждый раз, когда вызываете удаленную команду.

Пример: вы помещаете необходимые переменные в ~ / .my_var.rc, а затем для каждой удаленной команды, которую вы выполняете ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Если вам это подходит, вы можете уточнить эту концепцию и написать сценарий для удобства. Если вам это нужно только для команд git, я бы создал скрипты git.sh, которые будут делать это:

#!/bin/bash

source ~/.my_var.rc

git $@

Предполагая, что этот сценарий находится в вашем домашнем каталоге, вы бы назвали его: ssh user@remote git.sh pull origin master

Примечание: это простая отправная точка. Например, он не поддерживает параметры с пробелами.

Это не отвечает на общий вопрос о PATHS, но позволяет использовать репозиторий git на удаленном сервере, на пути которого нет git и к которому у вас нет доступа root. Это решение исходит от эта страница.

git clone -u relative/path/to/bin/git-upload-pack username@host.com:relative/path/to/remote_repository.git

Чтобы также нажать и получить:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack

/ etc / profile будет получаться при каждом соединении с ssh-client.