SSH komutu doğrudan çağrıldığında asılı, ama interaktif çalıştırdığınızda temiz çıkar

oy
1

Ben uzak makinedeki bir sunucuyu başlatmak ve sunucu işlemi üzerinde lsitening port numarasını almak gerekir. çağrılan, sunucu standart hataya bir rasgele liman ve çıkış portu numarasına dinleyecek.

Ben, uzak makineye oturum sürecinin başlatılması ve port numarasını almak sürecini otomatik hale getirmek istiyoruz. Ben adlı bir Python komut dosyası yazdı invokejob.pyBu gibi görünüyor, iş çağırır ve sonra port numarasını döndüren bir sarmalayıcı gibi davranmaya uzak makinede yaşıyor:

import re, subprocess
executable = ... # Name of executable
regex = ... # Regex to extract the port number from the output
p = subprocess.Popen(executable,
    bufsize=1, # line buffered
    stderr=subprocess.PIPE
    )
s = p.stderr.readline()
port = re.match(regex).groups()[0]
print port

Ben etkileşimli giriş yapıyorsanız, bu komut dosyası çalışır:

$ ssh remotehost.example.com
Last login: Thu Aug 28 17:31:18 2008 from localhost
$ ./invokejob.py
63409
$ exit
logout
Connection to remotehost.example.com closed.

(Not: Başarılı logout, o değil askıda).

Ben komut satırından çağırmak çalışırsanız Ancak, hemen kapatır:

$ ssh remotehost.example.com invokejob.py

ikinci durumda asılı neden bilen var mı ve ne bunu önlemek için ne yapabilirim?

Ben programın çıktısını almak gerektiğini unutmayın, bu yüzden sadece bayrak -f ssh kullanın veya standart çıktısını yönlendirmek olamaz.

Oluştur 28/08/2008 saat 20:48
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
3

s = p.stderr.readline()

Ben yukarıdaki çizgi şüpheli. Eğer ssh'dan doğrudan bir komut çağırmak zaman, tam pty (Linux varsayılarak) alamadım ve böylece hiçbir stderr okuma.

etkileşimli giriş yaptığınızda, stdin, stdout ve stderr sizin için ayarlanır ve böylece komut çalışır.

Cevap 28/08/2008 saat 20:53
kaynak kullanıcı

oy
0

Ne Şunları yaparsanız:

ssh <remote host> '<your command> ;<your regexp using awk or something>'

Örneğin

ssh <remote host> '<your program>; ps aux | awk \'/root/ {print $2}\''

Bu, yürütmek ve sonra herhangi bir kullanıcı kök veya açıklamasında kökü ile herhangi bir işlem için her PSID yazdırmak bağlanacaktır.

Ben uzak makinelerde komutların her türlü çalıştırmak için bu yöntemi kullandık. yakalamak Eğer tek tırnak işaretleri ( ') içinde yürütülecek ve bir noktalı virgülle her komutu ayırmak isteyen komutu (ler) sarılmasıdır (;).

Cevap 28/08/2008 saat 22:50
kaynak kullanıcı

oy
0

@Ben Collins

Sana Stderr bir sorun olma konusunda haklısın. Ben taleb () çağrı üzerine engelleyen eminim.

Sonunda, vazgeçti ve gelen pxssh modülünü kullanmaya karar pexpect SSH oturumu ile benim etkileşim otomatikleştirmek için.

@Misha M

Ne yazık ki, noktalı virgül hüner burada çalışmıyor: o bloklar programımı yürütme üzerinde.

Cevap 29/08/2008 saat 01:42
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more