4

Я объявил некоторые переменные "PATH" в файле ".bashrc" на удаленной машине. Когда я захожу на удаленный компьютер, все эти переменные "PATH" работают нормально. Но когда я делаю «ssh user @ remote env», "PATH", объявленные в «.bashrc», не читаются. Как я могу это исправить?

Это «.bash_profile» в домашнем каталоге на удаленной машине:

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin:

export PATH

Это «.bashrc» в домашнем каталоге на удаленной машине:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# PATH
export PATH=$HOME/git-1.8/bin/:$PATH

И это текущий вывод команды «ssh user @ remote env» с моей локальной машины:

SHELL=/bin/bash
SSH_CLIENT=NNNNNNNNNNNNNNN
USER=XXXXXXXXX
MAIL=/var/mail/XXXXXXXX
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/openssh/bin
PWD=/volume2/home/hp120242/XXXXXXXXX
SHLVL=1
HOME=/home/hp120242/XXXXXXXXXX
LOGNAME=XXXXXXXXXXXXX
SSH_CONNECTION=NNNNNNNNNNNNNNNNNNN
LC_CTYPE=en_US.UTF-8
_=/bin/env

У меня нет прав root на пульте.

4 ответа4

1

Смотрите этот ответ: SSH не читает файлы rc


.bash_profile не выполняется при запуске команды, потому что SSH не выполняет оболочку входа в систему, он выполняет команду. Вы можете попробовать установить переменные окружения в ~/.ssh/environment но возможно, что чтение этого файла было отключено.

Вы можете попытаться форсировать регистрационную оболочку с помощью: ssh user@host bash -lc env .

Как уже упоминали другие .bashrc следует читать при запуске команды. Вы можете убедиться , что это так, добавляя что - то вроде echo EXECUTED в верхней части .bashrc

Также возможно, что все, что находится в /etc/bashrc , вызывает exit поэтому все, что ниже, не запускается.

1

На моем блоке вставка export HI=THERE в пустой пустой ~/.bashrc показывает этот вывод, когда ssh используется для связи с блоком для перечисления env:

$ ssh $host /usr/bin/env 2>/dev/null | grep HI
HI=THERE

Мой ~/.bashrc использует подход проверки пользовательской переменной среды, а затем, если она отсутствует, выполняет эквивалент:

. ~/.profile   # load in (Bourne-shell syntax) baseline environment variables

Следовательно, мои команды ssh - даже если bash запускается так, как будто это подоболочка (только .bashrc) - все равно получают переменные окружения, которые я обычно ожидаю для неинтерактивных оболочек. Кажется, я не помню, чтобы делал это явно для SSH много лет назад.

Вы можете установить в ~/.profile некоторую переменную, скажем, ENVGOOD=true , а затем в ~/.bashrc:

[ -z "$ENVGOOD" ] && . ~/.profile  # sets ENVGOOD=true

или создайте ~/.ssh/environment . Обратите внимание, что последний будет работать только в том случае, если PermitUserEnvironment = true в /etc/ssh/sshd_config установлен, что НЕ по умолчанию (и, конечно, почему моя установка не полагается на него).

0

На CentOS/RHEL я сделал следующее

ssh user@host "source .bash_profile; env "

Не забудьте \$, чтобы вы использовали переменные удаленного окружения. Например, следующая команда выведет то же значение

echo $SSH_CLIENT; ssh user@host "source .bash_profile; echo $SSH_CLIENT "

Команда ниже

echo $SSH_CLIENT; ssh user@host "source .bash_profile; echo \$SSH_CLIENT "

напечатает то, что вы ожидали.

0

На удаленной машине убедитесь, что у вашего процесса sshd нет опции, которая переопределяет вашу переменную PATH.

ps aux | grep sshd

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .