2016-04-01 22 views
0

Uzak sunucudan (Box1) birinde oturum açmaya çalışıyorum ve uzaktaki bir dosyada bir dosya okumaya çalışıyorum (Kutu1). Başka bir sunucu (Kutu2) ayrıntılarını içerir, bu verilere dayanarak bazı veri sıkıştırma işlemleri için yerel sunucuya ve ssh başka bir sunucuya (Box2) geri gelmem gerekir. ve benzeri .....Unix sunucusunda değişkeni bildirme

ssh box1.com << EOF 
    if [[ ! -f /home/rakesh/tomar.log ]] 
    then 
    echo "LOG file not found" 
    else 
    echo " LOG file present" 
    export server_node1= `cat /home/rakesh/tomar.log` 
    fi 
    EOF 

    ssh box2.com << EOF 
    if [[ ! -f /home/rakesh/tomar.log ]] 
    then 
    echo "LOG file not found" 
    else 
    echo " LOG file present" 
    export server_node2= `cat /home/rakesh/tomar.log` 
    fi 
    EOF 

ama "server_node1" ve yerel makinede "server_node2" değerini almıyorum. Herhangi bir yardım için teşekkür ederiz.

+0

'[[! -F]] '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Bir dosyanın varlığını gerçekten kontrol ediyor ve sonra başka bir amaç için mi alıyorsunuz yoksa bu yanlışlardan mı? – tripleee

+0

ooops benim kötü! Eşyaların düzeltilmesi.Teşekkürler – rKSH

cevap

1

bash -c 'export foo=bar' gibi, bunu yazdığınız arama kabukta bir değişken bildiremezsiniz, bir ssh komutu çağıran kabukta bir değişken bildiremez. Çağıran kabuğun bilgiyi alması ve onunla ne yapılacağını bilmesi için refactor'a ihtiyacınız olacaktır.

Bir değişkendeki bir günlük dosyasının saklanmasının muhtemelen bir aklı başında, ya da en azından zarif bir şey yapmanın mümkün olmadığına katılıyorum, ama ne yapmak istediğinizi yapmanın kolay yolu, ödevin içine ssh koymaktır .

server_node1=$(ssh box1.com cat tomar.log) 
server_node2=$(ssh box2.com cat tomar.log) 

birkaç not ve amplifıkasyonlar:

  • uzak kabuk ana dizininizde çalışacak, bu yüzden (/home/rt9419 besbelli sizin ev dizini olduğunu varsayımına) çıkardı. cat komuta bir hata durumunda
  • , ssh çıkış kodu cat gelen hata kodu olacak ve echo oldukça gereksiz görünüyordu böylece standart hata üzerine hata mesajı, standart hata görünür olacaktır. (Özel bir ileti isterseniz, variable=$(ssh whatever) || echo "Custom message" >&2 bunu yapar. Standart hataya yeniden yönlendirme not edin; burada önemli görünmüyor, ama bu iyi bir biçimdir.)
  • Gerçekten yapmak isterseniz, rasgele bir karmaşık çalıştırabilirsiniz. ssh'da komut; Yukarıda belirtildiği gibi, burada gerekli görünmüyordu, ancak assigment=$(ssh remote 'if [[ things ]]; then for variable in $(complex commands to drive a loop); do : etc etc; done; fi; more </dev/null; exit "$variable"') veya herhangi bir şekilde yapabilirdiniz.ssh komut bile ran önce girişimde burada belgede orijinal denemede daha da yorumlandığı gibi

,

  • backticks sizin yerel kabuk tarafından değerlendirilecektir. Bunu nasıl düzelteceğinizle ilgili ayrı sorular var; bakınız örn. How have both local and remote variable inside an SSH command. fakat kısacası, yerel kabuğun, gönderdiğiniz komutları değiştirebilmeniz için kesinlikle gerekmediği sürece, muhtemelen yukarıdaki gibi aptal kompleksi ssh örneğinde yaptığım gibi, bunları tek tırnak içine koyun.
  • export işlevi, değişkenlerin alt süreçlerini görünür hale getirmesidir. Bir ana sürecin çevresini etkilemenin hiçbir yolu yoktur (yukarıdaki kodda olduğu gibi, değişime katkısı olmamak ve/veya değişimi koordine etmeksizin). Farkı göstermek için bir örnek olarak, PERL5LIB'u Perl kitaplıkları olan bir dizine ayarlarsanız, ancak export başarısız olursa, başlattığınız Perl işlemi değişkeni görmez; Sadece mevcut kabuk için görünür. export'u kullandığınızda, bu kabuğun alt öğesi olarak başladığınız Perl işlemi de bu değişkeni ve atadığınız değeri görecektir. Diğer bir deyişle, geçerli kabuk için özel olmayan export değişkenleri (ve export özel olanını değil; özel olduklarından emin olmalarının yanı sıra, işlemler arasında kopyalanması gereken bellek miktarını da azaltırsınız), ancak yine de onları sadece U * x işlem mimarisinin tasarımıyla çocuklara görünür kılar.
0

Bir scp ile box1 ve box2 dosyayı geri almalısınız:

scp box1.com:/home/rt9419/tomar.log ~/tomar1.log 
#then you can cat! 
export server_node1=`cat ~/tomar1.log` 

idem

scp box2.com:/home/rt9419/tomar.log ~/tomar2.log 
#then you can cat! 
export server_node2=`cat ~/tomar2.log` 
+0

Log dosyasının dosya isminin ;-) olduğunu sanmıyorum. Ayrıca, OP posteri günlük dosyasının * içeriğini * değişkenin içine saklamak istemektedir (ki bu gariptir, ama bize burada ne yaptığını bilmesini umalım). – user1934428

+0

Üzgünüm, bir kopyala/yapıştır sorunum vardı ve eksik 'cat's –

-1

box2 ile birkaç olasılık vardır. senin durumda, uzak sistemde size günlük dosyasının tüm içeriği istediğiniz bana neden acaba hangi yapar

echo "export server_node2='$(</home/rt9419/tomar.log)'" >>export_settings 

(örneğin, bu değişkenlerin atamaları içeren (bash sözdiziminde) Bir dosya oluşturabilir bir değişkende saklanır, ancak bu başka bir soru), daha sonra bu dosyayı sunucunuza aktarın (örneğin scp ile) ve bash komut dosyanızın içinden kaynaklayın.

+0

ekledim. O zaman neden günlük dosyasını doğrudan kopyalayıp oradan almıyorsun? Günlük dosyası herhangi bir yerde tek bir alıntı içeriyorsa, bu durum nedeniyle kırılır ve aksi halde çok kırılgan görünür. – tripleee