2012-11-02 161 views
1

我有以下期望腳本來自動化Ubuntu上的SSH密鑰生成。腳本按預期運行,並生成密鑰對,但需要50-60秒才能完成。這是我在空箱子上所期望的更多。速度期望腳本

#!/usr/bin/expect -- 
eval spawn /usr/bin/ssh-keygen -t rsa 

expect -re {Enter file in which to save the key (/root/.ssh/id_rsa): } 
send -- "\r" 

expect -re {Overwrite (y/n)? } 
send -- "y\r" 

expect -re {Enter passphrase (empty for no passphrase): } 
send -- "\r" 

expect -re {Enter same passphrase again:" } 
send -- "\r" 

puts "\nEnded expect script." 

任何提示或提示什麼改變?

編輯: 根據Niall Byrne的回答,我登陸了下面的期望腳本,它是快速處理第一次密鑰生成以及密鑰再生(覆蓋)的。

#!/usr/bin/expect -f 
set timeout -1 
spawn /usr/bin/ssh-keygen -t rsa 
expect { 
    "Enter file in which to save the key" {send -- "\r" ; exp_continue} 
    "Overwrite" {send -- "y\r" ; exp_continue} 
    "Enter passphrase (empty for no passphrase):" {send -- "\r" ; exp_continue} 
    "Enter same passphrase again:" { send -- "\r" ; exp_continue} 
    eof 
} 
+1

你有沒有基準沒有腳本生成密鑰需要多長時間?我會在歸咎腳本之前驗證密鑰生成時間。 SSH密鑰需要一些時間來生成。 – mattc

+0

@mattc:這是5-6秒 – Doka

回答

4

我認爲你的延遲的主要來源是你不符合你的提示與Expect完全正確。

expect -re {Overwrite (y/n)? } 
send -- "y\r" 

在此處指定正則表達式語法(-re)期望模式中的許多字符都是保留的正則表達式字符,即。 ? ()。

這條線的真正效果是它會尋找一個匹配這條線10秒的正則表達式,然後放棄並繼續發送y。你基本上只是在發送'y'之前創建一個10秒的延遲。代碼中的其他行具有相似的特徵。

考慮修改這一行:

expect {Overwrite (y/n)?} 

expect -re {Overwrite.*} 

(這是除了關於熵的擔憂,但這一預期的問題是負責大部分你是延遲看。)

+0

謝謝,它的確有用,腳本現在在5-6秒內運行,這是可以的。儘管如此,「覆蓋」聲明仍然被忽略,密鑰不會被重新生成。 – Doka

2

您可能會遇到熵不足的問題。在生成密鑰時,密鑰生成器會使用系統熵/隨機數池(通常爲/ dev/random)。如果該框幾乎沒有負載,則隨機數池將被阻塞,直到收集到足夠的環境隨機信息(網絡流量,磁盤,鍵盤,鼠標和其他I/O設備的定時)。

+0

+1同意,這是腳本密鑰生成不是一個好主意的主要原因之一。熵越多越好。 – mattc

+0

@Yann Ramin:當我以交互方式運行'ssh-keygen -t rsa'時,它需要5-6秒 – Doka