Я указываю путь к моей команде в файле / etc / profile :
export PATH=$PATH:/usr/app/cpn/bin
Моя команда находится в:
$ which ydisplay
/usr/app/cpn/bin/ydisplay
Итак, когда я выполняю «echo $ PATH», вывод выглядит так:
$ echo $PATH
...:/usr/app/cpn/bin
И все в порядке, но когда я пытаюсь запустить свою команду через SSH, я получаю сообщение об ошибке:
$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found
Но мой путь все еще присутствует:
$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin
Пожалуйста, объясните мне, почему Bash не может найти ydisplay во время сеанса SSH и как правильно настроить SSH, чтобы избежать этой проблемы.
Более того, если я укажу $ PATH в локальном файле .bashrc у текущего пользователя, все будет работать правильно. Но я хочу изменить только один файл, указав множество файлов для каждого пользователя. Вот почему я спрашиваю.
ydisplay
? делаетssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
работу?ssh 127.0.0.1 echo $PATH
не делайте то, что, как вы думаете, делает: оболочка расширяет $ PATH еще до того, как ssh выполнится, так что ничего не доказывает и не опровергает.Ответы:
ТЛ; др
Работающие
ssh 127.0.0.1 ydisplay
источники,~/.bashrc
а не/etc/profile
.~/.bashrc
Вместо этого измените свой путь .подробности
Единственный раз , когда
/etc/profile
читается, когда ваша оболочка является «Войти оболочки».Из справочного руководства Bash :
Но при запуске
ssh 127.0.0.1 ydisplay
,bash
не запускается в качестве оболочки. Тем не менее, он читает другой файл запуска. Bash Reference Manual говорит:Таким образом, вы должны ввести свои
PATH
настройки~/.bashrc
.В большинстве систем
~/.bash_profile
источники~/.bashrc
, поэтому вы можете поместить свои настройки только~/.bashrc
вместо того, чтобы помещать их в оба файла.Там нет никакого стандартного способа изменить настройки для всех пользователей, но большинство систем имеют
/etc/bashrc
,/etc/bash.bashrc
или аналогичные.В противном случае настройте
pam_env
и вставьтеPATH
настройки/etc/environment
.Смотрите также:
источник
Исторически файлы профиля (
/etc/profile
и~/.profile
) вызывались при входе в систему (в текстовой консоли, что еще?) И служили многим целям:stty
).Все эти цели не были определены как отдельные до позже. Поскольку сценарии профиля могут делать вещи, которые имеют смысл только в интерактивном сеансе (взаимодействие с терминалом, запуск других программ), когда был введен удаленный вызов оболочки ( rsh ), представители rsh решили не вызывать удаленную оболочку в качестве оболочки входа в систему, так что сценарии профиля не выполняются. (В некоторых версиях
rshd
есть возможность запускать удаленную оболочку в качестве оболочки входа в систему.) Ssh скопировал это поведение для замены rsh.Если вы хотите, чтобы выполнялись сценарии вашего профиля, вы можете явно вызывать их.
Обратите внимание на команду
.
для загрузки скриптов профиля внутри оболочки: это команды, которые должны выполняться внутри этой оболочки, а не внешняя программа.Если вы хотите установить глобальную переменную среды для всех пользователей, во многих системах есть другой метод: вместо того, чтобы определять его в
/etc/profile
, определите его в/etc/environment
. Этот файл читается черезpam_env
модуль; большинство дистрибутивов Linux настроены на его чтение.Если ваша оболочка входа в систему bash, есть еще одна возможность. Как правило, вы не должны устанавливать переменные среды в
.bashrc
(потому что они не будут установлены в сеансах X, за исключением случаев, когда вы проходите через терминал с интерактивной оболочкой, потому что они не будут установлены, если вы входите в систему интерактивно на текстовой консоли или более ssh, потому что они переопределят пользовательские настройки, если вы вызовете оболочку внутри другой программы). Однако, у bash есть странная особенность, которую я никогда не понимал: она читается~/.bashrc
в двух не связанных между собой обстоятельствах:rshd
илиsshd
.Когда вы запускаете команду через ssh, вы находитесь во втором случае. Вы можете сделать так, чтобы ваш профиль читали, читая
/etc/profile
и.profile
от.bashrc
. Включите следующий код в свой~/.bashrc
:источник