如何让 Expect 等待另一个脚本完成

Ces*_*pez 3 scripting bash shell-script telnet expect

我有 3 个脚本,这是主要的:

\n\n
#!/usr/bin/expect -f\n#!/bin/sh\nset DATE [exec date +%F]\nset IP  "148.000.000.101"\nset Username "user" \nset Password "pass"\nset Password_sql "sqlpass"\nspawn ssh -p 22 mycomputer@localhost\nexpect "*?"\nsend "yes\\r"\nexpect "password: "\nsend "passlocal\\r"\nexpect "$ "\nsend "telnet $IP\\r"\nexpect "Username:"\nsend "$Username\\r"\nexpect "Password: "\nsend "$Password\\r"\nexpect "*>"\nsend "show cdp neighbors detail\\r"\nlog_file -noappend CDPdet.dat;\nexpect -ex "--More--" {send -- " "; exp_continue}\nexpect "*>"\nlog_file;\nexpect "*>"\nsend "exit\\r"\nexpect "$ "\nsend -- "awk \'/Device ID|IP address|Interface|Port ID/ { print }\' CDPdet.dat >tabladetallada.dat\\r"\nexpect "$ "\nsend -- "sed \'s/--More--\xe2\x90\xa3*//\' tabladetallada.dat>tabladetallada2.dat \\r"\nexpect "$ "\nsend -- "sed -i \'$ s/.$//\' Disptelnet.dat\\r"\nexpect "$ "\nsend -- " echo \\"\\nIP address: $IP\\" >>Disptelnet.dat\\r"\nexpect "$ "\nsend -- "dos2unix Disptelnet.dat \\r"\nexpect "$ "\nsend -- "dos2unix dispositivos.dat \\r"\nexpect "$ "\nsend -- "awk \'\\r    BEGIN {\\r        RS = \\"\\\\n\\\\n\\"\\r        FS = \\"\\\\n\\"\\r        OFS = \\",\\"\\r        print \\"device_id,ip_address\\"\\r    }\\r    {\\r        for(i=1; i<=NF; i++) {\\r            split(\\$i, a, \\":\\");\\r            k\\[a\\[1\\]\\] = a\\[2\\]\\r        }\\r            print k\\[\\"Device ID\\"\\], k\\[\\"IP address\\"\\]\\r\\r    }\' dispositivos.dat>dispositivoss.csv \\r"\nexpect "$ "\nsend -- "./telnetverison.sh \\r"\nexpect "$ "\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切顺利,但是当 ./telnetverison.sh 运行时,主脚本不会等到“telnetverison.sh”完成。

\n\n

我已经单独测试了 telnetverison.sh 并且它工作正常,这是代码:

\n\n
#!/bin/bash\n\nFILE1=dispositivoss.csv\nset Username "user" \nset Password "pass"\n\n\nNUMERODISP="$(wc -l $FILE1 | awk \'{print $1}\')"\n\n# echo "$NUMERODISP"\n\nnum=3\nIP="$(awk -vnum="$num" \'NR == num { print $NF }\' dispositivoss.csv)"\n\n#echo "$IP"\n\n\nfor i in `seq 2 $NUMERODISP`;\n        do\n    IP="$(awk -vnum="$i" \'NR == num { print $NF }\' dispositivoss.csv)"\n    expect -f conexionindividual.expect $IP $i\n    done    \n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,此代码中嵌套了另一个脚本,以防万一这是 conexionindividual.expect\ 的代码:

\n\n
#!/usr/bin/expect -f\nset Username "user" \nset Password "pass"\nset IP   [lindex $argv 0];\nset i [lindex $argv 1];\nspawn ssh -p 22 mycomputer@localhost\nexpect "*?"\nsend "yes\\r"\nexpect "password: "\nsend "mypass\\r"\nexpect "$ "\nsend "telnet $IP\\r"\nexpect "Username:"\nsend "$Username\\r"\nexpect "Password: "\nsend "$Password\\r"\nexpect "*>"\nsend "show version\\r"\nlog_file -noappend SN_$IP.dat;\nexpect -ex "--More--" {send -- " "; exp_continue}\nexpect "*>"\nlog_file;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我运行主脚本时终端检索到的内容:

\n\n

cesar@cesar-HP-Pavilion-15-NoteBook-PC:~$ awk \'

\n\n
...\n>     BEGIN {                         #this is the last awk in the "main" script\n>         RS = "\\n\\n"\n./telnetverison.sh \n>         FS = "\\n"\n>         OFS = ","\n>         print "device_id,ip_address"\n>     }\n>     {\n>         for(i=1; i<=NF; i++) {\n>             split($i, a, ":");\n>             k[a[1]] = a[2]\n>         }\n>             print k["Device ID"], k["IP address"]\n> \n>     }\' dispositivos.dat>dispositivoss.csv \ncesar@cesar-HP-Pavilion-15-NoteBook-PC:~$ ./tecesar@cesar-HP-Pavilion-15-NoteBook-PC:~$  #here is the problem\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以帮帮我吗?

\n\n

提前致谢。

\n\n

更新:已解决!\n我在发送后休眠:

\n\n
expect "$ "\nsend -- "./telnetverison.sh \\r"\nsleep 400\nexpect "$ "\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 400 秒还不够,具体取决于设备的数量。

\n\n

还有其他想法吗?

\n

gle*_*man 5

在调用该脚本之前,关闭 Expect 的超时

set timeout -1
send -- "./telnetverison.sh \r"
expect "$ "
Run Code Online (Sandbox Code Playgroud)

调用sleepExpect 脚本会产生代码味道。