Soru SSH oturumunda otomatik olarak tmux nasıl başlatılır?


SSH ile düzenli olarak bağlandığım on tane sunucu var. Her birinin yerel bilgisayarımda bir girişi var ~/.ssh/config dosya.

Internet bağlantım kaçınılmaz olarak düştüğünde, çalışan işlemimin kontrolünü kaybetmemek için her zaman bir tmux oturum, toplantı, celse. Her zaman bir SSH bağlantısı başlatıldığında tmux'un otomatik olarak bağlanmasını sağlamak istiyorum, bu yüzden her zaman yazmam gerekmiyor tmux attach || tmux new SSH’den sonra.

Ne yazık ki bu aslında umduğum kadar basit değil.

  • Herhangi bir komut eklemek istemiyorum ~/.bashrc sunucularda sadece yerel oturumlar değil, SSH oturumları için istiyorum.
  • Ekleme tmux attach || tmux new göre ~/.ssh/rc sunucularda sadece hatayla sonuçlanır not a terminal bağlantıdan sonra atılıyor, hatta RequestTTY force yerel SSH yapılandırma dosyasında bu sunucu için satıra seçenek eklenir.

41
2017-12-23 02:18


Menşei




Cevaplar:


Sunucu tarafı yapılandırması:

SSH (ve sadece SSH) üzerinden normal olarak oturum açtığınızda uzak sunucunuzda otomatik olarak tmux başlatmak için ~./bashrc Kullanıcıya veya uzak sunucudaki köke (veya her ikisine) uygun şekilde:

if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
    tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi

Bu komut, adında bir tmux oturumu oluşturur ssh_tmux Varsa, varolan bir oturuma bu adla yeniden bağlanır. Bağlantınızın düşmesi veya haftalar önce bir oturum açmış olmanız durumunda, her SSH girişi otomatik olarak sizi geride bıraktığınız tmux-ssh oturumuna geri getirir.

Müşterinizden bağlanın:

Özel bir şey yok, sadece ssh user@hostname.


38
2017-10-22 13:02



Bunu arıyordum, ayrıca bir süre önce kendinize çok benzeyen bir kod parçası kullandım, ancak oturum kullanıcı adıydı (değişiyordu) ssh_tmux için $USER) - Iacchus
Bu kabul edilenden çok daha iyi. Msys2 kullanıyorum çünkü istemci tarafını değiştirerek ssh, uzaktan kumandayı değiştirmek, iktidar çizgisi temasıyla sonuçlanacak olan TERM'in değişikliğinin farkına varamayacaktı. Tmux oturumu $ USER tarafından ayrılabilir başka bir iyi bir nokta. - Mithril
Moneytoo’ları görün Cevap faydalı yorum için $SSH_TTY vs $SSH_CONNECTION çok. - Mr. Tao


Tamam, çoğunlukla tatmin edici bir çözüm buldum. Benim yerel ~/.bashrc, Bir işlev yazdım:

function ssh () {/usr/bin/ssh -t $@ "tmux attach || tmux new";}

Temel olarak, ssh terminal işlevini yerleşik argüman programına verilen argümanlarla çağırmak için yazılır. "tmux attach || tmux new".

( $@ komut satırında sağlanan tüm argümanları belirtir, ssh -p 123 user@hostname genişletilmiş olacak ssh -t -p 123 user@hostname "tmux attach || tmux new")

( -t argüman eşdeğerdir RequestTTY Force ve tmux komutu için gereklidir.)


34
2017-12-23 05:56



Senin sürümü tmux destekler, kullanmayı düşünün tmux new -A foo hangi varolan bir oturuma eklenecek foo eğer mümkünse, gerekirse onu yaratın. Bu, işlevinizi basitleştirmenizi sağlar. /usr/bin/ssh -t "$@" tmux new -A (ve alıntı yapmak için emin olun $@!). - chepner
Not: düzenli olarak bağlandığınız makinelerin bazıları tmux yüklü değilse, söylemek isteyebilirsiniz. function ssht ya da benzerlerini kullanmaya devam edebilirsiniz ssh normalde. Aksi takdirde, sadece yazın /usr/bin/ssh tmux olmadan bir makineye bağlandığında komut isteminde - Alex Ryan
Tembelseniz sadece kullanabilirsiniz ssht size uzak tmux oturumlarına bağlanmak için. OS X kullanıcıları şunları yapabilir: demlemek ve Linux kullanıcıları bir paket oluşturabilir fpm Bununla Makefile ya da sadece kopyala ssht için ~/bin. - brejoc
Haha güzel! Bu bash one-liner Makefiles ve demlemek ile bir bütün Github repo sarmak için bana biraz overkill gibi görünüyor ve hey, daha kolay daha iyi! - Alex Ryan
çözüldü: ssh -t user@hostname "LANG=$LANG tmux attach || tmux new" - alecdwm


Açıklandığı gibi bu blog yazısı ssh ve sonra mevcut bir tmux oturumuna tek bir komutla ekleyebilirsiniz:

ssh hostname -t tmux attach -t 0

7
2018-04-09 08:02



Bu benim cevabımın ne yaptığı tmux attach || tmux new Böylece her bağlantı için yeni bir tmux oturumu oluşturulmaz). Zor kısmı, doğru komutun ssh -t user@host tmux attach || tmux new ve komut dizesinde bir argümana ihtiyaç duyan bir şeyi takmanın tek yolu, yukarıda yaptığım gibi yeni bir işlev oluşturmaktır. - Alex Ryan
Biliyorum, ama bazı insanlar (benim gibi) bir fonksiyonu tanımlamayı gerektirmeyen bir tek astarı tercih edebilirler. - Fabian Pedregosa
Bu, '0' adlı bir oturuma bağlanır. Yani, genel form ssh [hostname] -t tmux attach -t [sessionName] - David Doria
Bu benim için gerçekten iyi çalıştı .. Bu birlikte olacak unix.stackexchange.com/a/116674.. şimdi benim macun GUI böyle görünüyor .. imgur.com/uFhxN30. Cntrl + b + d ile oturumları kesebilirim. Çok basit ve kullanışlı .. - alpha_989


@Kingmeffisto'dan (bu cevabı yorumlamasına izin verilmiyor) satır kullandım ve bir çıkış ekledim, böylece tmux sonlandırılıyor ve ayrıca ssh bağlantısını sonlandırıyor. Ancak bu, SFTP oturumlarını kırdı, dolayısıyla kontrol etmem gerekti $SSH_TTY yerine $SSH_CONNECTION.

EDIT 4/2018: Etkileşimli terminal için test eklendi [[ $- =~ i ]] Ansible gibi araçların çalışmasına izin vermek için.

if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then
    tmux attach-session -t ssh || tmux new-session -s ssh
    exit
fi

7
2018-05-06 11:10





bağlayın:

ssh user@host -t "tmux new-session -s user || tmux attach-session -t user"

Seans sırasında:

kullanım Ctrl+d için oturumu bitir (tmux penceresi kapanır) veya Ctrl+b d için geçici ayrılma oturumu ve daha sonra tekrar bağlayın.

Hatırlamak! Sunucunuzun yeniden başlatılması oturumu kaybetti!

Tmux içinde olduğunuzda istediğiniz zaman kullanabilirsiniz Ctrl+b s Görmek oturum listesi ve akımı diğerine geçirin.

.Bashrc dosyanızı düzeltin:

Evrensel işlevi tanımlamanızı öneririm. .bashrc:

function tmux-connect {
    TERM=xterm-256color ssh -p ${3:-22} $1@$2 -t "tmux new-session -s $1 || tmux attach-session -t $1"
}

Kullanır 22 varsayılan olarak bağlantı noktası. Hızlı bağlantı takma adlarınızı da tanımlayın:

alias office-server='tmux-connect $USER 192.168.1.123'
alias cloud-server='tmux-connect root my.remote.vps.server.com 49281'

Şifre olmadan giriş:

Ve her seferinde parola yazmak istemiyorsanız .ssh anahtarları otomatik giriş:

ssh-keygen -t rsa
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa

Genel anahtarınızı uzak ana bilgisayara yerleştirin:

ssh-copy-id -p <port> user@hostname

Ek ipuçları:

Kullanmak isterseniz geçici oturum kimliği hangi yerel bir bash oturumu olarak kullanmak tmux İD:

SID=$USER-$BASHPID
ssh user@host -t "tmux new-session -s $SID || tmux attach-session -t $SID"

6
2017-09-28 07:48



Bunu önlemek için temiz bir numara || bazı kullanım durumlarında dahil etmek new-session içinde .tmux.conf ve sadece her zaman kullanın tmux a -t 0. - Dodekeract
Tmux'un daha yeni sürümlerinde de kullanabilirsiniz tmux new-session -A Varsa ekleyecektir aksi takdirde yeni bir tane yaratacaktır. - dragon788


byobu Tmux / ekran için güzel ve kullanışlı bir sarıcıdır. Varsa mevcut bir oturuma bağlanır veya yeni bir tane oluşturur.

Onu kullanıyorum autossh ssh oturumunu incelikle yeniden bağlar. Aralıklı bağlantı sorunları durumunda şiddetle tavsiye edilir.

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}

1
2018-03-18 20:40





Bunu yararlı bulabilir - ssh'i bir döngüde kullanır ve varolan bir tmux oturumuna yeniden bağlanır veya bağlantı kurar. Bir ağ kesintisinden sonra yeniden bağlantı yolu

#!/bin/bash
#
# reconnect to or spawn a new tmux session on the remote host via ssh.
# If the network connection is lost, ssh will reconnect after a small
# delay.
#

SSH_HOSTNAME=$1
TMUX_NAME=$2
PORT=$3

if [[ "$PORT" != "" ]]
then
    PORT="-p $PORT"
fi

if [ "$TMUX_NAME" = "" ]
then
    SSH_UNIQUE_ID_FILE="/tmp/.ssh-UNIQUE_ID.$LOGNAME"

    if [ -f $SSH_UNIQUE_ID_FILE ]
    then
        TMUX_NAME=`cat $SSH_UNIQUE_ID_FILE`
        TMUX_NAME=`expr $TMUX_NAME + $RANDOM % 100`
    else
        TMUX_NAME=`expr $RANDOM % 1024`
    fi

    echo $TMUX_NAME > $SSH_UNIQUE_ID_FILE

    TMUX_NAME="id$TMUX_NAME"
fi

echo Connecting to tmux $TMUX_NAME on hostname $SSH_HOSTNAME

SLEEP=0
while true; do

    ssh $PORT -o TCPKeepAlive=no -o ServerAliveInterval=15 -Y -X -C -t -o BatchMode=yes $SSH_HOSTNAME "tmux attach-session -t $TMUX_NAME || tmux -2 -u new-session -s $TMUX_NAME"
    SLEEP=10
    if [ $SLEEP -gt 0 ]
    then
        echo Reconnecting to session $TMUX_NAME on hostname $SSH_HOSTNAME in $SLEEP seconds
        sleep $SLEEP
    fi
done

1
2018-04-28 20:50