~ / .bashrc НЕ получен из ssh 'command'

В конце .bashrc я добавил:

touch /tmp/bash_noninteractive_test

Выполнить:

/usr/bin/ssh -v -C root@example.com 'ls'

Вкл. хост (ранее входил в систему в интерактивном режиме):

% ls -l /tmp/bash_noninteractive_test
ls: cannot access /tmp/bash_noninteractive_test: No such file or directory

Я думал, что ~. / bashrc ВСЕГДА создается в неинтерактивных оболочках, например, через SSH? Как это исправить?

Затронутые системы:

% lsb_release -a Модулей LSB нет. Идентификатор распространителя: Ubuntu Описание: Ubuntu 14.04.5 LTS Релиз: 14.04 Кодовое имя: надежный

% lsb_release -a Модулей LSB нет. ID распространителя: Debian Описание: Debian GNU / Linux 8.11 (jessie) Релиз: 8.11 Кодовое имя: Джесси

0
задан 23 October 2018 в 12:38
2 ответа

Из главы INVOCATION man bash:

Когда запускается интерактивная оболочка, которая не является оболочкой для входа в систему, bash читает и выполняет команды из /etc/bash. bashrc и ~/.bashrc, если эти файлы существуют. Это может быть заблокировано с помощью опции --норка. Опция файла --rcfile заставит bash читать и выполнять команды из файла вместо /etc/bash.bashrc и ~/.bashrc.

Когда bash запускается не интерактивно, для запуска скрипта оболочки, например, он ищет переменную BASH_ENV в окружении, расширяет её значение, если она появляется там, и использует расширенное значение в качестве имени файла для чтения и выполнения. Bash ведет себя так, как если бы была выполнена следующая команда:

 if [ -n "$BASH_ENV" ]; тогда . "$BASH_ENV"; fi

, но значение переменной PATH не используется для поиска имени файла.

Таким образом, получается, что ~/.bashrc никогда не исходит из неинтерактивных оболочек, если только BASH_ENV не указывает на него.

В зависимости от того, чего вы хотите достичь, вы можете включить PermitUserRC и/или PermitUserEnvironment в /etc/ssh/sshd_config на вашем удаленном хосте, а затем записать нужные переменные окружения в ~/. ssh/environment и/или нужные команды в ~/.ssh/rc.

ПРИМЕЧАНИЕ:, если вы планируете использовать переадресацию SSH X11 вместе с ~/. ssh/rc, вы должны включить фрагмент кода для явной передачи сессии X11 команде xauth -q -; см. пример в главе SSHRC man-страницы sshd(8).

.
1
ответ дан 4 December 2019 в 15:49

Добавлю свой бит в старую ветку для информации, потому что принятый ответ не является реальной причиной того, что .bashrc не читается для команды ssh. Я получил подсказку после прочтения этого ответа. В предпоследнем абзаце раздела INVOCATION на странице руководства bash говорится, что:

Bash пытается определить, когда он запускается со стандартным входом, подключенным к сетевому соединению, как при выполнении в удаленный демон оболочки, обычно rshd, или демон защищенной оболочки sshd. Если bash определяет, что он запускается таким образом, он читает и выполняет команды из ~/.bashrc и ~/.bashrc, если эти файлы существуют и доступны для чтения. Он не будет этого делать, если вызывается как sh. Параметр --norc может использоваться для запрета такого поведения, а параметр --rcfile может использоваться для принудительного чтения другого файла, но ни rshd, ни sshd обычно не вызывают оболочку с этими параметрами и не позволяют их указывать.

Следовательно, несмотря на то, что команда ssh запускается от имени неинтерактивного пользователя, файл .bashrc все равно загружается.

Но ваша ОС может добавлять проверки в начало .bashrc, подобные следующим (из Ubuntu 18.04), которые закрывают .bashrc после первых нескольких строк для неинтерактивного вызова.

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Чтобы предотвратить проверки, откройте .bashrc и прокомментируйте эти строки, и ваши ssh-команды прочитают весь .bashrc, чего, как я полагаю, вы ожидаете.

1
ответ дан 5 May 2021 в 06:52

Теги

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