Bash işlevi yalnızca parola manüel olarak girildiğinde çalışır


0

İşte her gün aşağıdaki işlevi çalıştırmam gerekiyor. Parola istendiğinde işlev iyi çalışıyor. Ancak her gün girmek zorunda kalmamak için şifremi zorlamaya çalıştım. Bu işe yaramıyor. Nedenle ilgili bir ipucu var mı?

function update()
{
  firewalluser=`whoami`
  # -s => silent (no echo of characters), -p => prompt user
  #read -s -p "Password: " firewallpass                                         
  firewallpass="mypassword"                                                     
  TRUSTED=(
    xxx.yyy.com
    jenkins.xxx.com
    svn.xxx.com
  )
  for server in ${TRUSTED[*]}
  do
    echo ""
    echo "--> connecting to $server"
    expect <<EOF                                                                
      set timeout 20                                                            
      spawn telnet $server                                                      
      expect "Username: "                                                       
      send "$firewalluser\r"                                                    
      expect "Password: "                                                       
      send "$firewallpass\r"                                                    
      expect "Firewall User Authentication: Accepted"                           
      send "exit"                                                               
      exit                                                                      
EOF                                                                             
  done
}

Bunu, içinde GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)tanımlanan işlevle çalıştırıyorum .bash_profile.

Şimdiden teşekkürler.

EDIT: Ekledim exp_internal 1ve işte programın cevabı:

--> connecting to some.domain.name.com
spawn telnet some.domain.name.com
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {64289}

expect: does "" (spawn_id exp7) match glob pattern "Username: "? no
Trying xx.yy.zz...

expect: does "Trying xx.yy.zz...\r\n" (spawn_id exp7) match glob pattern "Username: "? no
Connected to some.domain.name.com.
Escape character is '^]'.

expect: does "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\n" (spawn_id exp7) match glob pattern "Username: "? no
Please Authenticate to VSD DR2
Username:
expect: does "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\nPlease Authenticate to VSD DR2\r\nUsername: " (spawn_id exp7) match glob pa\
tern "Username: "? yes
expect: set expect_out(0,string) "Username: "
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\nPlease Authenticate to VSD DR2\r\nUsername: "
send: sending "nklosterman\r" to { exp7 }

expect: does "" (spawn_id exp7) match glob pattern "Password: "? no

Password:
expect: does "\r\nPassword: " (spawn_id exp7) match glob pattern "Password: "? yes
expect: set expect_out(0,string) "Password: "
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "\r\nPassword: "
send: sending "mypassword!\r" to { exp7 }

expect: does "" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no

Firewall User Authentication: Failed

expect: does "\nFirewall User Authentication: Failed\r\n" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no
Connection closed by foreign host.

expect: does "\nFirewall User Authentication: Failed\r\nConnection closed by foreign host.\r\n" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no
expect: read eof
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "\nFirewall User Authentication: Failed\r\nConnection closed by foreign host.\r\n"
send: sending "exit" to { exp7 send: spawn id exp7 not open
    while executing
    "send "exit""

Şifrenin eklenmiş olarak gönderildiğini görebiliyorum. Neden kabul etmediğinden emin değilim. Değişkeni ayarlamak yerine şifreyi heredoc'ta kodlamayı bile denedim ve bu işe yaramadı.


Genellikle parola istekleri standart G / Ç’den geçmez, bu nedenle giriş yönlendirilemez ve komutları echo password|suçalışmaz. expectProgramı bilmiyorum , ancak diğer programların iletişim kutularını G / Ç'lerini borulardan yönlendirerek okuyarak ve yazarak çalışıyor gibi görünüyor. İçinde ftpparolaları (düz metin olarak!) .netrcİlklendirme dosyasına koyabilirsiniz ve bunu kullanarak FTP aktarımlarını başarıyla otomatize ediyorum, ancak buna .telnetrcizin verdiğini de bilmiyorum .
AFH

Sorun şu ki expect, okuduğumdan itibaren şifreleri bu şekilde kullanabiliyor olmalı. Çalışmanızın BT sorumlusu / patronu, düz metinde saklanan şifreleri olduğu için mutlu mu?
Xen2050,

Daha exp_internal 1önce bekliyor komut dosyasına ekleyin set timeout. Bu ayrıntılı hata ayıklamayı etkinleştirir, böylece parolanın ne beklediğini görebilirsiniz.
glenn jackman,

@ Xen2050 Güvenlik konusunda, bunun ciddi bir güvenlik sorunu olduğuna katılıyorum. Ancak, bu yer şifreler atar ve iş arkadaşlarınızın şifrenizi kolayca tahmin edebilmesi için onları (!) Yeniden kullanır. Bu nedenle, bir betiğin içindeki düz metin şifresinin, endişelenecek boşlukların en küçüğü olduğunu düşünüyorum!
N Klosterman

Eklemek zorunda emin misiniz \riçinde send "$firewalluser\r"ve send "$firewallpassword\r"? Sadece gördüğüm diğer örneklerde send "$user "...
Hastur

Yanıtlar:


0

Newline sorunu vs satır başı gibi görünüyor.

Aktif terminaliniz uzak sistemle eşleşmiyor olabilir ve bazı otomatik çeviriler yanlış olabilir. Her iki sistemi de stty (1) komutunu kullanarak karşılaştırabilirsiniz .

Gönderen Expect belgelere:

Bu durumda, return tuşuna bastığınızda, yeni bir satıra çevrilecektir. Eğer Expect, terminalini ham moda (telnet gibi) ayarlayan bir programa geçerse, program gerçek bir geri dönüş beklediğinden, bir sorun çıkacaktır.

Yeni satırları manuel olarak geri dönüşlerle değiştirmek yerine, çözüm çeviriyi durduracak olan "stty raw" komutunu kullanmaktır. Bununla birlikte, bunun, pişmiş çizgi düzenleme özelliklerini artık alamayacağınız anlamına geldiğini unutmayın.

Kodunuzda \rile değiştirmeyi denemenizi öneririz \n. Bu hala işe yaramazsa, ikisinin \r\nde çalışması gerekebilir . Hala işe yaramazsa, her iki sistemin terminal modunu ve ileri geri giderken vagonların dönüşleri ve yeni hatlara olan sorunları gidermeniz gerekir.

Ayrıca, elbette doğru şifreleriniz olduğunu varsayalım! ;)

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.