Як я можу змусити ssh-агент працювати над ssh та в tmux (в OS X)?


17

У мене для мого облікового запису github створений приватний ключ, парольна фраза до якого, я вважаю, зберігається в брелоку OS X. Мені, звичайно, не потрібно вводити його, коли я відкриваю вікно терміналу і входжу ssh git@github.com.

Однак, коли я запускаю bash протягом ssh-сеансу або локально всередині tmux-сеансу, мені потрібно вводити парольну фразу кожного разу, коли я намагаюся перетворити ssh на github.

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

Редагувати :

У відповідь на відповідь @ Mikel , з локального терміналу я отримую такий висновок:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

В той час, як над ssh або в tmux я отримую:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID не повертає нічого, з чого я не запускаю оболонку.


Про що typeset -p SSH_AUTH_SOCK?
Мікель

@Mikel bash: typeset: SSH_AUTH_SOCK: not foundзсередини ssh / tmux. Я спробую локально сьогодні ввечері, якщо потрібно.
Багатий

@Mikel Я додав висновок цієї команди до питання.
Багатий

AFAIK, питання та відповіді не стосуються ОС X. Це важливо, щоб уникнути деяких неспеціальних ОС X, а саме superuser.com/q/334975/46794 та superuser.com/q/479796/46794 .
Blaisorblade

@Blaisorblade Я був під враженням, що моя парольна фраза зберігалася в брелоку OS X (Хоча зараз я не можу пригадати, чому я вважав, що це так). Це неправильно?
Багатий

Відповіді:


4

Мій колега створив кілька функцій bash, щоб допомогти знайти активного агента: https://github.com/wwalker/ssh-find-agent

Він використовує його в основному для підключення між системами (ноутбук на робочому столі тощо), але я використовую його найчастіше для локальних сеансів tmux, коли ви виходите з / у вашого віконного менеджера (OS X для себе).

Використання

  1. Завантажте ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitпрацює).

  2. Додайте до ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Потім ви можете ввести наступне, щоб встановити SSH_AUTH_SOCK у вашій поточній оболонці:

    set_ssh_agent_socket
    

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

8

Елегантне рішення, підібране з dagit.o :

Створіть ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

Додати до ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock

7

У .tmux.confфайлі конфігурації додайте цей рядок:

встановити -g середовище оновлення "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

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


2
Це відповідний метод для отримання цих значень у tmux сеанс, але всі ці змінні середовища вже повинні бути включені до значення за замовчуванням update-environment. ОП повинна перевірити їх update-environmentзначення та, можливо, оновити там, де воно вже змінюється.
Кріс Джонсен

1
Хм .. після дальших перекопок я згоден - перелічені я налаштування вже є за замовчуванням, і якщо я запускаю tmux без файлу .tmux.conf, все працює належним чином. І якщо я вилучую рядок, який я цитував, з мого файлу .tmux.conf, це працює і для мене, хоча раніше не було. Очевидно, що іноді щось трапляється не так. Можливо, це стосується призупинення / відновлення, прикріплення / від'єднання або перенесення в сеанс tmux віддалено. Я буду тримати очі відкритими та оновлюватись, якщо знайду фактор, який робить його відтворюваним.
Тревор Пауелл

update-environmentвстановлено правильно. Однак проблема все ж виникає.
Багатий

2
Проблема в цьому полягає в тому, що конфігурація буде повторно виконана лише тоді, коли немає tmuxсервера, що не відповідає меті повторного приєднання ... Можливо, є комутатор командного рядка для оновлення цих змінних?
Тобіас Кіенцлер

3

Мені сталося, що панелі, створені під час підключення через ssh з OS X, почали запитувати мою парольну фразу через деякий час роботи. Я знайшов спосіб виправити цю кражу цієї лінії з http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Просто запустіть його з області, яка скаржиться.


2

Не впевнений, що ви використовуєте bash чи іншу оболонку, але налаштування tmux цього хлопця виглядає так, як це буде працювати для bash. Особисто я використовую zsh з oh-my-zsh , і я виявив, що ssh-агент почав працювати в tmux після того, як я додав

zstyle :omz:plugins:ssh-agent agent-forwarding on

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


1

Що робить:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

друк?

Запустіть його у звичайному терміналі, а потім запустіть всередині tmuxсеансу. Вони повинні надрукувати те саме.


Я додав відповідь на ці команди до запитання. Я також зрозумів, що проблема також виникає, коли я входжу через ssh (не використовуючи tmux), і відповідно відредагував це питання.
Багатий

4
sshлегко. Увімкніть переадресацію агента. Найпростіший спосіб зробити це - запустити ssh -Aзамість ssh. Скористайтеся псевдонімом, щоб вам не довелося вводити його кожен раз або вводити його у свій .SSH/config.
Мікель

Класно, дякую. Це працювало на ssh. Будь-які ідеї, як це виправити в tmux?
Багатий

0

Є багато рішень, але найпростіший знайдеться у відповіді Ганса Гінзеля від 8 січня 2016 року на відповідне питання StackOverflow від 27 січня 2014 року . Просто додайте в оболонку ~/.profileчи подібне:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Не потрібно визначати багаторядкові функції або створювати нові тимчасові файли. Якщо ви не хочете псевдоніму ssh, просто змініть його fixsshта видаліть && sshнаприкінці і запускайте fixsshкожен раз, коли ви намагаєтеся запустити sshзсередини повторно доданий tmux сеанс.

Відповідь Ганса Гінзеля говорить про те, що для запуску потрібна «нова версія» tmux show-env -s. Це працює для мене в tmux 2.7, і коли я читаю журнал змін , -sбуло додано 3 червня 2008 року безпосередньо перед випуском tmux 0.3. tmux 2.3 (29 вересня 2016) знаходиться в стабільній системі Debian.

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