1

Я знаю, что ответов двадцать тысяч, но ни один из них не сработал так, как ожидалось. Я удивлен больше, чем вы, поэтому, пожалуйста, сначала прочитайте рассказ.

Я пытаюсь добиться того, что кажется базовым: отправлять локальную переменную PS1 в Ubuntu 14.04.1, когда я вхожу в нее по SSH с Mac. Я знаю, что есть два способа сделать это:

  1. Используя директиву SendEnv внутри /etc /ssh_config,
  2. Используя команду с SSH, что-то вроде ssh host -t "PS1='"$PS1"'; exec bash" .

Оба маршрута прилично хорошо описаны в других ответах SE, и в Google есть множество результатов. Но никто не работает для меня, как ожидалось.

Первый вариант не работает, я установил AcceptEnv PS1 и PermitUserEnvironment yes в /etc /ssh /sshd_config в Ubuntu. Если я пытаюсь передать любую другую переменную, она работает как ожидалось. Я изучил ~/.bashrc и ~/.profile и, похоже, у него много заданий для PS1 . Это там переопределено, и если да, как предотвратить это?

Второй вариант тоже не работает, но опять же, он работает с любым другим именем переменной. Если я сделаю export ABC=123; exec bash при входе в SSH, я вижу ABC в определенных переменных, если я делаю то же самое с PS1 , по умолчанию всегда используется \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ . Другая проблема, связанная со вторым решением, заключается в том, что некоторые переменные окружения не загружаются, когда я запускаю exec bash , я пытался с --login и --interactive , пытался найти исходный код . ~/.profile и . ~/.bashrc , но я не получаю тот же вывод при входе в систему (баннер Ubuntu и статистика), когда я вхожу в систему, а переменные остаются неопределенными (так что псевдонимы и другие полезные вещи я предполагаю?).

Я хочу знать, как установить мои стили приглашений, определенные в локальном PS1 на недавнюю Ubuntu по SSH-соединению. Изменение связанной с PS1 конфигурации в Ubuntu НЕ является вариантом, я явно хочу передать конфигурацию из моего клиента, поэтому я не делаю то же самое двадцать раз.

1 ответ1

1

Я изучил ~/.bashrc и ~/.profile и, похоже, у него много заданий для PS1 . Это там переопределено, и если да, как предотвратить это?

Да, это переопределено. Оба ваших метода изначально устанавливают переменную, но это не имеет значения, если однажды bash отправит любой файл, переопределяющий PS1 .

Чтобы этого не случилось ты

  • либо сделайте так, чтобы удаленный bash определил, подключен ли вы по ssh и не меняйте PS1 в этом случае; это может потребовать значительных изменений этих исходных файлов, и вы не хотите этого делать;
  • или позвольте удаленному bash установить PS1 любым способом, который он в настоящее время делает, но переопределите его в самом конце ; кажется, это лучший способ.

Добавьте следующую строку в конце вашего .bashrc на удаленной машине:

[ -n "$PS1_ovrrde" ] && PS1="$PS1_ovrrde"

Теперь все, что вам нужно сделать, это установить PS1_ovrrde на удаленной стороне, когда вы входите через SSH. Вы уже знаете два пути. Заметки:

  1. С SendEnv вам нужно, чтобы PS1_ovrrde был в вашей локальной среде, я думаю. Добавьте export PS1_ovrrde="$PS1" в конце вашего локального .bashrc .
  2. В exec bash вам необходимо экспортировать PS1_ovrrde в удаленную среду: ssh host -t "export PS1_ovrrde=..." . Переменные, уже находящиеся в удаленной среде, не нужно снова экспортировать, но здесь вы создаете совершенно новую переменную.

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