Почему 'ssh host echo $ PATH' и печать $ PATH после ssh'ing в машину дают разные результаты?

perl one:

perl -MList::Util=sum -ane 'printf "%s %s\n", shift @F, sum(@F)/(@F?@F:1)' file
1 15
2 25
8
18.06.2013, 01:42
3 ответа

В первом сценарии вы входите в систему и выполняете так называемое соединение типа логин . При входе в систему скрипты находятся в $ HOME / .bashrc и $ HOME / .bash_profile , если вы используете оболочку для входа в Bash. Эти два сценария, в свою очередь, обычно являются источниками файлов / etc / bashrc и файлов в каталоге /etc/profile.d / *. Sh .

Для второго сценария вы используете только файл $ HOME / .bashrc . Такой тип входа называется интерактивным .

Вы можете узнать больше об этом в разделе INVOCATION на странице руководства bash .

Чтобы изменить это поведение, вы можете включить $ HOME / .bashrc_profile как часть интерактивного выполнения, чтобы получить желаемое поведение:

$ ssh user@remotehost '. $HOME/.bash_profile; echo $PATH'

-или-

$ ssh user@remotehost 'source $HOME/.bash_profile; echo $PATH'

Ссылки

13
29.04.2021, 00:48

Файлы инициализации сеанса странные по истерическим историческим причинам.

Давным-давно вы вошли в систему на консоли, точка. Когда вы вошли в систему, у вас есть оболочка, и оболочка загружает какой-то файл инициализации. Для оболочек в стиле Борна есть два файла инициализации: / etc / profile (для всех пользователей) и ~ / .profile (для каждого пользователя). Файл инициализации может устанавливать переменные среды, такие как PATH , загружать приложения, которые вы хотите запускать в каждом сеансе (например, индикатор почты) и т. Д. Если оболочка не является оболочкой входа ], ему не нужно ничего запускать или устанавливать переменные среды, поэтому нет необходимости запускать какой-либо файл инициализации. Конечно, нет…

На самом деле оболочки постепенно приобретали интерактивные возможности, поэтому для интерактивных оболочек необходим файл инициализации. Ksh имеет ~ / .kshrc , bash имеет ~ / .bashrc , zsh имеет ~ / .zshrc .

Удаленный интерактивный вход в систему выполняется / etc / profile и ~ /.профиль . Но они не подходят для неинтерактивного входа в систему, поскольку могут запускать неинтерактивные программы. К сожалению, не появилось стандарта для файла инициализации для неинтерактивных входов в систему.

Вы можете запустить / etc / profile и ~ / .profile вручную, если вы уверены, что они не будут производить никакого вывода или запускать какую-либо программу, просто установите переменные среды.

ssh foo '. /etc/profile; . ~/.profile; somecommand'

Если у вас есть части в вашем .profile , которые имеют смысл только в интерактивном сеансе, вы можете поместить их в условную инструкцию.

## (in ~/.profile)
case $- in
  *i*) # the shell is interactive
    newmail;;
esac

Если ваша оболочка входа в систему - bash, вы можете воспользоваться причудой: файл инициализации ~ / .bashrc читается интерактивными оболочками, а также неинтерактивными оболочками, родительский процесс которых называется rshd или sshd . В других оболочках такой особенности нет.

## (in ~/.bashrc)
case $- in
  *i*) # interactive shell: set prompt, completion settings, key bindings, etc.
    …;;
  *) # non-interactive shell: our parent must be rshd or sshd
    . ~/.profile;;
esac
3
29.04.2021, 00:48

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

0
29.04.2021, 00:48

Теги

Похожие вопросы