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 "$ "\nRun 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 \nRun 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;\nRun Code Online (Sandbox Code Playgroud)\n\n这是我运行主脚本时终端检索到的内容:
\n\ncesar@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\nRun Code Online (Sandbox Code Playgroud)\n\n你可以帮帮我吗?
\n\n提前致谢。
\n\n更新:已解决!\n我在发送后休眠:
\n\nexpect "$ "\nsend -- "./telnetverison.sh \\r"\nsleep 400\nexpect "$ "\nRun Code Online (Sandbox Code Playgroud)\n\n但 400 秒还不够,具体取决于设备的数量。
\n\n还有其他想法吗?
\n在调用该脚本之前,关闭 Expect 的超时
set timeout -1
send -- "./telnetverison.sh \r"
expect "$ "
Run Code Online (Sandbox Code Playgroud)
调用sleepExpect 脚本会产生代码味道。