Làm cách nào tôi có thể để ssh-agent hoạt động trên ssh và trong tmux (trên OS X)?


17

Tôi có một khóa riêng được thiết lập cho tài khoản github của mình, cụm mật khẩu mà tôi tin là được lưu trữ trong khóa của OS X. Tôi chắc chắn không phải gõ nó khi tôi mở một cửa sổ đầu cuối và nhập ssh git@github.com.

Tuy nhiên, khi tôi đang chạy bash qua một phiên ssh hoặc cục bộ bên trong phiên tmux, tôi phải nhập cụm mật khẩu mỗi lần tôi cố gắng ssh để github.

Câu hỏi này gợi ý rằng một vấn đề tương tự tồn tại với màn hình, nhưng tôi không thực sự hiểu rõ vấn đề này đủ để khắc phục nó trong tmux. Ngoài ra còn có trang này bao gồm một giải pháp khá phức tạp, nhưng đối với zsh.

CHỈNH SỬA :

Đáp lại câu trả lời của @ Mikel , từ một thiết bị đầu cuối cục bộ, tôi nhận được kết quả đầu ra sau:

[~]
$ 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"

Trong khi trên ssh hoặc trong tmux tôi nhận được:

[~]
$ 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 trả lại bất cứ thứ gì tôi chạy nó từ.


Thế còn typeset -p SSH_AUTH_SOCK?
Mikel

@Mikel bash: typeset: SSH_AUTH_SOCK: not foundtừ trong ssh / tmux. Tôi sẽ thử nó tối nay, nếu cần thiết.
Giàu

@Mikel Tôi đã thêm đầu ra của lệnh đó vào câu hỏi.
Giàu

AFAIK, câu hỏi và câu trả lời không dành riêng cho OS X. Điều đó có liên quan để tránh một số dups không dành riêng cho hệ điều hành X, cụ thể là superuser.com/q/334975/46794superuser.com/q/479796/46794 .
Blaisorblade

@Blaisorblade Tôi đã bị ấn tượng Mật khẩu của tôi được lưu trong móc khóa OS X (Mặc dù bây giờ tôi không thể nhớ tại sao tôi tin rằng đó là trường hợp). Điều đó có sai không?
Giàu

Câu trả lời:


4

Đồng nghiệp của tôi đã tạo một số chức năng bash để hỗ trợ tìm kiếm đại lý trực tiếp: https://github.com/wwalker/ssh-find-agent

Anh ta sử dụng nó chủ yếu để kết nối giữa các hệ thống (máy tính xách tay với máy tính để bàn, v.v.), nhưng tôi thường sử dụng nó cho các phiên tmux cục bộ nơi bạn đăng xuất / đăng nhập từ trình quản lý cửa sổ (OS X cho chính tôi).

Sử dụng

  1. Tải xuống ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.githoạt động).

  2. Thêm phần sau vào ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Sau đó, bạn có thể nhập nội dung sau để đặt SSH_AUTH_SOCK trong trình bao hiện tại của mình:

    set_ssh_agent_socket
    

Tôi đã chấp nhận câu trả lời này thay vì bất kỳ câu trả lời nào khác có thể hoạt động vì nó không yêu cầu chuyển tiếp tác nhân SSH, điều này tốt hơn cho mục đích của tôi. Cảm ơn!
Giàu

8

Một giải pháp tao nhã, được chọn từ dagit.o :

Tạo nên ~/.ssh/rc

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

Thêm vào ~/.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

Trong .tmux.conftệp cấu hình của bạn , thêm dòng này:

thiết lập -g môi trường cập nhật "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Điều này làm cho các biến môi trường này được sao chép từ shell chính của bạn sang bất kỳ shell nào được mở trong tmux, sau đó cho phép ssh-agent hoạt động chính xác trong các shell tmux đó.


2
Đây là phương pháp thích hợp để đưa các giá trị đó vào phiên tmux , nhưng tất cả các biến môi trường đó đã được đưa vào giá trị mặc định của update-environment. OP nên kiểm tra update-environmentgiá trị của chúng và có thể cập nhật bất cứ nơi nào nó đã được thay đổi.
Chris Johnsen

1
Hừm .. sau khi đào sâu hơn, tôi đồng ý - các cài đặt tôi liệt kê đã có trong mặc định và nếu tôi chạy tmux mà không có tệp .tmux.conf, mọi thứ sẽ hoạt động bình thường. Và nếu tôi xóa dòng tôi đã trích dẫn từ tệp .tmux.conf của mình, thì nó cũng hoạt động với tôi, mặc dù trước đây nó không hoạt động. Rõ ràng có điều gì đó khác đi đôi khi sai. Có thể thực hiện với việc tạm dừng / khôi phục hoặc đính kèm / tách hoặc sshing vào một phiên tmux từ xa. Tôi sẽ mở mắt và cập nhật nếu tôi tìm thấy yếu tố khiến nó có thể tái tạo.
Trevor Powell

update-environmentđược đặt chính xác. Tuy nhiên, vấn đề vẫn xảy ra.
Giàu

2
Vấn đề với điều này là cấu hình sẽ chỉ được thực hiện lại khi không có tmuxmáy chủ, bất chấp mục đích gắn lại ... Có thể có một chuyển đổi dòng lệnh để cập nhật lại các biến đó?
Tobias Kienzler

3

Nó đã xảy ra với tôi rằng các pan được tạo khi kết nối qua ssh từ OS X bắt đầu hỏi cụm mật khẩu của tôi sau một thời gian làm việc ổn. Tôi đã tìm ra cách khắc phục việc đánh cắp dòng này từ http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

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

Chỉ cần chạy nó từ khung đó là phàn nàn.


2

Không chắc chắn nếu bạn đang sử dụng bash hoặc shell khác, nhưng thiết lập tmux của anh chàng này có vẻ như nó sẽ hoạt động cho bash. Cá nhân tôi đang sử dụng zsh với oh-my-zsh và tôi thấy rằng ssh-agent bắt đầu hoạt động trong tmux sau khi tôi thêm

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

vào tệp .zshrc của tôi và tải lại cấu hình trong các phiên zsh đang chạy của tôi. Tôi cũng tìm thấy giải pháp định hướng zsh của anh chàng này , nhưng hóa ra nó không cần thiết đối với tôi.


1

Làm gì

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

in?

Chạy nó trong thiết bị đầu cuối bình thường của bạn, sau đó chạy nó trong tmuxphiên của bạn . Họ nên in điều tương tự.


Tôi đã thêm câu trả lời cho các lệnh này cho câu hỏi. Tôi cũng nhận ra rằng vấn đề cũng xảy ra khi tôi đăng nhập qua ssh (không sử dụng tmux) và đã chỉnh sửa câu hỏi tương ứng.
Giàu

4
sshdễ. Bật chuyển tiếp đại lý. Cách dễ nhất để làm điều đó là chạy ssh -Athay vì ssh. Sử dụng một bí danh để bạn không phải gõ nó mỗi lần hoặc đặt nó vào .SSH/config.
Mikel

Hay quá cảm ơn. Điều đó đã làm việc cho ssh. Bất kỳ ý tưởng làm thế nào để sửa nó trong tmux?
Giàu

0

Có nhiều giải pháp, nhưng giải pháp đơn giản nhất được tìm thấy trong câu trả lời của Hans Ginzel, ngày 8 tháng 1 năm 2016, cho câu hỏi StackOverflow liên quan ngày 27 tháng 1 năm 2014 . Chỉ cần thêm những thứ sau vào vỏ của bạn ~/.profilehoặc tương tự:

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

Không cần xác định các hàm đa dòng hoặc tạo các tệp tạm thời mới. Nếu bạn không muốn bí danh ssh, chỉ cần thay đổi nó thành fixsshvà xóa && sshở cuối, và chạy fixsshbất cứ khi nào bạn đang cố gắng chạy sshtừ bên trong một phiên tmux được gắn lại.

Câu trả lời của Hans Ginzel cho thấy cần phải có một 'phiên bản mới hơn' của tmux để chạy show-env -s. Điều này hoạt động với tôi trong tmux 2.7 và khi tôi đọc thay đổi , -sđã được thêm vào ngày 3 tháng 6 năm 2008 ngay trước khi phát hành tmux 0.3. tmux 2.3 (29 tháng 9 năm 2016) trong Debian ổn định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.