Mengapa saya harus mengatur ulang env vars di tmux ketika saya memasang kembali?

37

Saya terutama bekerja pada mac dan ssh / tmux melampirkan ke mesin Linux untuk melakukan pekerjaan saya. Saya memiliki ssh-agent yang berjalan di mesin Linux. saya sudah

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

di saya .tmux.conf. Namun, setiap kali saya melampirkan kembali sesi ini, saya harus berlari

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

agar windows tmux baru telah $SSH_AUTH_SOCKdiatur dengan benar. Saya lebih suka tidak harus melakukan ini. Ada ide?

Memperbarui

Saya pikir saya tidak menjelaskan ini dengan baik. Inilah fungsi shell saya untuk membuka shell pada mesin jarak jauh:

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

Ketika tmux menjalankan perintah ssh ini, $SSH_AUTH_SOCKadalah tidak diatur, meskipun itu adalah diatur dalam lingkungan lokal saya. Jika saya meletakkan ini di lingkungan tmux dengan setenvperintah di atas, semuanya berfungsi dengan baik. Pertanyaan saya adalah, mengapa saya harus menjalankan perintah setenv sama sekali?

Perbarui 2

Informasi lebih lanjut:

Ketika saya lampirkan ke sesi yang ada, $SSH_AUTH_SOCKtidak diatur di lingkungan tmux (atau lingkungan global).

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

Jika saya mengaturnya secara manual, semuanya berfungsi:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

Jika saya melepaskan dan melampirkan $SSH_AUTH_SOCKkembali , kembali ke tidak diatur.

Chris W.
sumber
Ini sama sekali bukan tentang SSH, kan? Variabel lingkungan mana yang Anda miliki di shell baru, apa outputnya env?
Hauke ​​Laging
Shell apa yang Anda gunakan di Mac? Pesta?
slm
@ HaukeLaging Ini benar-benar tentang tmux.
Chris W.
@slm Saya menggunakan zsh.
Chris W.
Bagaimana dengan windows yang ada? Apakah mereka masih bekerja?
Hauke ​​Laging

Jawaban:

35

Karena saya menerima Bounty, saya akan memposting ulang komentar kunci saya demi kelengkapan - dan untuk menghindari menetapkan pengunjung dengan masalah yang sama di jalur yang salah:

Tmux akan menghapus Variabel Lingkungan

Halaman manual Tmux menyatakan bahwa pemutakhiran-lingkungan akan menghapus variabel "yang tidak ada di lingkungan sumber [...] seolah-olah -r diberikan kepada perintah set-environment".

Rupanya itulah yang menyebabkan masalah tersebut. Lihat respons Chris di bawah . Namun, saya masih tidak bisa membayangkan bagaimana variabel bisa tidak ada di "lingkungan sumber" dan belum valid di jendela tmux yang baru dibuat ...


Jawaban sebelumnya:

Cara kerja penerusan SSH

Pada mesin jarak jauh, lihat lingkungan shell Anda setelah membuat koneksi 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

Yang penting di sini adalah SSH_AUTH_SOCK yang saat ini diatur ke beberapa file di / tmp. Jika Anda memeriksa file ini, Anda akan melihat bahwa itu adalah soket domain Unix - dan terhubung ke instance ssh yang Anda sambungkan. Yang penting, ini berubah setiap kali Anda terhubung.

Segera setelah Anda keluar, file soket tertentu itu hilang. Sekarang, jika Anda pergi dan pasang kembali sesi tmux Anda, Anda akan melihat masalahnya. Ia memiliki lingkungan sejak tmux diluncurkan - yang mungkin berminggu-minggu yang lalu. Soket tertentu sudah lama mati.

Larutan

Karena kita tahu masalahnya berkaitan dengan mengetahui di mana soket otentikasi SSH yang saat ini hidup, mari kita letakkan saja di tempat yang dapat diprediksi!

Dalam file .bashrc atau .zshrc Anda di mesin jarak jauh, tambahkan berikut ini:

# 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

Saya tidak berpikir Anda bahkan harus memasukkan 'perintah pembaruan-lingkungan' di tmux.conf Anda. Menurut halaman manual , SSH_AUTH_SOCK sudah dicakup secara default.

Kredit

Tanggapan saya adalah kutipan dari posting blog ini oleh Mark 'xb95' Smith yang menjelaskan masalah yang sama untuk layar .

djf
sumber
Terima kasih atas tanggapan bijaksana Anda. Pertanyaan saya bukan tentang pengaturan $SSH_AUTH_SOCKshells baru saya , ini tentang pengaturan $SSH_AUTH_SOCKdi jendela tmux baru sebelum .bashrc / .zshrc bersumber.
Chris W.
@ ChrisW. Saya berasumsi bahwa skrip harus dimasukkan ke dalam file rc shell login Anda pada mesin remote. Jika Anda masuk, shell baru akan muncul, SSH_AUTH_SOCK diubah dan diekspor . Saat Anda memulai tmux, itu akan mewarisi SSH_AUTH_SOCK dari lingkungan induk. Karena nilai SSH_AUTH_SOCK sekarang sudah diperbaiki, tmux harus tetap bekerja pada login berikutnya ... Mungkin saya salah paham masalah
djf
Saya kira kebingungan saya adalah tentang lingkungan di mana ssh dijalankan oleh tmux dalam konteks jendela baru (misalnya tmux neww ssh somehost).
Chris W.
Satu masalah dengan pendekatan ini adalah koneksi SSH ke-2 ke mesin akan menimpa nilai SSH_AUTH_SOCK. Pendekatan ini hanya berfungsi saat sesi tmux terbuka melalui koneksi SSH terbaru.
filum
12

Saya menemukan ini. Jawaban singkat, saya harus menghapus SSH_AUTH_SOCKdari update-environment. Karena itu ada dalam daftar itu, nilainya terpesona setiap kali saya memasang kembali. Terima kasih kepada @djf untuk petunjuknya. Bit yang menonjol dari halaman manual tmux (1) di update-environmentbagian:

Setiap variabel yang tidak ada di lingkungan sumber ditetapkan untuk dihapus dari lingkungan sesi (seolah-olah diberikan kepada perintah set-environment).

Chris W.
sumber
1
@ ChrisW. bisakah Anda sedikit lebih besar? Saya pikir saya memiliki masalah yang sama: kadang-kadang agen berhenti bekerja ketika saya memasang kembali sesi tmux. Masuk akal karena koneksi SSH baru dan ketika saya ssh itu akan memulai agen baru. Apa yang harus saya ubah untuk membuatnya berfungsi? Saya harap ini adalah sesuatu yang dapat saya jalankan karena saya tidak ingin harus mengkonfigurasi ulang setiap mesin yang saya ssh-ing. - Sekarang saya punya bungkus ssh yang mulai tmux dari jarak jauh atau mengembalikan koneksi yang ada, mungkin saya bisa melakukan sesuatu sebelum mengembalikan tmux.
Sorin
@ ChrisW. Terkadang jawaban singkat itu baik, tetapi bisakah Anda memberikan jawaban yang panjang? Saya berusaha keras agar ini berfungsi dan tidak ada dalam pos ini yang berfungsi untuk saya.
redbmk
@sorin @redbmk Maaf tentang itu. Ini adalah satu-satunya baris yang harus saya ubah .tmux.confuntuk membuat ini berfungsi: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" Apakah Anda melihat masalah dengan sshatau variabel lingkungan secara umum?
Chris W.
2

Alih-alih menggunakan tmux untuk menangani ssh-agent saya, saya memiliki bash menanganinya dengan:

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

Saya memiliki ini di ~ / bashrc saya , dan ini berfungsi dengan baik.

pendiam
sumber
$SSH_AUTH_SOCKdiatur dengan benar di shell saya, tetapi ketika saya melakukan sesuatu seperti tmux neww ssh somehost, saya akan diminta untuk frasa sandi saya untuk membuka kunci kunci pribadi saya kecuali jika saya menjalankan tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK.
Chris W.
1

Saya menjawab pertanyaan serupa di StackOverflow https://stackoverflow.com/a/49395839/241025 . Karena halaman ini muncul pertama kali dalam pencarian Google saya, saya ingin memposting versi ringkasannya di sini.

Untuk membuat setiap sesi tmux memiliki seperangkat variabel lingkungan kustom, Anda harus menambahkan nilai ke variabel lingkungan per-sesi tmux. Berikut ini contoh cara melakukannya.

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

Langkah terakhir mengekspor FOO secara eksplisit diperlukan agar panel saat ini akan mengambil variabel lingkungan. Setiap panel atau jendela berikutnya yang Anda buat untuk sesi tmux ini akan mewarisi FOO, tetapi tidak akan muncul di sesi lain.

RobotNerd
sumber
0

Penjelasan djf membawa solusi lain yang mungkin ke pikiran saya:

Sebelum tmux/ screensedang berjalan:

  1. Masuk.
  2. Mulai turunan dari ssh-agent.
  3. Mulai tmux/ screendengan variabel lingkungan untuk ini ssh-agent.

Ini tidak bisa menggunakan penerusan SSH ke klien tapi itu tidak diminta.

Hauke ​​Laging
sumber
1
ssh-agenttidak mengikat TTY, mengapa harus dibunuh saat keluar (?) - mengapa menggunakan nohup?
poige
@poige Benar.
Hauke ​​Laging