SSH ile bağlandıktan hemen sonra bir betiği nasıl çalıştırabilirim?


24

Bu soruyu sormaya başladım, ancak açıkken cevapladım. Bu soruyu göndereceğim, çözümümle takip edeceğim ve diğer olası çözümlere açık bırakacağım.

<backstory>

Ben bir tmux ve vim kullanıcısıyım. Uzak vim çalışmasını seviyorum, çünkü bir flash film bana bir çekirdek paniği verdiğinde Ubuntu geliştirme makineleriyle ilgili endişelenmek zorunda kalmıyorum. Tmux'u çalıştırmak, yeniden başlattıktan sonra açık dosyaların beni beklediği ve kaldığım yerden devam edebileceğim anlamına geliyor. Böyle bağlandığımda vm ile tmux oturumunda çalışırken sorun yaşadım:

ssh example.com -t 'tmux attach'

UTF-8 normalde bombardıman sırasında kırpılmayan ve sadece bir smokin oturumuna manuel olarak bağlanan kırpma sorunları veriyor.

</ backstory>

Bu yüzden ssh girişinde bir şey başlatmak için yeniden kullanılabilir bir yöntem istiyorum, bu benim geliştirme ortamım için gerekli olabilecek benim .zshrc(veya .bashrchala bash kullanıyorsanız) yapılandırdığım diğer şeyleri etkilemiyor. zaman zaman yerel olarak çok söylenen makinede çalışırken görünüyorum.

Yanıtlar:


13

Çalıştırdığınızda ssh example.com, ssh arka plan programı sizin için bir giriş kabuğu başlatır ve giriş kabuğu sizin ~/.profile(veya ~/.bash_profileveya ~/.zprofileveya ~/.logingiriş kabuğunuza bağlı olarak) okur . Uzaktan çalıştırılacak bir komut belirttiğinizde (var olsun veya olmasın -t), ssh arka plan programı normal bir kabuk başlatır, bu nedenle .profileokunmaz. Çözüm:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

Çoğu ssh daemon, dışındaki ortam değişkenlerini iletmeyi reddetmek için yapılandırılmıştır LC_*. Ssh daemon on example.comizin verirse, LC_*tmux'u otomatik olarak başlatmak için özel bir değişkeni kötüye kullanabilirsiniz - bunu içine ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

daha sonra LC_tmux_session= ssh example.comveya ile giriş yapın LC_tmux_session=session_name ssh example.com.

Bu cevap , ortam değişkenlerinin ssh üzerinden geçirilmesi hakkında daha fazla bilgiye sahip


Kullanmamamın ssh example.com -t 'tmux attach'nedeni ortamımı yüklerken sorun yaşadığı için değil; UTF-8 karakter ekranıyla ilgili sorunlar yaşadığım için; Geleneksel olarak bağlanırken bu sorun yoktur. Bu nedenle, bu soru SSH üzerinden bağlandıktan hemen sonra komut dosyalarını çalıştırma hakkındadır.
saat

Çözümünü yine de seviyorum. Zarif
49'da

@connrs: UTF-8'inizde siz çalıştığınızda bile sorun yaşıyor musunuz .profile? Sorunun, hedef makinede yanlış ayarlanmış olan yerel ayarlardan kaynaklandığını /etc/profileya da sizin .profiledüzelttiğinizi varsaydım . Yerel sorun muhtemelen daha fazla bilgi ile giderilebilir.
Gilles 'SO- kötülük olmayı'

Bunu test etmek için ofise geri dönmek istedim. Tamamen haklısın, / etc / profile kaynak eklemek uygun davranışı tetikliyor. Şimdi beni daha genel bir soru sormam için motive eden sorunu çözdünüz
saat

6

Eli Heady aşağıdaki açıklamalarda daha iyi bir öneride bulununcaya kadar PermitUserEnvironment yeskendinize bir ortam değişkeni koymanızı ve eklemenizi tavsiye etmiştim .~/.ssh/environment

.zlogin(Bash: .bash_profileetc.) dosyasını açın ve aşağıdakileri yazın:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

İlham alınan: Bir Linux kabuk betiğine giriş yapılmasını nasıl isteyebilirim?

.zloginDosyayı kullandığımı, ancak dosyanızı kullanabileceğinizi .zshrcancak dotfiles dosyamın düzenli kalmasını ve diğer bilgisayarlarda kullanabilmem için ayırdığını unutmayın.

Soruyu kendinize uygun bir şeyle değiştirin MY_SSH_CONNECTION="yes" tmux attachve o noktada kaçmak istediğinizle değiştirin .

Komutun tmux'a MY_SSH_CONNECTION="yes"geçmeden önce nasıl ayarlanacağına dikkat edin tmux attach, çünkü yukarıdaki aynı komut dosyasına erişecek ve yinelemeleri önleyecek bir kabuk açacaktır.


2
Potansiyel güvenlik etkileri nedeniyle, bazı ortamlarda PermitUserEnvironment kullanımı mümkün olmayacaktır. SSH, .zlogininizde $ SSH_LOGIN yerine kullanılabilecek $ SSH_CONNECTION değişkenini ayarlayarak ~ / .ssh / ortamını kullanma gereksinimini ortadan kaldırır. Böyle bir şey if [[ "$SSH_CONNECTION" != "" ]]yapmalı.
Eli Heady

3

Ben, bunu .bash_profile dosyalarıma ekliyorum:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Bu bana yeniden ekrana girmeyi veya ekran oturumu oluşturmayı iptal etmek için biraz zaman veriyor. 'Ssh system command' formatlarında (~ /.* profillerini çağırmaz) çalışmaz. İptal edersem yeniden takmak için bir kabuk işlevi ayarlanır.


Harika! Bunu yerine * bashrc koyarak ve sonra her yeni ekran penceresinde - .profile değiştirirken iyi çalıştı başardı f * başardı.
Hugo

0

Kaçmayı düşünebilirsin

ssh remotehost -t screen -DR

ve terminal oturumunuzu orada çalıştırın. Daha sonra ( ^A^D) 'ı çıkarabilir ve daha sonra yeniden bağlayabilirsiniz (farklı bir müşteriden de). Ekran etkileşimli terminal oturumlarını tutarken (isteğe bağlı olarak oturum açma kabukları da man screen(1) veya ^A?)


Sorumu söylediğim gibi, oturumlarımı yönetmek için GNU ekranı yerine tmux kullanıyorum. Ve yüklendiğinde -t 'tmux attach'normalde olmayan vim ile ilgili sorunlarım var. Bu yüzden asıl soru, komutların ekran / oturum yönetimi yerine ssh connect'de çalıştırılması ile ilgilidir.
Sorumu

Çok üzgünüm, tmux'dan bahsettin ama bu benim için bir şey ifade etmedi. Yine de yeni bir araçtan bahsettiğiniz için teşekkürler!
49'da

0

Özel olarak UTF-8 ile konuşmak için

SendEnv LANG

Ve yerel uçtaki $LANGgibi bir şeye ayarlanmıştır en_US.UTF-8ve uzak uçtaki sshd SendEnvdirektifinize izin verir ( AcceptEnviçinde sshd_config), diğer uçtaki smokin onurlandırmalıdır. Bir süre bu sorunu yaşadım ve sorun gidermek zordu.


0

Her bağlanışınızda çalışmasını istiyorsanız , uzaktaki makinenizin tmux attachaltına kolayca ekleyebilirsiniz ~/.profile.

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.