Tại sao tôi phải cài đặt lại env vars trong tmux khi tôi đính kèm lại?


37

Tôi chủ yếu làm việc trên máy mac và ssh / tmux gắn vào máy Linux để thực hiện công việc của mình. Tôi có ssh-agent chạy trên máy Linux. Tôi có

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

trong tôi .tmux.conf. Tuy nhiên, bất cứ khi nào tôi gắn lại vào phiên này, tôi phải chạy

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

để các cửa sổ tmux mới $SSH_AUTH_SOCKđược đặt chính xác. Tôi muốn không phải làm điều này. Có ý kiến ​​gì không?

Cập nhật

Tôi nghĩ rằng tôi không giải thích điều này tốt. Đây là chức năng shell của tôi để mở shell trên máy từ xa:

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

Khi tmux chạy lệnh ssh này, $SSH_AUTH_SOCKkhông được thiết lập, mặc dù nó được đặt trong môi trường địa phương của tôi. Nếu tôi đặt nó trong môi trường của tmux với setenvlệnh ở trên, mọi thứ sẽ hoạt động tốt. Câu hỏi của tôi là, tại sao tôi phải chạy lệnh setenv?

Cập nhật 2

Thêm thông tin:

Khi tôi đính kèm vào một phiên hiện có, $SSH_AUTH_SOCKkhông được đặt trong môi trường tmux (hoặc môi trường toàn cầu).

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

Nếu tôi đặt thủ công, mọi thứ sẽ hoạt động:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

Nếu tôi tách ra và gắn lại, $SSH_AUTH_SOCKquay lại không được đặt.


Đây không phải là về SSH, phải không? Những biến môi trường nào bạn có trong một shell mới, đầu ra của là envgì?
Hauke ​​Laging

Bạn đang sử dụng shell nào trên Mac? Bash?
slm

@HaukeLaging Đó thực sự là về tmux.
Chris W.

@slm Tôi đang sử dụng zsh.
Chris W.

Còn các cửa sổ hiện có thì sao? Họ vẫn làm việc chứ?
Hauke ​​Laging

Câu trả lời:


35

Vì tôi đã nhận được Bounty, tôi sẽ đăng lại nhận xét chính của mình để hoàn thiện hơn - và để tránh đặt khách truy cập có cùng vấn đề theo dõi sai:

Tmux sẽ loại bỏ biến môi trường

Trang man của Tmux nói rằng môi trường cập nhật sẽ loại bỏ các biến "không tồn tại trong môi trường nguồn [...] như thể -r được trao cho lệnh môi trường thiết lập".

Rõ ràng đó là những gì gây ra vấn đề. Xem phản hồi của Chris bên dưới . Tuy nhiên, tôi vẫn không thể tưởng tượng làm thế nào biến có thể vắng mặt trong "môi trường nguồn" và vẫn hợp lệ trong cửa sổ tmux mới được tạo ...


Trả lời trước:

Cách thức chuyển tiếp SSH hoạt động

Trên máy từ xa, hãy xem môi trường của trình bao sau khi thiết lập kết nối 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

Cái quan trọng ở đây là SSH_AUTH_SOCK hiện được đặt thành một số tệp trong / tmp. Nếu bạn kiểm tra tệp này, bạn sẽ thấy đó là ổ cắm tên miền Unix - và được kết nối với phiên bản cụ thể của ssh mà bạn đã kết nối. Điều quan trọng, điều này thay đổi mỗi khi bạn kết nối.

Ngay sau khi bạn đăng xuất, tập tin ổ cắm cụ thể đó đã biến mất. Bây giờ, nếu bạn đi và gắn lại phiên tmux của mình, bạn sẽ thấy vấn đề. Nó có môi trường từ khi tmux ban đầu được ra mắt - có thể đã được vài tuần trước. Cái ổ cắm đặc biệt đó đã chết từ lâu.

Dung dịch

Vì chúng tôi biết vấn đề liên quan đến việc biết ổ cắm xác thực SSH hiện đang ở đâu, chúng ta hãy đặt nó ở một nơi có thể dự đoán được!

Trong tệp .bashrc hoặc .zshrc của bạn trên máy từ xa, hãy thêm vào như sau:

# 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

Tôi không nghĩ rằng bạn thậm chí phải đặt một 'lệnh môi trường cập nhật' trong tmux.conf của bạn. Theo trang man , SSH_AUTH_SOCK đã được mặc định.

tín dụng

Phản hồi của tôi là một đoạn trích của bài đăng trên blog này của Mark 'xb95' Smith, người giải thích vấn đề tương tự cho màn hình .


Cảm ơn bạn đã phản hồi chu đáo của bạn. Câu hỏi của tôi không phải là về việc thiết lập $SSH_AUTH_SOCKcác shell của tôi , mà là về việc thiết lập $SSH_AUTH_SOCKtrong các cửa sổ tmux mới trước khi .bashrc / .zshrc có nguồn gốc.
Chris W.

@ChrisW. Tôi giả sử rằng tập lệnh nên được đặt trong tệp RC của trình đăng nhập của bạn trên máy từ xa. Nếu bạn đăng nhập, một vỏ mới được sinh ra, SSH_AUTH_SOCK được thay đổi và xuất ra . Khi bạn khởi động tmux, nó sẽ kế thừa SSH_AUTH_SOCK từ môi trường cha. Vì giá trị của SSH_AUTH_SOCK hiện đã được cố định, tmux nên tiếp tục làm việc với các lần đăng nhập tiếp theo ... Có lẽ tôi đã hiểu nhầm vấn đề
djf

Tôi đoán sự nhầm lẫn của tôi là về môi trường mà ssh được điều hành bởi tmux trong bối cảnh của một cửa sổ mới (ví dụ tmux neww ssh somehost).
Chris W.

Một vấn đề với cách tiếp cận này là kết nối SSH thứ 2 với máy sẽ ghi đè lên giá trị của SSH_AUTH_SOCK. Cách tiếp cận này chỉ hoạt động trong khi phiên tmux được mở thông qua kết nối SSH gần đây nhất.
phylae

12

Tôi đã tìm ra điều này. Trả lời ngắn gọn, tôi cần phải loại bỏ SSH_AUTH_SOCKtừ update-environment. Vì nó nằm trong danh sách đó, nên giá trị đã bị thổi bay mỗi khi tôi gắn lại. Cảm ơn @djf cho manh mối. Các bit nổi bật từ trang man tmux (1) trong update-environmentphần:

Bất kỳ biến nào không tồn tại trong môi trường nguồn được đặt để được loại bỏ khỏi môi trường phiên (như thể -r đã được trao cho lệnh môi trường thiết lập).


1
@ChrisW. bạn có thể vui lòng rõ ràng hơn một chút không? Tôi nghĩ rằng tôi có cùng một vấn đề: đôi khi các tác nhân ngừng hoạt động khi tôi gắn lại các phiên tmux. Điều này có ý nghĩa vì kết nối SSH là mới và khi tôi ssh nó sẽ bắt đầu một tác nhân mới. Tôi phải thay đổi cái gì để nó hoạt động? Tôi hy vọng đó là thứ mà tôi có thể chạy vì tôi không muốn phải cấu hình lại từng máy tôi đang sử dụng. - Bây giờ tôi có một trình bao bọc ssh bắt đầu tmux từ xa hoặc khôi phục các kết nối hiện có, có lẽ tôi có thể làm gì đó trước khi khôi phục tmux.
sorin

@ChrisW. câu trả lời ngắn đôi khi là tốt đẹp, nhưng bạn có thể vui lòng cho một câu trả lời dài? Tôi đang vật lộn với việc này để làm việc và không có gì trong bài viết này làm việc cho tôi.
redbmk

@sorin @redbmk Xin lỗi về điều đó. Đây là dòng duy nhất tôi phải thay đổi .tmux.confđể làm việc này: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" Bạn có thấy các vấn đề với sshhoặc các biến môi trường nói chung không?
Chris W.

2

Thay vì sử dụng tmux để xử lý tác nhân ssh của tôi, tôi đã xử lý bash bằng:

### 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 ### }}}

Tôi có cái này trong ~ / bashrc của tôi và nó hoạt động rất tốt.


$SSH_AUTH_SOCKđược đặt đúng trong trình bao của tôi, nhưng khi tôi làm điều gì đó như thế tmux neww ssh somehost, tôi sẽ được nhắc nhập mật khẩu để mở khóa riêng tư trừ khi tôi chạy tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK.
Chris W.

1

Tôi đã trả lời một câu hỏi tương tự trên StackOverflow https://stackoverflow.com/a/49395839/241025 . Vì trang này xuất hiện đầu tiên trong các tìm kiếm Google của tôi, tôi muốn đăng một phiên bản tóm tắt của nó ở đây.

Để có được mỗi phiên tmux có một bộ biến môi trường tùy chỉnh, bạn phải thêm các giá trị vào biến môi trường mỗi phiên của tmux. Đây là một ví dụ về cách làm điều đó.

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

Bước cuối cùng của việc xuất FOO rõ ràng là cần thiết để khung hiện tại sẽ chọn biến môi trường. Bất kỳ cửa sổ hoặc cửa sổ tiếp theo nào bạn tạo cho phiên tmux này sẽ kế thừa FOO, nhưng nó sẽ không hiển thị trong các phiên khác.


0

lời giải thích của djf mang đến một giải pháp khả thi khác trong tâm trí tôi:

Trước tmux/ screenđang chạy:

  1. Đăng nhập.
  2. Bắt đầu một ví dụ của ssh-agent.
  3. Bắt đầu tmux/ screenvới (các) biến môi trường cho việc này ssh-agent.

Điều này không thể sử dụng chuyển tiếp SSH đến máy khách nhưng điều đó không được yêu cầu.


1
ssh-agentkhông liên kết với TTY, tại sao nó phải bị hủy khi đăng xuất (?) - tại sao sử dụng nohup?
poige

@poige Đúng.
Hauke ​​Laging
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.