Bir şeyler yapmak için başka bir makineye giriş yapan bir bash betiği nasıl yazılır?


11

Bir bash betiği yazmak mümkün mü

  1. A makinesinden başlatılır, farklı bir B makinesinde ssh ile oturum açar (her iki A ve B makinesi de Linux-Makineleri olacaktır),
  2. bazı dosyaları makineye B kopyalar
  3. bu makinelerde belirli bir python betiği çalıştırır.
  4. sonuçları makine A'ya geri aktarır
  5. B makinesinden çıkış yapar.

Bu teknik olarak yapılabilir mi?

Yanıtlar:


15

Tabii ki yapılabilir:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

ve bu kadar...

Ancak bir sorun var: sizden üç kez şifre istenecektir. Bundan kaçınmak için ssh anahtarları oluşturabilir ve kullanıcıları bu anahtarlarla yetkilendirebilirsiniz.

Ssh anahtarları çalıştırmak için ssh-keygen -t rsa, soruları yanıtlayın ve ortak anahtarı uzak ana bilgisayara (makine B) ~/.ssh/authorized_keysdosyaya kopyalayın . Özel anahtar ~/.ssh/id_rsayerel makineye (A) kaydedilmelidir.


Ortak anahtarlar bir seçenek değilse, şifre istemlerini en aza indirmek için kaba bir şey yapabilirsinizcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

Şifreyi kullanmak istiyorsunuz, her zaman tanımlayarak OpenSSH en Bağlantı havuzu kullanabilir ControlMaster=yesve ControlPath=/path/to/socketfileve sonra bir kez SSH bağlantısı başlatmak -fbir arka plan ssh çalıştırmak için. Sonraki tüm SSH bağlantılarına aynı yuva dosyasını kullanmasını söyleyin.
jsbillings

4

Her şeyi tek bir sshbağlantıda / oturumda yapmak mümkündür :

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Bu:

  1. Kopya local_srciçin remote_dst,
  2. Çalıştırır command,
  3. Kopya remote_srciçin local_dst.

Ama commandyazarsa stdout, sonuç da olur local_dst. Eğer commandgelen girişi okursa stdinve alır EOF.


3

Bunu tek bir ssh oturumunda yapabilmenize rağmen, dosyaları kopyalamayı çalışan komutlarla birleştirmek biraz zordur.

Bu görevi yerine getirmenin en kolay yolu, üç işlem için ayrı SSH oturumları çalıştırmaktır:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Bunun için machineB'ye üç kez kimlik doğrulaması yapılması gerekir. Birden çok kez kimlik doğrulamasından kaçınmanın önerilen yolu, bağlantı paylaşımı özelliğini OpenSSH'nin modern sürümlerinde kullanmaktır: B'ye bir kez ve herkes için bir ana bağlantı başlatın ve SSH'nin otomatik olarak bu ana bağlantıya geri dönmesine izin verin. Ekranınıza ControlMaster autobir ControlPathsatır ekleyin ve~/.ssh/config ardından arka planda bir ana bağlantı başlatın, ardından görevlerinizi gerçekleştirin.

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Dosyaları kopyalamak için scp veya rsync kullanmak yerine, uzak dosya sistemini SSHFS altında bağlamak daha kolay olabilir . Bu arada, bir ana bağlantı kurmaya özen ~/.ssh/configgösterecektir (yukarıda belirtildiği gibi ayarladığınızı varsayarak ).

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
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.