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

(svn + ssh) получение bash для загрузки моего PATH через SSH

Эта проблема возникает из-за того, что я пытаюсь сделать svnserve (Сервер Subversion) доступен на сервере через SSH. Я скомпилировал SVN и установил его в $HOME/bin. Локальный доступ к нему (не через SSH) работает нормально.

Подключения к svn+ssh сбой из-за:

bash: svnserve: command not found

Отлаживая это, я обнаружил, что:

ssh user@server "which svnserve"

говорит:

which: no svnserve in (/usr/bin:/bin)

Это странно, потому что я обновил путь к $HOME/bin в моем .bashrc, а также добавил его в ~/.ssh/environment. Однако похоже, что SSH его не читает. Хотя когда бегу:

ssh user@server "echo $PATH"

Это делает распечатайте мой обновленный путь!

Что тут происходит? Как я могу заставить SSH находить мой svnserve? заранее спасибо

Вы можете попробовать запустить команду через bash, используя команду -l, чтобы она действовала как оболочка входа.

ssh user@server "bash -l -c 'which svnserve'"

Как отмечалось в комментариях, которые я оставил выше, вам нужно избегать всех $, чтобы переменные расширялись на сервере, а не локально. Например.:

ssh user@server "bash -l -c 'echo \$PATH'"

Обновить:

Что касается вашего вопроса о том, почему .ssh / environment не вступает в силу, я считаю, что конфигурация по умолчанию для SSHd будет игнорировать пользовательские среды. Вам нужно специально включить его в / etc / ssh / sshd_config (или аналогичном) и добавить:

PermitUserEnvironment yes

обновление 2:

Если у вас нет доступа к / etc / ssh / sshd_config, возможным (но не идеальным) решением было бы использование аутентификации с открытым ключом для запуска svnserve при входе в систему.

Видеть http://svnbook.red-bean.com/en/1.4/svn.serverconfig.svnserve.html#svn.serverconfig.svnserve.sshtricks

Обратите внимание, что это повлияет на вашу способность входить в систему через SSH. Для этого вам необходимо обойти аутентификацию с открытым ключом:

svn -o PubkeyAuthentication=no user@server

Как это происходит, .bashrc и .bash_profile выполняются только в интерактивной оболочке. Когда вы входите в систему через ssh, вы не находитесь в интерактивной оболочке, поэтому ваш пользовательский PATH определения никогда не выполняются. Вы можете связать сценарий с неинтерактивными полками, используя BASH_ENV. Проверьте также .ssh/environment что дает вам другую альтернативу. Лучший способ узнать об этом - сделать man ssh.

Удачи!

Вы можете выполнить команду env:

ssh servername "env PATH=$REMOTEPATH which svnserve"

У меня такая же проблема с HostMonster из-за недавнего изменения, которое они внесли. Я нашел обходной путь в старой цепочке писем по адресу http://svn.haxx.se/dev/archive-2007-02/0204.shtml:

На вашей рабочей станции:

  • редактировать ~/.subversion/config: найдите [туннели] и добавьте строку ssh = ~ / svnssh
  • создайте ~ / svnssh, как в ссылке:

    #!/bin/sh
    /usr/bin/ssh $1 /<ur_bluhost_home_path>/sshsvnserve -t

  • chmod +x ~/svnssh

В вашем аккаунте bleuhost:

  • Создайте ~/sshsvnserve, то же содержание, что и ссылка:

    #!/bin/sh
    /<ur_bluehost_home_path>/bin/svnserve $*

  • chmod +x ~/sshsvnserve

Вот и все. Изменение config [tunnels] изменяет команду, выполняемую svn при обработке пространства имен svn + ssh, и вместо этого использует скрипт ur ~ / svnssh. Сценарий вызывает ssh и передает полный путь к sshsvnserve в учетной записи ur bluehost. И sshsvnserve перенаправляет все на полный путь к svnserve при его установке. Работал для меня, $ PATH не требуется.

Установите переменную BASH_ENV к '~/.bashrc'.

ssh servername "BASH_ENV='~/.bashrc' which svnserve"

Из man bash:

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login, она сначала считывает и выполняет команды из файла / etc / profile, если этот файл существует. После чтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первого существующего и доступного для чтения файла.

и

Когда запускается интерактивная оболочка, которая не является оболочкой входа, bash читает и выполняет команды из /etc/bash.bashrc и ~ / .bashrc, если эти файлы существуют.

и

Когда bash запускается в неинтерактивном режиме, например, для запуска сценария оболочки, он ищет переменную BASH_ENV в среде, расширяет ее значение, если оно появляется там, и использует расширенное значение как имя файла для чтения и выполнения. .

Из man ssh:

Кроме того, ssh читает ~ / .ssh / environment и добавляет в среду строки формата «VARNAME = value», если файл существует и пользователям разрешено изменять свою среду. Для получения дополнительной информации см. Параметр PermitUserEnvironment в sshd_config (5).

Из man sshd_config:

PermitUserEnvironment
Указывает, будут ли параметры ~ / .ssh / environment и environment = в ~ / .ssh / authorized_keys обрабатываться sshd (8). По умолчанию - «нет». Включение обработки среды может позволить пользователям обходить ограничения доступа в некоторых конфигурациях с помощью таких механизмов, как LD_PRELOAD.

Мне удалось заставить ssh запускать команды, используя удаленный путь, запустив:

ssh dist@d6 "bash --login -c 'env'"

Это загружает удаленный .profile и т. Д. Здесь env можно заменить любой командой, которая вам нужна.

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