Когда вы входите через SSH, устанавливается несколько дополнительных переменных среды. Вы можете использовать их в качестве теста для установки PS1 в свой .profile.
if [ -n "$SSH_CLIENT" ]; then PS1="Via ssh: " else PS1="Local: " fi
Я держу свой домашний каталог под контролем версий, чтобы моя базовая конфигурация была легко доступна на любом компьютере.
Моя командная строка bash на моем локальном компьютере - это сложная, красочная вещь, включающая текущий git-репозиторий и его состояние. Но я предпочел бы иметь простую user@host ~ $
командную строку, когда я ssh
в удаленной машине.
Я хотел бы иметь возможность обновить мой, .profile
чтобы он установил сложный $PS1
при локальном запуске и упрощенный при работе в ssh
сеансе.
По сути, я бы хотел что-то вроде $AM_I_LOGGED_IN_VIA_SSH
переменной для тестирования в моем .profile
. Это возможно?
Когда вы входите через SSH, устанавливается несколько дополнительных переменных среды. Вы можете использовать их в качестве теста для установки PS1 в свой .profile.
if [ -n "$SSH_CLIENT" ]; then PS1="Via ssh: " else PS1="Local: " fi
Если вы проверяете окружающую среду ( env | grep SSH
) вы найдете несколько кандидатов, таких как $SSH_CLIENT
, $SSH_CONNECTION
и $SSH_TTY
; точный список будет зависеть от sshd
версии.
Если ваш 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 будет оценен позже. Итак, одинарные кавычки.
Если PermitUserEnvironment
в sshd включено, то вы можете использовать ~/.ssh/environment
для создания, $PS1
а затем просто обнаружить наличие значения в вашем скрипте, которое обычно его устанавливает.
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.