14

Есть ли способ сделать динамическое приглашение bash, чтобы при входе на сервер оно меняло цвет?

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

4 ответа4

9

Удаленная подсказка устанавливается удаленным ~/.bashrc . Поэтому вам все равно нужно скопировать его на удаленный сервер. Однако вы можете использовать один ~/.bashrc для всех хостов и установить цвет приглашения на основе имени хоста:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset prompt_color

Заметки:

  • Не устанавливайте PS1 если он еще не установлен (т. Е. Если оболочка не является интерактивной). Проверка того, является ли PS1 непустой, является очень распространенным способом определить, является ли оболочка интерактивной, и вы не хотите путать программы, которые делают это. (Возможно, более точный тест проверяет, содержит ли $- i .)

  • Если вы хотите, чтобы этот код запускался при входе на удаленный сервер, у вас должен быть один из файлов профиля всегда с исходным кодом ~/.bashrc . Но я полагаю, вы это знаете.

  • В PS1 коды перехода должны быть заключены в \[...\] .

  • \[033[m сбрасывает передний план и фон по умолчанию. Итак, здесь :\w появляются на переднем плане / фоне терминала.

  • \[033[48;5;XXXm\033[38;5;YYYm устанавливает фон / передний план на XXX / YYY .

  • Для сценария, который выводит доступные цвета, попробуйте colortest .

  • Чтобы проверить, как будет выглядеть приглашение:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
    
7

Если вы не хотите (не можете) сделать так, чтобы у пультов была отдельная PS1 , то я бы сказал "нет", это было бы по крайней мере ужасно сложно. Учтите, что в SSH-соединении локальная сторона не имеет реального представления о том, что представляет собой приглашение оболочки, а что-то еще, и поэтому настройка цветов для приглашения действительно должна исходить из удаленного узла. Вы можете установить цвета до начала сеанса, но они будут эффективны для всех выходных данных, то есть до тех пор, пока редактор или ls не установит свои собственные цвета.

Конечно, вы могли бы придумать какую-нибудь оболочку для сеанса, чтобы обнаружить все, похожее на приглашение, и раскрасить его, но это легко могло бы привести к ложным срабатываниям (цвет на каждой строке с $?) и быть ужасно сложным по сравнению с простым добавлением одной строки в ваш .profile или .bashrc на каждой машине.

При наличии нескольких машин в любом случае было бы полезно искать решения для синхронизации изменений конфигурации на всех из них. Будь то какой-то инструмент, созданный для этого, или просто скрипт, или просто запуск цикла для копирования (набора) конфигурационных файлов на них все.

5

Я использую скрипт-обертку с sshpass, который сначала загрузит временный профиль, а затем ssh, используя этот профиль (и удалит временный файл).

Вот две основные вещи сценария:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Используя это, вы можете легко определить цвета удаленных сессий.

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

1

Возможно, вас заинтересует context-color , который я собрал именно для этой цели: https://github.com/ramnes/context-color

Это простой скрипт, который при выполнении выводит цвет на основе хеша вывода команды. Установив его где-нибудь в вашем $PATH , вы можете сделать что-то подобное в вашем .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(где --prompt/-p - это параметр, позволяющий экранировать цвет для подсказок и \[\e[0m\] escape-последовательность для сброса цвета)

По умолчанию для создания хэша используется команда whoami; hostname Если вы просто хотите, чтобы цвет менялся в соответствии с именем хоста, вы можете изменить переменную среду $CONTEXT (export CONTEXT="hostname") или просто использовать опцию --context/-c (context-color -c "hostname") ,

Смотрите ниже пример:

демонстрация

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