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


16

Моя проблема в том, что я должен установить переменные 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, так и remote), но я думаю, что он вызывается в подоболочке, потому что переменные исчезают.
  6. Файл ~ / .ssh / авторизованный_кейсис поступает каждый раз, но мне приходится писать команды перед каждым ключом rsa (поэтому я не хочу настраивать это).

Резюме:

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

Например:

Команда 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 login & "source logenv" результат был:

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


Некоторые опции в этой теме - stackoverflow.com/questions/216202/…
EightBitTony

«В отличие от / etc / sshrc, который всегда обрабатывается оболочкой Bourne (/ bin / sh), ваш rc-файл обрабатывается обычной оболочкой входа вашей учетной записи». - это странно, потому что кажется, что он не был бы получен из обычной оболочки: S
inf3rno

Ответы:


12

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

auth required pam_env.so envfile=/etc/gitenv

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


У меня есть общая учетная запись хоста godaddy, поэтому я могу изменять только каталог ~. (У него есть операционная система centos.)
inf3rno

@ inf3rno - хороший ответ не повредит :), так как в любом случае решение, которое решит вашу проблему, можно обозначить другим способом.
Гюйгенс

ОК. Я буду, но я не единственный, кто может голосовать ... :-)
inf3rno

В Ubuntu, по-видимому, /etc/environmentон поставляется pam_env.soпо умолчанию
rcoup

4

Я устанавливаю некоторую переменную окружения для моих соединений 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 (используя upstart) вы делаете

sudo reload ssh

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

/etc/init.d/sshd reload

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


Спасибо, но я не могу написать в / etc dir, среда ~ / .ssh / не получена.
inf3rno

2

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

Ok. Решение состоит в том, что нет никакого решения на общем хосте 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

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


1

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

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

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

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

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

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

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


Прочтите раздел «Редактирование». (.profile не работает)
inf3rno

1

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

ForceCommand ~/connect.sh

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


0

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

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

Пример: вы помещаете необходимые переменные в ~ / .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

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


Я могу сделать это ofc, но этот конфиг не для меня одного, и он должен работать с git gui, где команды генерируются автоматически ...
inf3rno

Вы подключаетесь к удаленному ssh, используя того же пользователя? Если да, то файл ~ / .my_var.rc будет специфичным для пользователя и общим для всех git.sh. Если нет, то вы можете добавить в git.sh дополнительный параметр, который поможет вам определить, какой файл .rc следует использовать в качестве источника (или если он использует фиксированный IP-адрес, вы можете использовать информацию env SSH_CLIENT для дифференциации ваших пользователей). Команда должна работать с git gui, звонитеssh -Y user@remote git.sh gui
Huygens

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

Что ж, если настройки одинаковы для всех пользователей, тогда ответ завершен, и вы можете не обращать внимания на мой предыдущий комментарий. Вам, вероятно, потребуется поместить файлы .rc и .sh в каталог, общий для всех пользователей.
Гюйгенс

@ inf3rno, если вы хотите получить больше ответов, вы должны поблагодарить тех, кто предложил хорошие ответы, даже если они не применимы к вашему делу, поскольку в первоначальном вопросе отсутствовала информация. Или люди не будут пытаться.
Гюйгенс

0

Это не отвечает на общий вопрос о 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

0

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


Только для логинов.
RalfFriedl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.