Моя проблема в том, что мне нужно установить переменные 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 пусты. В этих файлах есть комментарии, если вам интересно, я могу скопировать их сюда.
Резюме:
Я могу хорошо настроить 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.