Чому я маю перевстановлювати env vars у tmux, коли я повторно вкладаю?


37

Я в основному працюю над mac і ssh / tmux, приєднаним до машини Linux, щоб виконувати свою роботу. У мене на сервері Linux працює ssh-агент. Я маю

set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"

в моєму .tmux.conf. Тим не менш, щоразу, коли я знову приєднаюся до цього сеансу, мені доводиться бігати

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

для того, щоб нові вікна tmux $SSH_AUTH_SOCKправильно встановили. Я вважаю за краще не робити цього. Будь-які ідеї?

Оновлення

Я думаю, що я не пояснюю це добре. Ось моя функція оболонки, щоб відкрити оболонку на віддаленій машині:

sshh () {
    tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}

Коли tmux запускає цю команду SSH, $SSH_AUTH_SOCKце НЕ встановлено, навіть якщо він буде встановлений в моїй локальному середовищі. Якщо я поставив це в середовище tmux за допомогою setenvкоманди вище, все працює добре. Моє запитання: чому я взагалі повинен запускати команду setenv?

Оновлення 2

Більше інформації:

Коли я приєднуюся до існуючого сеансу, $SSH_AUTH_SOCKне встановлюється в середовищі tmux (або глобальному середовищі).

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

Якщо я встановив його вручну, все працюватиме:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

Якщо я від'єднаюсь і знову приєднаюся, $SSH_AUTH_SOCKповертається до не встановленого.


Це зовсім не про SSH, чи не так? Які змінні середовища у вас в новій оболонці, що є результатом env?
Хоуке Лагінг

Яку оболонку ви використовуєте на Mac? Баш?
slm

@HaukeLaging Дійсно про tmux.
Кріс В.

@slm Я використовую zsh.
Кріс В.

Що з існуючими вікнами? Вони все ще працюють?
Hauke ​​Laging

Відповіді:


35

Оскільки я отримав Bounty, я переспівую свій ключовий коментар заради повноти - і щоб уникнути встановлення відвідувачів з тією ж проблемою на неправильну доріжку:

Tmux видалить змінні середовища

На головній сторінці Tmux вказується, що середовище оновлення видалить змінні, "яких немає у вихідному середовищі [...], як ніби -r було надано команді set-environment".

Мабуть, те, що викликало проблему. Дивіться відповідь Кріса нижче . Однак я все ще не можу уявити, як змінна могла бути відсутньою у "вихідному середовищі" і все-таки бути дійсною у новоствореному вікні tmux ...


Попередній відповідь:

Як працює пересилання SSH

На віддаленій машині подивіться середовище вашої оболонки після встановлення з'єднання SSH:

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

Тут важливим є SSH_AUTH_SOCK, який наразі встановлений для деякого файлу в / tmp. Якщо ви вивчите цей файл, ви побачите, що це сокет домену Unix - і підключений до конкретного примірника ssh, до якого ви підключились. Важливо, що це змінюється щоразу, коли ви підключаєтесь.

Як тільки ви вийдете, конкретний файл сокета зник. Тепер, якщо зайти і повторно долучити свій tmux сеанс, ви побачите проблему. У ньому є середовище з моменту, коли tmux був спочатку запущений - що могло бути тижнів тому. Ця конкретна розетка давно померла.

Рішення

Оскільки ми знаємо, що проблема пов’язана з тим, щоб знати, де знаходиться поточний розетку аутентифікації SSH, давайте просто поставимо його в передбачуване місце!

У свій .bashrc або .zshrc файл на віддаленій машині додайте наступне:

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

Я не думаю, що вам навіть не потрібно вводити команду update-environment у свій tmux.conf. Згідно з довідковою сторінкою , SSH_AUTH_SOCK вже охоплюється за замовчуванням.

Кредит

Моя відповідь - уривок цього повідомлення в блозі Марка "xb95" Сміта, який пояснює ту саму проблему для екрану .


Дякую за вашу продуману відповідь. Моє запитання не про встановлення моїх $SSH_AUTH_SOCKв нових оболонках, а про встановлення $SSH_AUTH_SOCKв нових вікнах tmux до отримання .bashrc / .zshrc.
Кріс В.

@ChrisW. Я припускав, що сценарій слід помістити у файл rc вашої оболонки для входу на віддаленій машині. Якщо ви увійдете в систему, з'являється нова оболонка, SSH_AUTH_SOCK змінюється та експортується . Коли ви запустите tmux, він успадкує SSH_AUTH_SOCK від батьківського середовища. Оскільки значення SSH_AUTH_SOCK тепер виправлено, tmux повинен продовжувати працювати над подальшими входами ... Можливо, я неправильно зрозумів проблему
djf

Я думаю, що моя плутанина стосується середовища, в якому ssh запускається tmux в контексті нового вікна (наприклад tmux neww ssh somehost).
Кріс В.

Однією з проблем такого підходу є те, що 2-е з'єднання SSH до машини замінить значення значення SSH_AUTH_SOCK. Цей підхід працює лише тоді, коли сеанс tmux відкритий через останнє з'єднання SSH.
phylae

12

Я зрозумів це. Коротка відповідь, мені потрібно видалити SSH_AUTH_SOCKз update-environment. Оскільки це було в цьому списку, значення видували щоразу, коли я повторно приєднувався. Завдяки @djf за підказку. Виразний біт зі сторінки man tmux (1) у update-environmentрозділі:

Будь-які змінні, які не існують у вихідному середовищі, встановлюються для вилучення із сеансового середовища (як би -r було надано команді set-environment).


1
@ChrisW. не могли б ви бути трохи більш чіткими? Я думаю, що у мене є та ж проблема: іноді агент перестає працювати, коли я повторно додаю tmux сесії. Це має певний сенс, оскільки з'єднання SSH є новим, і коли я сшу, він запустить новий агент. Що мені потрібно змінити, щоб воно працювало? Я сподіваюсь, що я можу запуститись, оскільки мені не хочеться переналаштовувати кожну машину, в яку я працюю. - Тепер у мене є обгортка ssh, яка запускає tmux віддалено або відновлює наявні з'єднання, ймовірно, я могла б щось зробити перед тим, як відновити tmux.
sorin

@ChrisW. короткі відповіді іноді приємні, але чи не могли б ви дати відповідь? Я борюся з тим, щоб це було на роботі, і нічого на цій посаді не працює для мене.
redbmk

@sorin @redbmk Вибачте за це. Це єдиний рядок, який мені довелося змінити в моїй роботі, .tmux.confщоб змусити цю роботу: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" Ви бачите проблеми із sshзмінними середовища або взагалі?
Кріс В.

2

Замість використання tmux для обробки мого ssh-агента, я маю bash обробляти його:

### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

У мене це є в ~ / bashrc , і він чудово працює.


$SSH_AUTH_SOCKвстановлено належним чином у моїх оболонках, але коли я роблю щось подібне tmux neww ssh somehost, мені буде запропоновано мою парольну фразу розблокувати приватний ключ, якщо я не запущу tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK.
Кріс В.

1

Я відповів на подібне запитання на StackOverflow https://stackoverflow.com/a/49395839/241025 . Оскільки ця сторінка з’явилася першою в пошуку Google, я хотів опублікувати її зведену версію тут.

Щоб кожен сеанс tmux мав набір змінних користувальницької середовища, вам потрібно додати значення до змінних середовища середовища tmux за сеанс. Ось приклад того, як це зробити.

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

Останній крок явного експорту FOO необхідний, щоб поточна панель підбирала змінну середовища. Будь-які наступні панелі чи вікна, створені для цього tmux сесії, успадкують FOO, але вони не відображатимуться в інших сесіях.


0

Пояснення djf приносить мені інше можливе рішення:

До tmux/ screenзапускається:

  1. Увійти.
  2. Запустіть примірник ssh-agent.
  3. Почніть tmux/ screenіз змінних середовищ для цього ssh-agent.

Це не могло використовувати переадресацію SSH клієнту, але про це не вимагали.


1
ssh-agentне прив'язується до TTY, чому його слід вбивати під час виходу (?) - навіщо використовувати nohup?
poige

@poige Правильно.
Хоуке Лагінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.