1

Я использую Google Compute Engine, на котором работает Debian Wheezy 7.4.

Я недавно замечал странные вещи. Например, я могу сделать sudo bash . Но затем из root я не могу выполнить sudo -u anotherUser bash или su -l anotheruser -c bash .

И, что еще более важно, я не могу запустить новые экземпляры экрана GNU. Если я пытаюсь запустить новый экземпляр, он немедленно выключается, и я получаю сообщение [screen is terminating] . В тех случаях, когда были запущены, я не мог запустить больше окон.

Тогда я обнаружил, что у всех было общего: bash !

Я могу сделать screen zsh или screen sh .

Я могу сделать sudo bash а затем sudo -u anotheruser zsh или su -l anotheruser -s zsh но НЕ su -l anotheruser -c zsh .

Обратите внимание , что я входе в систему с Баш и я могу сделать sudo bash Но я не могу использовать bash для sudo или su от пользователя root и не могу использовать bash для screen оболочки.

Я перезагрузился. Да, это меня так сильно беспокоило, что я фактически перезагрузил свой сервер.

Я понятия не имею, что может вызвать это, и я немного волнуюсь.

Мои файлы конфигурации bash (насколько я знаю, они не изменились по умолчанию):

Завершение bash работает в основной (логин) оболочке.

Вот информация, запрошенная Гленном Джекманом:

$ md5sum /bin/bash /usr/bin/bash
144968564a6b1159ed82059920cea76f  /bin/bash
md5sum: /usr/bin/bash: No such file or directory
$ getent passwd anotheruser
anotheruser:x:1004:1004::/home/anotheruser:/bin/bash

Также я подумал о другом тесте. Это работает:

$ echo $(bash -c 'echo Hello, World!')

В чем дело?

1 ответ1

0

Была проблема в:

/usr/share/bash-completion/bash_completion

Более конкретно, это строка в начале:

if [ "$0" != "-bash" ]; then exit; fi

Эта строка проверяет, является ли текущая оболочка bash. Если это не так, он не использует завершение bash. Если я удаляю строку, я получаю ошибки в некоторых сценариях, которые пытаются использовать команду [[ .

Вот что я в итоге придумал:

isbash=no
case "$SHELL" in
  *bash*) isbash=yes ;;
esac
case "$0" in
  *bash*) isbash=yes ;;
esac
if [ "$isbash" = "no" ]; then exit; fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .