Эта проблема возникает из-за того, что я пытаюсь сделать 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 при входе в систему.
Обратите внимание, что это повлияет на вашу способность входить в систему через 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.