2013-10-16 7 views
7

मैं निम्न सिंटैक्स का उपयोग कर रहा है ताकि पासवर्ड क्वेरी के बिना की मेजबानी के लिए बाद में लॉग इन करने में सक्षम हो, एक की मेजबानी के लिए एक सार्वजनिक कुंजी कॉपी करने के लिए: जिसमेंकिसी होस्ट को सार्वजनिक कुंजी की प्रतिलिपि बनाने के लिए 'उम्मीद' का उपयोग कैसे करें?

ssh-copy-id $hostname 

$hostname साथ प्रणाली के होस्ट नाम है उपयोगकर्ता नाम, उदाहरण के लिए [email protected]। है

The authenticity of host 'xxx (xxx)' can't be established. 
RSA key fingerprint is xxx. 
Are you sure you want to continue connecting (yes/no)? 

मैं expect के साथ मेरी समस्या को हल करने की कोशिश की, और यहाँ क्या मैं अब तक सभी टिप्पणियों के साथ है (: प्रकार की अतिरिक्त बातचीत - हालांकि, इस आदेश को कम से कम एक पासवर्ड क्वेरी की आवश्यकता है और - कभी कभी और सुझावों को शामिल किया):

#!/usr/bin/expect 
set timeout 9 
set hostname  [lindex $argv 0] 

spawn ssh-copy-id $hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 

    "*re you sure you want to continue connecting" { 
    send "yes\r" 
    exp_continue  
    } 
    "*assword*" { 
    send "fg4,57e4h\r" 
    } 

} 

यह अब तक काम करता है के रूप में यह 'कैच' पहली मुलाकात को सही ढंग से नहीं, बल्कि एक दूसरे के। ऐसा लगता है कि सही पासवर्ड (fg4,57e4h) का उपयोग किया जा रहा है, लेकिन जब मैं मेजबान मशीन में लॉग इन करने का प्रयास करता हूं, तब भी मुझे पासवर्ड के लिए कहा जाता है। मैंने यह भी जांच की कि .ssh/authorized_hosts में कोई प्रविष्टि नहीं की गई है। इस्तेमाल किया पासवर्ड भी बिल्कुल सही है, क्योंकि मैं इसे सिर्फ लॉग-इन में कॉपी और पेस्ट कर सकता हूं। स्क्रिप्ट किसी भी त्रुटि बनाने नहीं है, लेकिन पैदा करता है निम्नलिखित exp_internal 1 उत्पादन:

./expect_keygen XXX 
spawn ssh-copy-id XXX 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {3602} 

expect: does "" (spawn_id exp6) match glob pattern "*re you sure you want to continue connecting"? no 
"*assword*"? no 
XXX's password: 
expect: does "XXX's password: " (spawn_id exp6) match glob pattern "*re you sure you want to continue connecting"? no 
"*assword*"? yes 
expect: set expect_out(0,string) "XXX's password: " 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) "XXX's password: " 
send: sending "fg4,57e4h\r" to { exp6 } 

हालांकि मैं न tcl हूँ और न ही विशेषज्ञ उम्मीद करते हैं, यह उम्मीद लगती है ssh-copy-id आदेश करने के लिए सही स्ट्रिंग (यानी, पासवर्ड) भेजता है। लेकिन फिर भी, एक समस्या होनी चाहिए क्योंकि ऊपर की उम्मीद कमांड होस्ट की सार्वजनिक कुंजी की प्रतिलिपि नहीं है।

+1

आप ['ssh-copy-id'] (http://man.cx/ssh-copy-id) का उपयोग क्यों नहीं करते? यही वह है। –

+0

यह कार्य को सरल बनाता है; लेकिन क्या यह मेरे कोड स्निपेट के साथ बदले बिना काम करेगा? वैकल्पिक हां/नहीं प्रश्न के बारे में क्या, यह भी संभाला जाएगा (मैं अभी जांच नहीं कर सकता)। – Alex

+0

स्क्रिप्ट के अंत में प्रॉम्प्ट की अपेक्षा करने का प्रयास करें। आपकी स्क्रिप्ट में, पासवर्ड भेजने के बाद उत्पन्न प्रक्रिया सही हो जाएगी, और पूरी एसएसएच-आईडी-कॉपी प्रक्रिया पूरी होने की गारंटी नहीं है। – asdone

उत्तर

0

मैं अपनी टीसीएल/उम्मीद स्क्रिप्ट साझा करना चाहता हूं। यह काफी अच्छी तरह से काम करता है।

#!/usr/bin/env tclsh 

package require Expect 

set prompt {[$❯#] } 
set keyfile "~/.ssh/id_rsa.pub" 
set needcopy 0 

if {![file exists $keyfile]} { 
    spawn ssh-keygen 
    interact 
} 

spawn ssh $argv 

expect { 
    {continue connecting (yes/no)?} { 
     send "yes\r" 
     exp_continue 
    } 
    {[Pp]ass*: } { 
     set needcopy 1 
     interact "\r" { 
      send "\r" 
      exp_continue 
     } 
    } 
    $prompt 
} 

if {$needcopy} { 
    set fd [open $keyfile] 
    gets $fd pubkey 
    close $fd 
    send " mkdir -p ~/.ssh\r" 
    expect $prompt 
    send " cat >> ~/.ssh/authorized_keys <<EOF\r$pubkey\rEOF\r" 
    expect $prompt 
} 
interact 
+0

वाह मैंने 4 साल पहले उस प्रश्न से पूछा था। – Alex

+0

और फिर भी आपने एक जवाब स्वीकार नहीं किया: 3 – Amos

+0

ओह लड़का! मैंने बीच में कई कंपनियों को बदल दिया। मैं एक जवाब स्वीकार करने के लिए देखूंगा ;-) – Alex

1

आप जो त्रुटियां देख रहे हैं, वे spawn परिणाम को निष्पादित करने के लिए खोल का उपयोग नहीं कर रहे हैं। आप खोल नियंत्रण वर्ण चाहते हैं, आप एक खोल अंडे देने के लिए की जरूरत है:

spawn sh -c "cat $home/.ssh/id_rsa.pub | ssh $hostname 'cat >> $home/.ssh/authorized_keys'" 

हालांकि, मुझे लगता है कि ssh-copy-id आप एक ही प्रश्न पूछे जाएंगे, तो यह एक ड्रॉप-में प्रतिस्थापन किया जाना चाहिए:

spawn ssh-copy-id $hostname 

आप या नहीं देख सकते हैं सकता है शीघ्र "कनेक्ट करना जारी रखने", आप एक नेस्ट के साथ उम्मीद की जरूरत है exp_continue

spawn ssh-copy-id $hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 

    "*re you sure you want to continue connecting" { 
     send "yes\r" 
     exp_continue 
    } 
    "*assword*" { 
     send "mysecretpassword\r" 
    } 
} 
+0

आपका सुझाव काम नहीं करता है। मैंने 'spshn' कमांड को 'ssh-copy-id' का उपयोग करने के लिए प्रतिस्थापित किया, लेकिन 'स्क्रिप्ट स्क्रिप्ट पासवर्ड मांगती है। शायद यह रेगेक्स है? शायद यह है कि 'उम्मीद' 'हां/नहीं' प्रश्न देखने के लिए प्रतीक्षा करें जो नहीं आ रहा है ...? – Alex

+0

अपनी स्क्रिप्ट के शीर्ष पर 'exp_internal 1' जोड़ें और उम्मीद आपको बताएगी कि क्या हो रहा है। –

+0

मैंने क्या सोचा था: उम्मीद है कि एक पैटर्न के लिए प्रतीक्षा करें '* आप सुनिश्चित हैं कि आप कनेक्ट करना जारी रखना चाहते हैं'। यह पैटर्न हमेशा नहीं होता है। यह विभिन्न कारकों के आधार पर हो सकता है या नहीं हो सकता है। स्क्रिप्ट को शीर्ष की आवश्यकता होती है, ताकि यह केवल 'पासवर्ड संकेत' या हां/कोई प्रॉम्प्ट और पासवर्ड प्रॉम्प्ट की अपेक्षा न करे। यह कैसे ठीक से हासिल किया जा सकता है? – Alex

4

सामान्य परिस्थितियों में एसएसएच टूलचेन टर्मिनल से पासवर्ड पूछता है, न कि स्टडीन से। आप अपने पासवर्ड को धक्का देने के लिए provide custom SSH_ASKPASS program कर सकते हैं।

एक साधारण स्क्रिप्ट पूछताछ बनाएं।श:

chmod a+x askpass.sh 
export SSH_ASKPASS=askpass.sh 

अंत में ssh-प्रति-आईडी को चलाने के (बिना उम्मीद):

#!/bin/sh 
echo $PASSWORD 

तो यह कॉन्फ़िगर ssh में प्रयोग की जाने वाली

export DISPLAY=:0 
PASSWORD=mySecurePassword setsid ssh-copy-id -o StrictHostKeyChecking=no hishost.thatwas.secure.com 

setsid टर्मिनल से अलग हो जाता है (ssh फिर घबराएंगे और पूछे जाने वाले कार्यक्रम की तलाश करेंगे) डिस्प्ले को एसएसएच द्वारा भी चेक किया जाता है (ऐसा लगता है कि आपका पूछताछ एक जीयूआई है)

ध्यान दें कि इस दृष्टिकोण के साथ छिपी हुई सुरक्षा भेद्यताएं हो सकती हैं।

0

यदि expect के साथ आपका दृष्टिकोण विफल रहता है, तो भी आप sshpass को आजमा सकते हैं।

2

यह आपकी समस्या को ठीक करना चाहिए।

#!/usr/bin/expect 
set timeout 9 
set hostname  [lindex $argv 0] 

spawn ssh-copy-id $hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 

    "*re you sure you want to continue connecting" { 
     send "yes\r" 
     exp_continue  
    } 
    "*assword*" { 
     send "fg4,57e4h\r" 
     interact 
     exit 0 
    } 
} 
+0

देखें आप अपने द्वारा किए गए परिवर्तनों को इंगित कर सकते हैं। – Zereges

+0

इसे नजरअंदाज करना, बातचीत करना और बाहर निकलना 0 "* assword *" stanza में जोड़ा गया है। –

संबंधित मुद्दे

 संबंधित मुद्दे