В конце .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
Кодовое имя: Джесси
Из главы 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)
.
Добавлю свой бит в старую ветку для информации, потому что принятый ответ не является реальной причиной того, что .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, чего, как я полагаю, вы ожидаете.