Bash предлагает изменить цвет при входе на сервер

15

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

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

nitins
источник
Возможно нет. Но вернемся к этому superuser.com/questions/33712/…
случайно
1
Почему бы не сделать свой терминал красным (или другим цветом), чтобы при подключении к ним вы получали белый цвет по умолчанию?
Восстановить Монику - Aug--

Ответы:

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на каждой машине.

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

ilkkachu
источник
2
Этот последний абзац является ключом. Если OP администрирует «огромное количество серверов», то удивительно, что каждый из них должен быть настроен индивидуально в первую очередь.
Легкость гонки с Моникой
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"

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

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

Микаэль Къер
источник
3
Не используйте, sshpass -pесли это вообще возможно! Аргументы командной строки для запуска программ обычно видны всем пользователям ps, и таким же будет пароль. Даже если на вашем компьютере нет других учетных записей, вы можете случайно распечатать его на экране. sshpassможет прочитать пароль из переменной среды, которая не слишком сложна в использовании. Кроме того, рассмотрите ключи ssh, если вы все равно хотите сохранить учетные данные для входа в файл.
ilkkachu
Вы правы, и я не пытался пропагандировать его использование. Я просто вставил в качестве примера мой сценарий, который используется только для целей разработки и не создает угрозы безопасности. Переменная SSHPASS останется пустой для производственных систем, в которых используются ключи ssh. Я буду обновлять.
Микаэль Къер
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переменную environment ( export CONTEXT="hostname") или просто использовать --context/-cопцию ( context-color -c "hostname").

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

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

Ramnes
источник