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

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

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

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

В принципе, я хотел бы что-то вроде $AM_I_LOGGED_IN_VIA_SSH переменная для проверки в моем .profile, Это возможно?

5 ответов

Решение

Когда вы входите через 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 а затем просто определить наличие значения в вашем скрипте, которое обычно устанавливает его.

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

Другие вопросы по тегам