Soru Bir süre boyunca “akış” komutlarına nasıl kalıcı SSH bağlantısı oluşturabilirim?


Bir bilgisayarda SSH üzerinden komutları ağdaki başka bir bilgisayara (Linux çalıştıran her iki makineye) gönderen bir uygulama çalıştığımı varsayalım.

Örneğin # 1'de bir şey olduğunda her zaman # 2'de bir görev çalıştırmak istiyorum. Bu kurulumda, her komutta SSH bağlantısı oluşturmalıyım.

Özel istemci / sunucu uygulaması programlamadan basit unix araçları ile bunu yapmak için herhangi bir basit yolu var mı? Temel olarak tek istediğim SSH üzerinden bir bağlantı kurmak ve sonra birbiri ardına bir komut göndermek.


6
2017-12-25 22:55


Menşei




Cevaplar:


Üretimde kullanılıp kullanılamayacağından emin değilsiniz ama böyle bir şey yapabilirsiniz:

# 1 üzerinde dosya oluştur

1> dokunma / tmp / komutları

Ardından komutu çalıştırın:

1> kuyruk -f / tmp / komutları | ssh username@x.x.x.x

Bu, dosya / tmp / komutlarını açacak ve içeriğini x.x.x.x (# 2) sunucusuna göndermeye başlayacak ve orada satır satır çalıştıracaktır.

şimdi, her seferinde bir şey olduğunda her zaman:

1> echo "ls -l" >> / tmp / komutları

veya

1> echo "yeniden başlat" >> / tmp / komutları

dosya / tmp / komutlarına eklediğiniz her şey # 2'ye gönderilir ve çalıştırılır. Sadece etkileşimli bir şey yapmadığınızdan emin olun veya bir şekilde onunla ilgilenin.


7
2017-12-26 03:39



Tam olarak aradığım şey bu, çok yaratıcı bir çözüm :) - Jakub Arnold
Kullanman gerektiğini eklerim tail -F, dosyanın değiştirildiğini algılayacak, böylece dev olduğunda, onu silebilir ve yeni bir dosya ile baştan başlatabilirsiniz. - DerfK
@DerfK, alternatif olarak, mkfifo /tmp/commands daha iyi bir çözüm olmalı - solotim


OpenSSH Kullanarak Otomatik Kalıcılık

Ayrıca kullanabilirsiniz ControlMaster İlk bağlantı için bir unix alan soketi açan OpenSSH özelliği ve bu bağlantıyı sonraki tüm aramalarda yeniden kullanır.

Özelliği etkinleştirmek için kullanabilirsiniz -M komut satırı olarak geçiş veya etkinleştirin ControlMaster seçeneğiniz ~/.ssh/ssh_config, Örneğin.:

ControlMaster auto

Ek olarak, ControlPath aşağıdaki satırları kullanarak ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Bir ana bilgisayara kalıcı bir bağlantıyı korumak için, ör. ana makineye birçok ssh bağlantısı kurması gereken bir betiği çalıştırmak istiyorsanız, bunların hiçbiri komut dosyasının tüm kullanım ömrü boyunca devam ederse, aşağıdakileri kullanarak sessiz bir bağlantı kurabilirsiniz:

ssh -MNf remotehost

Görüşürüz nesono


15
2018-01-27 13:34



Cevabınızı sadece +1 oylama için sunucu hatası imzaladım. Seninki işe yaradı! - Karma
ssh -N uzak komut olmadan bir oturum başlatır, ssh_config'te karşılık gelen seçenek görünmez. - Jokester


İçinde /etc/ssh/ssh_config eklemek

# Send keep alive signal to remote sshd
ServerAliveInterval 60

2
2017-12-25 23:05





Bu tür bir şeye çok isabet ederseniz, deneyin Paralel. Dsh (dağınık kabuk) gibidir, ancak semaforları saymak gibi bazı temiz özellikleri vardır ve aktif olarak korunur.

Belgelerden:

ÖRNEK: Kuyruk sistemi / toplu iş yöneticisi olarak GNU Paralel

GNU Paralel, basit bir iş kuyruğu sistemi veya toplu iş yöneticisi olarak çalışabilir. Buradaki amaç, işleri bir dosyaya koymak ve GNU Paralel'in sürekli olarak okunmasını sağlamaktır. GNU Paralel dosya sonunda duracağından, okumaya devam etmek için kuyruk kullanırız:

echo >jobqueue; tail -f jobqueue | parallel

İşlerinizi sıraya göndermek için:

echo my_command my_arg >> jobqueue

İşleri uzak bilgisayarlara dağıtmak için elbette -S kullanabilirsiniz.

echo >jobqueue; tail -f jobqueue | parallel -S ..

Sadece yüzeyi çizen çok güzel örnekler var. İşte havalı bir tane.

ÖRNEK: İşi yerel ve uzak bilgisayarlara dağıtma

Yerel bilgisayar ve sunucu2'de işlemci çekirdeği başına bir işlem yürüten *.

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3

2
2017-12-26 12:16





evet bir boru ile mümkündür:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

Bu host2 komutunda echo "hi" komutunu çalıştıracaktır

sadece bir komut yazmanız yeterlidir, bu sadece komutları verir (unutmayın);


0
2017-12-25 23:04





Sadece bunu yapmak için yapılan dsh (Distributed SHell) gibi bir program kullanmak isteyebilirsiniz :), Host isimleri ile konfigüre ettikten ve publickeya auth ayarladıktan sonra, birden fazla makinede komutları çalıştırmak için kullanabilirsiniz. makinede bir sonra makine b ") veya pararell (" tüm makinelerde aynı anda çalıştırın ") çalıştırın. Veya sadece komut dosyası oluştur

#!/bin/sh
ssh machine -- $@
exec $@

0
2017-12-26 09:06





YASAL UYARI: Şu anda bunu test edemem, çünkü windows'lu bir makinede bash ama ssh'siz.

Bir bash komut dosyasında şöyle bir şey yapabilirsiniz:

exec 4> >(ssh --ssh-options-here user@host)

Ve sonra komutları göndermek için bunları FD 4'e yazın.

echo 'echo hi' >&4

Bu şekilde yaparsanız, komutların sonuçlarına kolayca erişemezsiniz, ancak sorunuza bağlı olarak, ihtiyacınız olduğu gibi görünmez.


0
2017-12-26 12:58