Чому мій .bashrc читається, коли я запускаю неінтерактивні команди над ssh


4

Я додав кожен з моїх файлів налаштування bash ( ~/.bashrc, ~/.bash_profile, ~/.profile ) з echo NAME_OF_FILEя отримую ".bashrc", коли джерелом є ~/.bashrc.

Що мене перешкоджає, чому я отримую і вказівку, що ~ / .bashrc включається, коли я запускаю команду над ssh. Наприклад, якщо я виконую:

ssh localhost echo hi

я отримав

.bashrc
hi

Чому отримуєш ~/.bashrc отримані в цьому контексті? Чи не повинна вона бути отримана в джерелі, оскільки це має запускати неінтерактивний сеанс bash?

Дійсно, ssh localhost tty отримує мені "не a tty" (передує ".bashrc", що вказує на це ~/.bashrc тим не менше отримує джерело.

Я grep ped всі мої конфігураційні файли для команд пошуку в. \ t ~/.bashrc явно, і ніхто не пояснює це.

(Я тільки маю tty -s && shopt -q login_shell && [[ -r ~/.bashrc ]] && . ~/.bashrc в моєму .bash_profile так що я отримую ".bashrc" навіть в інтерактивних оболонках для входу, але це не пояснює проблему ssh - я можу прокоментувати це, і я все ще отримую таку ж поведінку з наведеними вище прикладами ssh)

Як я можу налагодити це?


Чи може вона бути вашою змінною BASH_ENV?
m4573r

Відповіді:


6

Від bash man page:

Bash attempts to determine when it is being run with its standard input
connected to a a network  con‐nection,  as  if  by  the remote shell daemon,
usually rshd, or the secure shell daemon sshd.  If bash
determines it is being run in this fashion, it reads and executes commands
from  ~/.bashrc,  if  that file  exists and is readable.

Тобто. ~/.bashrc буде запущено, коли ви його викликаєте ssh, незалежно від того, чи є у вас tty чи ні.

Якщо ви тільки бажаєте вашого .bashrc для запуску, коли ви інтерактивні, спробуйте це вгорі:

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

Якщо це не спрацює, спробуйте:

[ -z "$PS1" ] && return

1
Сторінка вручну трохи неясна, оскільки більшість інструментів віддаленого підключення - rshd, telnetd, sshd - додають stdin / stdout bash до псевдотерміналу, ні безпосередньо в мережевий сокет (що насправді було б неможливо для sshd). Перевірте вихідний код пізніше.
grawity

Обидва не працювали на CentOS 7.
yildizabdullah

@yildizabdullah вам потрібно налагодити. Почніть з додавання ехо або set -x у верхній частині і подивитися, якщо ваш .bashrc навіть викликається. Потім розглянемо значення цих змінних.
Lqueryvg

@Lqueryvg я додав echo команда вгорі і вона побігла. Тобто називався .bashrc.
yildizabdullah

Виконайте a set і a env - спробувати виробити що $- і $PS1 встановлено на. (Я починаю дивуватися, якщо ви дійсно в bash.). Тип bash щоб отримати під-оболонку - так що ви точно знаєте, що ви знаходитесь у bash - і дивіться на значення там.
Lqueryvg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.