Почему Bash не удалось найти команду, даже если $ PATH указан правильно?

Я указываю путь к моей команде в файле / 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 у текущего пользователя, все работает правильно. Но я хочу изменить только один файл, вместо этого указывая много файлов для каждого пользователя. Вот почему я спрашиваю.

  • Можно ли запустить FreeRDP без отображения для запуска скриптов?
  • Безопасно ли отключать пароль для пользователя, если он использует только SSH-ключ?
  • Невозможно выполнить регистрацию открытого ключа SSH под зашифрованным домом
  • X Пересылка с косвенным рендерингом завершается неудачей с более новыми клиентами
  • rsync Передача агента SSH через 3 удаленные системы не работает с одной командой
  • Копирование файла с использованием SSH через туннель с отправкой сертификатов
  • автоматическое восстановление SSH-соединения при загрузке
  • Как заставить sshd прослушивать два порта, но ограничивать один из них одним адресом источника?
  • 2 Solutions collect form web for “Почему Bash не удалось найти команду, даже если $ PATH указан правильно?”

    ТЛ; др

    Запуск ssh 127.0.0.1 ydisplay источников ssh 127.0.0.1 ydisplay ~/.bashrc а не /etc/profile . Вместо этого измените свой путь в ~/.bashrc .

    Детали

    Единственное время чтения /etc/profile – это когда ваша оболочка является «оболочкой входа».

    Из справочного руководства Bash :

    Когда bash вызывается в качестве оболочки входа, … он сначала считывает и выполняет команды из файла / etc / profile

    Но когда вы запускаете ssh 127.0.0.1 ydisplay , bash не запускается как оболочка входа. Тем не менее, он читает другой файл автозагрузки. В справочном руководстве Bash говорится:

    когда … выполняется … sshd. … он читает и выполняет команды из ~/.bashrc

    Поэтому вы должны поместить свои настройки PATH в ~/.bashrc .

    В большинстве систем источники ~/.bash_profile ~/.bashrc , поэтому вы можете поместить свои настройки только в ~/.bashrc а не помещать их в оба файла.

    Нет стандартного способа изменить настройки для всех пользователей, но в большинстве систем есть /etc/bashrc , /etc/bash.bashrc или аналогичные.

    В противном случае настройте pam_env и установите параметр PATH в /etc/environment .

    Смотрите также:

    • Что такое чтение conf-файла между логином и оболочкой без входа?
    • Есть ли эквивалентный файл .bashrc, который читают все оболочки?

    Исторически файлы профиля ( /etc/profile и ~/.profile ) вызывались при входе в систему (в текстовой консоли, что еще?) И служили множеству задач:

    • Задайте переменные среды и другие параметры (например, umask) для сеанса.
    • Запускайте дополнительные программы в начале сеанса (например, уведомление по электронной почте).
    • Запустите программу для сеанса, если она отличается от оболочки (например, другой оболочки или X Window).
    • Задайте параметры терминала (например, stty ).
    • Задайте параметры оболочки (например, псевдонимы).

    Все эти цели не были идентифицированы как отдельные до конца. Поскольку скрипты профиля могут делать то, что имеет смысл только в интерактивном сеансе (взаимодействие с терминалом, запуск других программ), когда был введен удаленный вызов оболочки ( rsh ), make rsh решил не вызывать удаленную оболочку в качестве оболочки входа, так что скрипты профиля не выполняются. (В некоторых версиях rshd есть опция запуска удаленной оболочки в качестве оболочки входа.) Ssh скопировал это поведение, чтобы быть заменой для rsh.

    Если вы хотите, чтобы ваши скрипты профиля выполнялись, вы можете их явно вызвать.

     ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay' 

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

    Если вы хотите установить глобальную переменную для всех пользователей, во многих системах существует другой метод: вместо определения в /etc/profile укажите его в /etc/environment . Этот файл считывается через модуль pam_env ; большинство дистрибутивов Linux настроено для его чтения.

    Если ваша оболочка входа – bash, есть еще одна возможность. Как правило, вы не должны устанавливать переменные среды в .bashrc (потому что они не будут установлены в X сеансах, за исключением случаев, когда вы проходите через терминал с интерактивной оболочкой, потому что они не будут установлены, если вы входите в интерактивный режим на текстовой консоли или над ssh, потому что они переопределяют пользовательские настройки, если вы вызываете оболочку внутри другой программы). Однако у bash есть странная особенность, которую я никогда не понимал: она читает ~/.bashrc в двух несвязанных обстоятельствах:

    • в интерактивных оболочках, которые не являются командами входа;
    • в неинтерактивных оболочках, которые не являются rshd входа в систему, если bash считает, что он был вызван rshd или sshd .

    Когда вы выполняете команду над ssh, вы находитесь во втором случае. Вы можете организовать чтение своего профиля, прочитав /etc/profile и .profile с .bashrc . Добавьте в код ~/.bashrc следующий код:

     case $- in *i*) :;; # this is an interactive shell, fine *) # This is not an interactive shell! This must be a non-interactive remote shell session. . /etc/profile; . ~/.profile return;; esac и case $- in *i*) :;; # this is an interactive shell, fine *) # This is not an interactive shell! This must be a non-interactive remote shell session. . /etc/profile; . ~/.profile return;; esac 
    Linux и Unix - лучшая ОС в мире.