2016-03-27 20 views

cevap

1

Hayır, işe yaramayacağı için üzgünüm.

  1. ya buraya-doc içinde (printf'e) komut ikamesi değerini kullanın (EOF bettween hat):

    ssh [email protected]$serverAddress << EOF 
        printf 'output is %s\n' "$(ls -l /opt/logs)" 
    EOF 
    
  2. Yoksa SSH içinden komutun yakalama ve daha sonra kullanmak değer.

    outPut="$( 
        ssh [email protected]$serverAddress << EOF 
         cd /opt/logs 
         ls -l 
    EOF 
    )" 
    echo 'output is ' "$outPut" 
    echo "${outPut}" 
    

Seçenek 1 temizleyici görünüyor.

4

Aslında iki farklı sorun var. İlk olarak, burada bir belgenin içinde, değişken referanslar ve komut ikameleri, belgenin komuta gönderilmesinden önce kabuk tarafından değerlendirilir. Böylece, $(ls -l) ve $outPut yerel bilgisayardan, uzak bilgisayara (ssh aracılığıyla) gönderilmeden önce değerlendirilir. Bunu önlemek için ya $ s (ve uzak tarafa gönderilmesini istediğiniz çıkışlar gibi diğer bazı karakterler) veya belgede bu özelliği devre dışı bırakan tırnak işaretini (ssh [email protected]$serverAddress << "EOF") kapatarak önleyebilirsiniz. .

İkincisi, uzak bilgisayarda gerçekleşen değişken atamaları uzak bilgisayarda kalıyor. Yerel ve uzak kabukların durumu paylaşmasının bir yolu yok. Uzak bilgisayardan bilgi istiyorsanız, komut dosyasının uzak kısmından çıktı olarak geri göndermeniz ve çıktıyı (remoteOutput=$(ssh ...) veya ssh ... >"$tempFile" gibi bir şeyle) kaydetmeniz gerekir. Birden çok değer gönderiyorsanız, komut dosyasının uzak kısmı, çıktısını yerel bölümün ayrıştırabileceği şekilde biçimlendirmek zorunda kalacaktır. Ayrıca, uzak parçadan (hata mesajları dahil) başka herhangi bir çıktının karıştırılacağının farkında olun, böylece istediğiniz değerleri almak için dikkatlice ayrıştırmanız gerekir.