9

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

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

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

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

5 ответов5

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", взять последнее поле (т. Е. $( 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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .