複数のゲートウェイの構成を更新する必要があります...ファイルが2つあります。
ファイル1(ip.txt
):ゲートウェイのIPアドレスを保存します。 --->このファイルは毎月更新されます。
ファイル2(cmd.txt
):ゲートウェイの設定を変更するためのコマンドを保存します。 --->もやはり随時更新されます。
これまでにスクリプトが2つあります...
スクリプト 1 つまりscript1.sh
: デフォルトでは、script1 はゲートウェイ IP を読み取り、それを渡し、スクリプトがゲートウェイにログインすることを期待します。
#!/bin/sh
for device in `cat /home/ip.txt`;do
./step_3 $device;
done
2番目のスクリプト
#!/bin/expect -f
set IP [lindex $argv 0]
spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@$IP
expect "password: "
send "difficult123\r"
expect "GBU_0:"
send "su -\r"
expect "Password: "
send "verydifficult123\r"
expect "GBI_0:"
send "/17.1/bin/cli.exe\r"
expect "USERNAME : "
send "GOOR\r"
expect "PASSWORD : "
send "DIFFICULT123\r"
expect "] "
****************** POINT 1 - Only One Change command shown -- I have multiple commands here to insert-----
send "CHG-MEM:SEV=CRITICAL;\r"
expect "(Y/N) :"
send "Y\r"
expect "]"
******************** POINT 2
send "exit\r"
expect "0:~> "
send "exit\r"
expect "logout"
send "exit\r"
expect "closed"
expect eof
ポイント1と2に期待コマンドをハードコーディングすると、すべてが魅力のように動作します(複数のコマンドがあります)...ファイルからポイント1と2に期待コマンドを呼び出すにはどうすればよいですか?ユーザーがスクリプトに触れることなくコマンドファイルを更新して実行できるように、内部でコマンドをハードコーディングせずに別々のファイルに保存したいのですが、必要なスクリプト効果にIPを渡します。わかりました...わかりませんが、ファイルからも予想されるコマンドを渡すことができる場合。
答え1
TCL は、他のファイルからのコマンドを簡単に含めて実行できます。source(n)
たとえば、コマンドを使用すると、次のように話すことができます。
#!/usr/bin/env expect
package require Tcl 8.5
set IP [lindex $argv 0]
set include_file [lindex $argv 1]
# ... begin commands before here
catch {source $include_file} result options
if {[dict get $options -code] != 0} {
puts stderr "could not source $include_file: $result"
exit 1
}
# end commands after here ...
runner
インクルードファイルを持つには、1 つとして保存します。
$ cat runthese
puts a
puts b
puts c
$ expect runner 127.0.0.1 runthese
a
b
c
$
もちろん、runthese
含めるファイルや任意のファイルを必要に応じて持つようにsend
変更することもできます。expect