web-dev-qa-db-ja.com

SSHのBash / Expectスクリプト

私は期待することとスクリプト一般に新しいです。ネットワークデバイスの構成を取得するときに、いくつかのスクリプトを作成して、作業を少し簡単にしようとしています。デバイスにSSHで接続して構成を保存するための基本的なexpectスクリプトを作成できました。

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

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

ここに私がこれまでに持っている期待スクリプトがあります:

#!/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 vaild password to the device
send "password\n"
#
#If the device automatically assigns us to a priviledged 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スクリプトと統合する必要がありますか?もしそうなら、list.txtファイルの1行を読み取り、それをIP/Host変数として使用し、次の行を読み取って繰り返すことは可能ですか?

7
minorix

私はこれをします(テストされていません):

#!/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

ノート:

  • 簡潔にするため、すべてのコメントを削除しました
  • 使用する \rsendコマンドを実行したときにEnterキーを押すことをシミュレートします。
  • 「show config running」の出力のみをログに記録したいと思いました。
  • 使用する expect eof「exit」を送信した後
3
glenn jackman

これは、この問題のPerlバージョンです。

インストール手順:cpan Expect

このスクリプトは、私のニーズに完全に対応しています。

パラメータ1:接続文字列(例:[email protected])パラメータ2:クリアテキストパスワードパラメータ3:実行するコマンド

#!/usr/bin/Perl
use strict;

use Expect;

my $timeout=1;

my $command="ssh ".$ARGV[0]." ".$ARGV[2];

#print " => $command\n";

my $exp = Expect->spawn($command) or die "Cannot spawn $command: $!\n";
$exp->raw_pty(1);

LOGIN:
$exp->expect($timeout,
        [ 'ogin: $' => sub {
                     $exp->send("luser\n");         
                     exp_continue; }
        ],
    [ 'yes\/no\)\?\s*$' => sub {
              $exp->send("yes\n");
              goto LOGIN;
              }
    ],
        [ 'assword:\s*$' => sub {
                      $exp->send($ARGV[1]."\n");
            #print "password send : ", $ARGV[1];
                      exp_continue; }
        ],
        '-re', qr'[#>:] $'
);
$exp->soft_close();
2
jmrenouard

可能性はあなたの期待スクリプトのパラメータとしてIPアドレスを渡すことです:

set Host_ip [lindex $argv 0]

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

ips_file="list.txt"

while read line
do
    your_expect_script line
done < $ips_file
1
andrade

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

例えば-

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

これをspawnで使用します。loop-spawnssh $ ip -l adminを使用して、複数のIPアドレスに対して同じことができます

0