Нажав на мою подсказку PS1 через ssh

19

Я использую конкретную подсказку «PS1», которая мне нравится. Я делюсь несколькими логинами с другими людьми на нескольких разных серверах. Мне было интересно, есть ли способ указать в моем локальном профиле bash удаленное приглашение или каким-либо другим способом, кроме копирования и вставки при каждом удаленном входе.

Unfundednut
источник

Ответы:

17

Загрузите файл на каждый удаленный компьютер, скажем ~/.my_custom_bashrc, с вашей пользовательской bashконфигурацией (в данном случае PS1=...), затем запустите sshс:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Вы можете легко использовать bashфункцию в качестве оболочки для удобства чтения.

Кир
источник
10

Если вы просто хотите отправить PS1переменную, и она не содержит '(одинарную кавычку), попробуйте:

ssh targethost -t "PS1='$PS1'; exec bash"

Хотя местный .bashrcвполне может переписать PS1(спасибо Деннису Уильямсону за указание на это).

Существуют способы передачи переменных среды через ssh , но они обычно отключены в конфигурации сервера. Если PermitUserEnvironmentдиректива включена в конфигурации сервера, и у каждого пользователя есть своя пара ключей (да, вам может не повезти), вы можете добавить environment="PS1=…"в строку ~/.ssh/authorized_keysсоответствующий ваш ключ.

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

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Создайте символические ссылки в mrstatic.homeкаталоге, указывающие на соответствующую запись в родительском каталоге, когда вы хотите поделиться файлом с другими пользователями.

Затем войдите с

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Если вы хотите изменить пульт .profile(или другой файл инициализации), вы можете автоматизировать настройки. Многие сайты пропускают LC_*переменные среды (обычно они используются для настроек локали). Если оба эти условия выполнены, вы можете установить переменную, которая фактически не используется для локалей, скажем LC_USER, на стороне клиента, и протестировать ее на сервере .profile.

(Конечно, общие учетные записи - плохая идея, но я понимаю, что вы не можете изменить эту ситуацию.)

Жиль "ТАК - прекрати быть злым"
источник
3
ssh -t user@host "remote='$PS1' bash -i"

Затем по приглашению:

PS1=$remote
Приостановлено до дальнейшего уведомления.
источник
1
Сложная подсказка bash, скорее всего, сломается, если ее не процитировать (я от вас удивлен). А почему лишняя команда, а не просто "PS1='$PS1' bash -i"(и почему нет execтоже)?
Жиль "ТАК - перестань быть злым"
1
@ Жиль: Отсутствует цитирование: неряшливость. Дополнительная команда: нет ничего необычного в том, PS1чтобы быть перезаписанным во время запуска оболочки. Нет exec: во время тестирования в моей системе это, казалось, не имело никакого значения - никакого дополнительного процесса.
Приостановлено до дальнейшего уведомления.
1
О, да, это хороший момент, местный .bashrcжитель, скорее всего, перезапишет PS1.
Жиль "ТАК - перестань быть злым"
2

Поместите приглашение PS1 в ~ / .ssh / environment, и сессия ssh перенесет его на каждый хост, к которому вы подключаетесь. У меня работает с openssh 4.3p2.

Valmik
источник
1
Это работает, только если конфигурация сервера включена PermitUserEnvironment, которая по умолчанию отключена.
Flimm
1

Вы можете указать переменные окружения на стороне клиента, и если ssh-сервер позволяет это (см. man sshd-config), эти переменные копируются в сеанс при входе в систему на компьютере.

поэтому вам нужно настроить .bashrc на сервере для проверки существующего PS1 (или любой другой переменной) и устанавливать PS1, только если он еще не установлен.

или, что упрощает задачу, вы связываете свои настройки в функцию ... и развертываете эту функцию либо в виде специального файла, который ваш источник по запросу ( source joes_bashrc), либо непосредственно в .bashrc. Наличие вашего собственного файла кажется немного более надежным. другие люди могут использовать ваши настройки, но не обязаны это делать.

Акира
источник
1

Не делитесь логинами. SSH как себя, то и делай sudo -su shareduser( -sзначит "оболочка").

Держите sudoваш домашний каталог:

Defaults env_keep += "HOME"
user1686
источник
Когда меня повысят, я попытаюсь принять эту политику, но пока я застрял в этом.
рекламы
1

Если вы хотите сделать это без необходимости дополнительного scp, вы можете сделать что-то вроде этого:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Это сгенерирует .bashrc.n, который основан на серверах bashrc, но с вашими переопределениями.

нейрон
источник
Вот почему некоторые люди боятся терминалов.
0

Если вы готовы вторгнуться незаметно от ваших коллег, и вы можете доверять им , чтобы не мешать вашему выбору, то я предлагаю сочетание ответа Сайруса , ответ Акиры и ответ Деннис Уильямсона .

  1. На каждом сервере отредактируйте ~/.bashrcи добавьте
    if ["$ Unf" = 1] # Специальный код для unundednut
    тогда
        PS1 = « (ваш желаемый подсказка) »
         (любые другие настройки , которые вы хотите) 
    фи
    в конце. Хотя ваши коллеги «не хотели бы, чтобы вы писали поверх базового профиля», они не узнают об этом, если не будут искать его.
  2. Когда вы входите на удаленный сервер, сделайте
    ssh -t user @ host "Unf = 1 bash -i"
    Хотя вы, вероятно, захотите поместить это в функцию псевдонима или оболочки в своей локальной учетной записи, она достаточно коротка - короче, чем любой другой ответ, - что вы можете легко набрать ее вручную.

Я считаю, что это довольно ясно, но: sshкоманда заставляет Unfпеременную быть установленной на удаленном сервере, когда вы входите в нее. Это вызовет ваш код на пульте дистанционного управления .bashrc, что приведет к вашим изменениям. Поскольку вы ставите свой код в конце .bashrc, он переопределит общие настройки ранее в файле.

Раскрытие: я не проверял это.

Скотт
источник
-1

Самый простой способ это ИМХО:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'
Матиас Барриос
источник
Я не уверен, что это работает; кажется, что отсутствует слой цитат. Даже если это так, настройка PROMPT_COMMAND(которая выполняется каждый раз, когда оболочка выдает приглашение), кажется очень сложным способом решения этой проблемы. И, поскольку это несколько загадочно, любой ответ, который предполагает, что это действительно должно иметь объяснение того, как это работает.
Скотт
-2

Вы можете сделать что-то, например, смонтировать ваш дом через sshfs / nfs, но самое простое решение - это перенести ваш bashrc на новую машину. Это также приносит псевдонимы и прочее.

Dentrasi
источник
Как я уже сказал в своем вопросе, я делюсь этими логинами с другими людьми. Я совершенно уверен, что они не оценят мою запись в базовом профиле.
unundednut
1
Монтирование $ HOME поверх NFS безумно. Просто говорю'.
Уэсли Райс