Установите $ PS1 по-разному на локальном компьютере и в сеансе SSH

4713
Will McCutchen

Я держу свой домашний каталог под контролем версий, чтобы моя базовая конфигурация была легко доступна на любом компьютере.

Моя командная строка bash на моем локальном компьютере - это сложная, красочная вещь, включающая текущий git-репозиторий и его состояние. Но я предпочел бы иметь простую user@host ~ $командную строку, когда я sshв удаленной машине.

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

По сути, я бы хотел что-то вроде $AM_I_LOGGED_IN_VIA_SSHпеременной для тестирования в моем .profile. Это возможно?

9

5 ответов на вопрос

8
Caleb

Когда вы входите через SSH, устанавливается несколько дополнительных переменных среды. Вы можете использовать их в качестве теста для установки PS1 в свой .profile.

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

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

2
dannysauer

Если ваш 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 будет оценен позже. Итак, одинарные кавычки.

1
Ignacio Vazquez-Abrams

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

0
tymik

As an addition to Ignacio's answer, to make things clear, PermitUSerEnvironment option must be enabled on server side for this to work. If server doesn't enable this option, you won't have colorful ssh session with that server.