7

私は、Expect とスクリプティング全般に不慣れです。ネットワーク デバイスの構成をプルするときに、作業が少し楽になるように、いくつかのスクリプトを作成しようとしています。デバイスに SSH 接続するための基本的な Expect スクリプトを作成し、構成を保存することができました。

これを拡張して、スクリプトが現在の 1 つだけではなく、複数の IP アドレスに接続できるようにしたいと考えています。いくつかの異なる IP アドレスで名前が付けられたファイルがあり、list.txt各 IP アドレスは別の行にあります。

Expect スクリプトをこれらの IP アドレスのそれぞれに接続し、スクリプト内の残りのタスクも実行するには、何をする必要がありますか?

私がこれまでに持っているExpectスクリプトは次のとおりです。

#!/usr/bin/expect -f
# Tells interpreter where the expect program is located.  This may need adjusting according to
# your specific environment.  Type ' which expect ' (without quotes) at a command prompt
# to find where it is located on your system and adjust the following line accordingly.
#
#
# Use the built in telnet program to connect to an IP and port number
spawn ssh 192.168.1.4 -l admin
#
# The first thing we should see is a User Name prompt
#expect "login as:"
#
# Send a valid username to the device
#send "admin"
#
# The next thing we should see is a Password prompt
expect "Password:"
#
# Send a valid password to the device
send "password\n"
#
# If the device automatically assigns us to a privileged level after successful logon,
# then we should be at an enable prompt
expect "Last login:"
#
# Tell the device to turn off paging
#
# After each command issued at the enable prompt, we expect the enable prompt again to tell us the
# command has executed and is ready for another command
expect "admin@"
#
# Turn off the paging
send "set cli pager off\n"
#
# Show us the running configuration on the screen
send "show config running\n"
#
# Set the date.
set date [timestamp -format %C%y%m%d]
#
# Test output sent to file with a timestamp on end
#-noappend will create a new file if one already exists
log_file -noappend /home/test.cfg$date
#
expect "admin@"
#
# Exit out of the network device
send "exit\n"
#
# The interact command is part of the expect script, which tells the script to hand off control to the user.
# This will allow you to continue to stay in the device for issuing future commands, instead of just closing
# the session after finishing running all the commands.`enter code here`
interact

これを Bash スクリプトと統合する必要がありますか? その場合、ファイルの 1 行を読み取り、list.txtそれを IP アドレス/ホスト変数として使用してから、次の行を読み取って繰り返すことは可能ですか?

4

4 に答える 4

3

私はこれを行います(未テスト):

#!/usr/bin/expect -f

set logfile "/home/text.cfg[clock format [clock seconds] -format %Y%m%d]"
close [open $logfile w]         ;# truncate the logfile if it exists

set ip_file "list.txt"
set fid [open $ip_file r]

while {[gets $fid ip] != -1} {

    spawn ssh $ip -l admin
    expect "Password:"
    send "password\r"

    expect "admin@"
    send "set cli pager off\r"

    log_file $logfile
    send "show config running\r"

    expect "admin@"
    log_file 

    send "exit\r"
    expect eof

}
close $fid

ノート:

  • 簡潔にするためにすべてのコメントを削除しました
  • \rコマンドを実行するときに Enter キーを押すことをシミュレートするために使用しsendます。
  • 「show config running」出力のみをログに記録する必要があると想定しました
  • expect eof「exit」送信後に使用
于 2013-09-30T20:37:42.727 に答える
1

可能性としては、Expect スクリプトで IP アドレスをパラメーターとして渡すことができます。

set host_ip [lindex $argv 0]

次に、シェル スクリプトを作成し、Expect スクリプトをwhileループ内で呼び出します。

ips_file="list.txt"

while read line
do
    your_expect_script line
done < $ips_file
于 2014-07-01T07:02:53.840 に答える
0

またはset ip [gets stdin]、ユーザー入力からの IP アドレスに使用します。

例えば、

puts "Enter your IP address\n"
set ip [get stdin]

で使用しspawnます。ループを使用して複数の IP アドレスに対して同じことを行うことができます -

spawn ssh $ip -l admin
于 2015-03-17T09:15:03.213 に答える