Я использую сервер AIX 5.3 с файлом .bashrc, настроенным на вывод «Выполнение bashrc». Когда я вхожу на сервер с помощью ssh и запускаю:
bash -c ls
Я получил:
Executing bashrc
.
..
etc....
Однако, когда я вхожу в систему с помощью telnet от имени того же пользователя и запускаю ту же команду, я получаю:
.
..
etc....
Очевидно, что в случае telnet .bashrc не был вызван. Насколько я могу судить, это правильное поведение, учитывая, что оболочка не интерактивна в обоих случаях (она вызывается с помощью -c
). Однако случай ssh, похоже, вызывает оболочку как интерактивную. Похоже, что он не вызывает .profile, поэтому не создает оболочку входа в систему. Я не вижу ничего явно различающегося между средами в этих двух случаях.
Что может быть причиной разницы в поведении bash?
Из Страница руководства Bash, это «нормальное» поведение - bash пытается решить, запускаете ли вы его сначала из sshd:
Вызывается удаленным демоном оболочки
Bash пытается определить, когда он запускается со своим стандартным вводом, подключенным к сетевому соединению, как если бы удаленным демоном оболочки, обычно rshd, или демоном безопасной оболочки sshd. Если Bash определяет, что он запускается таким образом, он читает и выполняет команды из ~ / .bashrc, если этот файл существует и доступен для чтения. Он не будет этого делать, если будет вызван как sh. Параметр --norc может использоваться для запрета этого поведения, а параметр --rcfile может использоваться для принудительного чтения другого файла, но rshd обычно не вызывает оболочку с этими параметрами и не позволяет их указывать.
Убедитесь, что оболочка входа в систему, в которой вы находитесь, не имеет псевдонима или другого PATH
в зависимости от того, вошли ли вы в систему через ssh
или telnet
. Сравните это по-разному:
type -a bash
Условный код может быть в одном из:
/etc/profile
/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
Это устанавливает PATH
иначе или создает псевдоним в зависимости от того, вошли ли вы в систему через ssh
или telnet
. В PATH
может указывать на разные версии Bash, которые скомпилированы с разными параметрами. Псевдоним может быть чем-то вроде alias bash='bash -i'
.
если ты echo $SHELL
как предлагает Николаидис, это только покажет, что происходит в /etc/passwd
в качестве оболочки входа в систему. Возможно, было бы надежнее использовать ps
. Если по какой-то причине вы используете оболочку, отличную от Bash, вам необходимо проверить ее файлы запуска и среду, чтобы увидеть, PATH
или псевдонимы разные. Однако, как правило, интерактивная оболочка не должна влиять на то, как явно вызывается bash -c
работает.
И в этом вы правы:
Насколько я могу судить, это правильное поведение, учитывая, что оболочка не интерактивна в обоих случаях (она вызывается с -c).
попробуйте echo $ SHELL в обоих случаях. это нужно, чтобы увидеть, как он работает в оболочке в обоих случаях.