Запрошення Bash змінити колір, коли я ввійшов на сервер


15

Чи є спосіб зробити підказку bash динамічною, щоб вона змінила колір під час входу на сервер?

Тому я хочу, щоб колір, як він був у моїй системі, був зеленим і змінювався на червоний при підключенні до серверів. У мене величезна кількість серверів, на які я не хочу ставити різні .bashrc.


Напевно, ні. Але повернемось до цього superuser.com/questions/33712/…
випадково

1
Чому б не зробити свій термінал червоним (або яким-небудь іншим кольором), щоб при підключенні до них отримати білий за замовчуванням?
Відновіть Моніку - ζ--

Відповіді:


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на кожному апараті.

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


2
Останній абзац є ключовим. Якщо OP управляє "величезною кількістю серверів", дивно, що кожен з них повинен бути налаштований індивідуально в першу чергу.
Гонки легкості з Монікою

5

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

Дві основні речі сценарію:
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. Я оновлю.
Mikael Kjær

1

Вас може зацікавити context-color, що я зібрав саме з цією метою: https://github.com/ramnes/context-color

Це простий скрипт, який при виконанні видає колір на основі хеша виводу команди. З ним, встановленим десь у вашому $PATH, ви можете зробити щось подібне у вашому .bashrc:

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

(де --prompt/-pперемикач, щоб колір з'явився для підказок, і \[\e[0m\]послідовність виходу для скидання кольору)

За замовчуванням команда, яка використовується для генерування хеша, є whoami; hostname. Якщо ви просто хочете, щоб колір мінявся відповідно до імені хоста, ви можете змінити $CONTEXTзмінну середовище ( export CONTEXT="hostname") або просто скористатися --context/-cопцією ( context-color -c "hostname").

Дивіться приклад нижче:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.