Yeniden taktığımda neden env değişkenlerini tmux'ta yeniden ayarlamak zorundayım?


37

Genelde mac ve ssh / tmux üzerinde çalışıyorum ve işimi yapmak için Linux makinesine ekliyorum. Linux makinesinde çalışan ssh-agent'ım var. Sahibim

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

benim içinde .tmux.conf. Yine de, ne zaman bu oturuma yeniden bağlansam, koşmam gerekiyor

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

Yeni tmux pencerelerin $SSH_AUTH_SOCKdoğru ayarlanması için. Bunu yapmak zorunda kalmamayı tercih ederim. Herhangi bir fikir?

Güncelleme

Sanırım bunu iyi açıklamıyorum. İşte uzaktaki bir makinede bir kabuk açmak için benim kabuk işlevi:

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

Tmux bu ssh komutu çalıştırıldığında, $SSH_AUTH_SOCKbir değil o halde set edilir benim yerel ortamda ayarlayın. Bunu setenvyukarıdaki komutla tmux’un ortamına koyarsam her şey yolunda gider . Sorum şu, setenv komutunu neden çalıştırmam gerekiyor?

Güncelleme 2

Daha fazla bilgi:

Mevcut bir oturuma eklediğimde $SSH_AUTH_SOCK, tmux ortamında (veya global ortamda) ayarlanmadı.

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

Manuel olarak ayarlarsam, işler işe yarar:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

Çıkarır ve yeniden takarsam, $SSH_AUTH_SOCKkurulmamışa geri döner.


Bu hiç SSH ile ilgili değil, değil mi? Yeni bir kabukta hangi çevre değişkenlerine sahipsiniz, çıktısı envnedir?
Hauke ​​Laging

Mac'te hangi kabuğu kullanıyorsunuz? Bash?
slm

@HaukeLaging Gerçekten tmux ile ilgili.
Chris W.

@slm zsh kullanıyorum.
Chris W.

Ya mevcut pencereler? Hala çalışıyorlar mı?
Hauke ​​Lager

Yanıtlar:


34

Ödül'ü aldığımdan beri anahtar yorumumu bütünlük uğruna tekrarlayacağım - ve aynı sorunu olan ziyaretçileri yanlış yolda bırakmaktan kaçınmak için:

Tmux, Ortam Değişkenlerini kaldıracak

Tmux 'man sayfası güncelleme ortamının "kaynak ortamda bulunmayan değişkenleri [...] set-environment komutuna -r verildiği gibi" çıkaracağını belirtir.

Görünüşe göre bu soruna neden oldu. Aşağıdaki Chris'in cevabına bakınız . Bununla birlikte, değişkenin "kaynak ortamda" nasıl bulunmadığını ve henüz oluşturulan tmux penceresinde geçerli olduğunu hala hayal edemiyorum ...


Önceki Cevap:

SSH iletme nasıl çalışır?

Uzak makinede, SSH bağlantısını kurduktan sonra kabuğunuzun ortamına bakın:

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

Burada önemli olan şu anda / tmp içindeki bir dosyaya ayarlanmış olan SSH_AUTH_SOCK. Bu dosyayı incelerseniz, bunun bir Unix alan soketi olduğunu göreceksiniz - ve bağlandığınız belirli ssh örneğine bağlı. Önemli olan, bu her bağlandığınızda değişir.

Oturumu kapattıktan sonra söz konusu soket dosyası kaybolur. Şimdi, gidip tmux oturumunuzu yeniden bağlarsanız, sorunu görürsünüz. Tmux'un başlangıçta ne zaman piyasaya sürüldüğüne dair bir ortamı var - bu haftalar önce olabilirdi. Bu özel soket öldüğünden beri uzun.

Çözüm

Sorunun şu anda canlı olan SSH kimlik doğrulama soketinin nerede olduğunu bilmekle ilgili olduğunu bildiğimizden, hadi bunu tahmin edilebilir bir yere koyalım!

Uzak makinedeki .bashrc veya .zshrc dosyanızda aşağıdakileri ekleyin:

# 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

Tmux.conf 'a' güncelleme ortamı komutu 'koymanız gerektiğini bile sanmıyorum. Göre adam sayfasında , SSH_AUTH_SOCK zaten varsayılan olarak kaplıdır.

Kredi

Benim cevabım, ekran için aynı problemi açıklayan Mark 'xb95' Smith tarafından yayınlanan bu blog yazısının bir kısmı .


Düşünceli cevabınız için teşekkür ederim. Benim sorum benim $SSH_AUTH_SOCKyeni kabukları ayarlamak değil , $SSH_AUTH_SOCK.bashrc / .zshrc kaynaklanmadan önce yeni tmux pencerelerinde ayarlamakla ilgili .
Chris W.

@ChrisW. Komut dosyasının uzak makinedeki oturum açma kabuğunuzun rc dosyasına yerleştirilmesi gerektiğini düşündüm. Giriş yaparsanız, yeni bir kabuk açılır, SSH_AUTH_SOCK değiştirildi ve dışa aktarıldı . Daha sonra tmux'u başlattığınızda, SSH_AUTH_SOCK ana ortamdan devralır. SSH_AUTH_SOCK'un değeri artık sabit olduğundan, tmux daha sonraki girişler üzerinde çalışmaya devam etmeli ... Belki de sorunu yanlış
anlıyorum

Sanırım kafa karışıklığım ssh'nin tmux tarafından yeni bir pencere bağlamında çalıştırıldığı ortamla ilgili (sanırım tmux neww ssh somehost).
Chris W.

Bu yaklaşımla ilgili bir problem, makineye yapılan 2. SSH bağlantısının değerinin üzerine yazmasıdır SSH_AUTH_SOCK. Bu yaklaşım sadece tmux oturumu en son SSH bağlantısı üzerinden açıkken çalışır.
phylae

12

Bunu anladım. Kısa cevap, ben kaldırmak için gerekli SSH_AUTH_SOCKdan update-environment. Bu listede olduğundan, her taktığımda değer düşüyordu. İpucu için @djf teşekkürler. Bölümdeki tmux (1) man sayfasından göze çarpan bit update-environment:

Kaynak ortamda bulunmayan değişkenler, oturum ortamından kaldırılacak şekilde ayarlanmış (sanki set-ortam komutuna -r verildi).


1
@ChrisW. biraz daha net olabilir misiniz lütfen? Aynı problemi yaşadığımı düşünüyorum: Bazen tmux seanslarını yeniden taktığımda ajan çalışmamaya başlıyor. SSH bağlantısı yeni olduğu için bir anlam ifade ediyor ve ssh olduğunda yeni bir ajan başlatacak. Çalışması için neyi değiştirmeliyim? Umarım çalıştığım her makineyi yeniden yapılandırmak zorunda kalmak istemediğim için çalıştırabileceğim bir şeydir. - Artık tmux’u uzaktan başlatan veya mevcut bağlantıları geri yükleyen bir ssh sarmalayıcım var, muhtemelen tmux’u geri yüklemeden önce bir şeyler yapabilirim.
sorin

@ChrisW. kısa cevaplar bazen iyidir, ama lütfen uzun cevaplar verebilir misiniz? Bu işe almak için mücadele ediyorum ve bu yazıdaki hiçbir şey benim için çalışıyor.
redbmk

@sorin @redbmk Bunun için üzgünüm. Bu .tmux.confişe yaraması için benim değiştirmem gereken tek satır bu: Genelde çevre değişkenleriyle veya çevre değişkenleriyle set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" ilgili sorunlar mı görüyorsunuz ssh?
Chris W.

2

Ssh-agent'ımı işlemek için tmux kullanmak yerine, bununla başa çıkmak için bash kullanıyorum:

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

Benim ~ / bashrc içinde bu ve harika çalışıyor.


$SSH_AUTH_SOCKKabuklarımda doğru bir şekilde ayarlanmış, ancak bir şey tmux neww ssh somehostyaptığımda, çalıştırmadığım sürece şifremden özel anahtarımın kilidini açmam istenecek tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK.
Chris W.

1

Benzer bir soruyu StackOverflow https://stackoverflow.com/a/49395839/241025 adresinde de cevapladım . Bu sayfa Google aramalarımda ilk çıktığından, buraya özet bir sürümünü göndermek istedim.

Her tmux oturumunun bir dizi özel ortam değişkeni edinmesini sağlamak için, değerleri tmux'un oturum başına ortam değişkenlerine eklemeniz gerekir. İşte nasıl yapılacağına bir örnek.

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

FOO’nun açıkça dışa aktarılmasının son adımı, mevcut bölmenin çevre değişkenini alabilmesi için gereklidir. Bu tmux oturumu için oluşturduğunuz herhangi bir bölme veya pencere FOO’yu devralacak, ancak diğer oturumlarda görünmeyecek.


0

djf'in açıklaması aklıma başka bir olası çözüm getiriyor:

Önce tmux/ screençalışıyor:

  1. Oturum aç.
  2. Bir örneğini başlatın ssh-agent.
  3. Bunun için ortam değişkenleri ile başlayın tmux/ .screenssh-agent

Bu, istemciye SSH iletmeyi kullanamadı, ancak istenmedi.


1
ssh-agentTTY'ye bağlanmadı, neden oturumu kapattığında (?) öldürülmeli - neden kullanıyor nohup?
poige

@poige Doğru.
Hauke ​​Laging
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.