В конце .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
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.11 (jessie)
Release: 8.11
Codename: jessie
Из главы ПРИЗЫВ man bash
:
Когда интерактивная оболочка, которая не является оболочкой входа, запускается, bash читает и выполняет команды из
/etc/bash.bashrc
и~/.bashrc
, если эти файлы существуют. Это можно предотвратить, используя--norc
вариант. В--rcfile
параметр файла заставит bash читать и выполнять команды из файла вместо/etc/bash.bashrc
и~/.bashrc
.Когда bash запускается в неинтерактивном режиме, например, чтобы запустить сценарий оболочки, он ищет переменную
BASH_ENV
в среде, расширяет свое значение, если оно там появляется, и использует расширенное значение как имя файла для чтения и выполнения. Bash ведет себя так, как если бы была выполнена следующая команда:if [ -n "$BASH_ENV" ]; then . "$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 sshd(8)
справочная страница.