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_SOCK
diatur 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_SOCK
adalah tidak diatur, meskipun itu adalah diatur dalam lingkungan lokal saya. Jika saya meletakkan ini di lingkungan tmux dengan setenv
perintah 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_SOCK
tidak 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_SOCK
kembali , kembali ke tidak diatur.
sumber
env
?Jawaban:
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:
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:
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 .
sumber
$SSH_AUTH_SOCK
shells baru saya , ini tentang pengaturan$SSH_AUTH_SOCK
di jendela tmux baru sebelum .bashrc / .zshrc bersumber.tmux neww ssh somehost
).SSH_AUTH_SOCK
. Pendekatan ini hanya berfungsi saat sesi tmux terbuka melalui koneksi SSH terbaru.Saya menemukan ini. Jawaban singkat, saya harus menghapus
SSH_AUTH_SOCK
dariupdate-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) diupdate-environment
bagian:sumber
.tmux.conf
untuk membuat ini berfungsi:set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
Apakah Anda melihat masalah denganssh
atau variabel lingkungan secara umum?Alih-alih menggunakan tmux untuk menangani ssh-agent saya, saya memiliki bash menanganinya dengan:
Saya memiliki ini di ~ / bashrc saya , dan ini berfungsi dengan baik.
sumber
$SSH_AUTH_SOCK
diatur dengan benar di shell saya, tetapi ketika saya melakukan sesuatu sepertitmux neww ssh somehost
, saya akan diminta untuk frasa sandi saya untuk membuka kunci kunci pribadi saya kecuali jika saya menjalankantmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
.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.
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.
sumber
Penjelasan djf membawa solusi lain yang mungkin ke pikiran saya:
Sebelum
tmux
/screen
sedang berjalan:ssh-agent
.tmux
/screen
dengan variabel lingkungan untuk inissh-agent
.Ini tidak bisa menggunakan penerusan SSH ke klien tapi itu tidak diminta.
sumber
ssh-agent
tidak mengikat TTY, mengapa harus dibunuh saat keluar (?) - mengapa menggunakannohup
?