Назад | Перейти на главную страницу

Почему вызов bash отличается в AIX при использовании telnet и ssh

Я использую сервер 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 в обоих случаях. это нужно, чтобы увидеть, как он работает в оболочке в обоих случаях.