Встановіть $ PS1 по-різному на локальному комп'ютері та в сесії ssh


9

Я тримаю домашній каталог під контролем версій, щоб моя основна конфігурація була легко доступною на будь-якому комп’ютері.

Мій командний рядок bash на моєму локальному комп'ютері - це складна, барвиста річ, яка включає поточне сховище git та його стан. Але я вважаю за краще простий user@host ~ $командний рядок, коли я sshзаходжу у віддалений автомат.

Я хотів би мати можливість оновити свій, .profileщоб він створював складний $PS1під час локального запуску та спрощений під час запуску в sshсеансі.

В основному, я хотів би $AM_I_LOGGED_IN_VIA_SSHтестувати щось на зразок змінної .profile. Це можливо?

Відповіді:


8

Під час входу через SSH встановлюється кілька додаткових змінних середовища. Ви можете використовувати їх як тест, щоб встановити PS1 у своєму .profile.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

7

Якщо ви перевіряєте навколишнє середовище ( env | grep SSH) ви знайдете кілька кандидатів , таких як $SSH_CLIENT, $SSH_CONNECTIONі $SSH_TTY; точний список буде залежати від sshdверсії.


2

Якщо ваш sshd не надає корисних змінних, ви можете використовувати його

ps -p $PPID

або якийсь інший випадковий PS-трюк (якщо ваша оболонка не встановлений $PPID), щоб побачити, чи є батьківський процес оболонки ваш процес віддаленого входу чи ні. Тоді, якщо перемикач "батько-це-віддалений-річ" $ PS1. А потім завантажте OpenSSH та використовуйте пропозиції geekosaur / Caleb, оскільки ваш ssh-сервер є непотрібним. ;)

Або ви можете скористатися результатом "хто я є", захопити останнє поле (тобто $( who am i | awk '$0=$NF')) і перевірити, чи хост є віддаленим або локальним, щоб вирішити, чи входили ви локально чи віддалено.

Або ви можете увімкнути вихід, $(hostname)щоб ваша оболонка використовувала відповідний $ PS1 для конкретних хостів.

Або давайте по-справжньому зіпсуватися. Якщо ви використовуєте сучасні оболонки, такі як bash, ksh93 або zsh, ви можете скористатися тим, що $ PS1 переоцінюється при виконанні. Отже, ви можете включити вкладений умовний блок, щоб робити шалені речі з git, якщо ваш cwd знаходиться в сховищі, а ще щось поза. Наприклад, тут я ввожу своє швидке зміна залежно від каталогу, в якому я в [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )основному використовую.

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

Звичайно, визначення $ PS1 буде виглядати божевільним у вашому профілі, але ви отримаєте супер-барвисті-git-речі лише тоді, коли ви фактично знаходитесь у сховищі git, тоді як ви маєте звичайні кольори в іншому місці. :) Зауважте, що навколо призначення PS1 ви повинні використовувати одинарні лапки. Ви не хочете, щоб змінні розширювалися при призначенні PS1; ви хочете, щоб вони розширилися, коли пізніше буде оцінено $ PS1. Отже, одноцитати.


1

Якщо PermitUserEnvironmentввімкнено sshd, ви можете використовувати ~/.ssh/environmentдля створення, $PS1а потім просто виявити наявність у вашому скрипті значення, яке зазвичай встановлює його.


0

Як додаток до відповіді Ігнасіо, щоб зрозуміти все, для роботи це PermitUSerEnvironmentпотрібно включити опцію на стороні сервера. Якщо сервер не включить цю опцію, у вас не буде барвистого сеансу ssh з цим сервером.

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