Установите $ 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версии.

geekosaur
источник
2

Если ваш sshd не предоставляет полезных переменных, вы можете использовать

ps -p $PPID

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

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

Или вы можете включить вывод, $(hostname)чтобы ваша оболочка использовала соответствующий $ PS1 на определенных хостах.

Или давайте действительно сойдем с ума. Если вы используете современную оболочку, такую ​​как bash, ksh93 или zsh, вы можете воспользоваться тем фактом, что $ PS1 переоценивается после выполнения. Таким образом, вы можете включить встроенный условный блок, чтобы делать сумасшедшие штуки, если ваш 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 будет оценен позже. Итак, одинарные кавычки.

dannysauer
источник
1

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

Игнасио Васкес-Абрамс
источник
0

В дополнение к ответу Игнасио, чтобы прояснить ситуацию, PermitUSerEnvironmentопция должна быть включена на стороне сервера, чтобы это работало. Если сервер не активирует эту опцию, у вас не будет красочного ssh-сеанса с этим сервером.

tymik
источник