[内容] Shell spawn 参数的用法 (脚本根据出现的输出自动执行命令)

注意:

在使用 spawn 参数之前,要先安装 expect

内容:

内容一:set 参数

1.1 set 参数的作用

设置 expect 参数等待执行的时间 (默认是 30 秒) 或者其它变量

1.2 set 参数的案例

#!/bin/bash

set timeout 30

或者:

#!/usr/bin/expect

set timeout 30

(补充:这里以设置 expect 参数的等待时间为 30 秒为例)

内容二:spawn 参数

2.1 spawn 参数的作用

脚本开始根据出现的输出自动执行命令

2.2 spawn 参数的使用案例

#!/bin/bash

expect << EOF
spawn ssh mingyuzhu@10.0.0.1
expect "password:" {send "123\r"}
expect ">"         {send "\r"}
EOF

或者:

#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {"password:" {send "123\r"}}
expect eof

(补充:这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器,同时当输出的最后的字段是 “password:” 时自动输入 “123” 并回车为例)

内容三:expect 参数

3.1 expect 参数的作用

后面接预期出现的内容。可以跟 send 参数配合,实现出现预期内容后执行什么命令,也可以不跟 send 参数配合只是出现什么内容后直接退出

3.2 expect 参数的使用案例

3.2.1 expect 参数和 send 参数配合的使用案例 (出现预期内容后自动执行命令)
#!/bin/bash

expect << EOF
spawn ssh mingyuzhu@10.0.0.1
expect "password:" {send "123\r"}
expect ">"         {send "\r"}
EOF

或者:

#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {"password:" {send "123\r"}}
expect eof

(补充:这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器,同时当输出的最后的文本是 “password:” 时自动输入 “123” 并回车为例)

3.2.2 expect 参数不和 send 参数配合的使用案例 (出现什么内容后直接退出)
#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {
    \"Linux*\" { exit 200 }
    timeout { exit 100 }
    incorrect { exit 100 }
    eof { exit 100 }
}

return $?
interact

expect eof


补充:
1) 这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器
2) 同时当输出的最后的文本是以 “Linux” 开头时,返回值是 200,超市或其他的返回值是 100
3) 并最后将控制权还给用户为例

内容四:send 参数

4.1 send 参数的作用

后面接要执行的命令。当预期出现的内容出现后,执行这些命令

4.2 send 参数的使用案例

#!/bin/bash

expect << EOF
spawn ssh mingyuzhu@10.0.0.1
expect "password:" {send "123\r"}
expect ">"         {send "\r"}
EOF

或者:

#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {"password:" {send "123\r"}}
expect eof

(补充:这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器,同时当输出的最后的字段是 “password:” 时自动输入 “123” 并回车为例)

内容五:eof\EOF 参数

5.1 eof\EOF 参数的作用

代表结束所有,如果没有 EOF 的话最后的命令可能不会执行完

5.2 eof\EOF 参数的使用案例

#!/bin/bash

expect << EOF
spawn ssh mingyuzhu@10.0.0.1
expect "password:" {send "123\r"}
expect ">"         {send "\r"}
EOF

或者:

#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {"password:" {send "123\r"}}
expect eof

(补充:这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器,同时当输出的最后的字段是 “password:” 时自动输入 “123” 并回车为例)

内容六:interact 参数

6.1 interact 参数的作用

代表结束自动交互,就是把控制权交给用户

6.2 interact 参数的使用案例

#!/bin/bash

expect << EOF
spawn ssh mingyuzhu@10.0.0.1
expect "password:" {send "123\r"}
expect ">"         {send "\r"}
EOF

或者:

#!/usr/bin/expect

spawn ssh mingyuzhu@10.0.0.1
expect {"password:" {send "123\r"}}
expect eof

(补充:这里以使用 mingyuzhu 用户通过 SSH 登录 IP 地址为 10.0.0.1 的服务器,同时当输出的最后的字段是 “password:” 时自动输入 “123” 并回车为例)

[内容] Shell 脚本中 shift 的作用 (偏移位置变量的值)

内容一:shift 在 Shell 脚本中的作用

偏移位置变量,默认偏移 1 位,也就是说第 1 个位置变量的值会被第 2 个位置变量的值取代。
如果 shift 后面添加数字,则会直接偏移对应数字个位置。例如 shift 4 则代表直接偏移 4 个位置变量,此时第 1 个位置变量的值会被第 5 个位置变量的值取代。

(注意:shift 不能偏移成负数,且当剩下的位置变量数量不够 shift 偏移时,shift 则不会偏移)

内容二:shift 在 Shell 脚本中的案例

2.1 shift 在 Shell 脚本中的案例 (只偏移 1 位)

2.1.1 创建不偏移的只要还有位置变量就无限循环显示第 1 个位置变量的值的脚本
# vim test.sh

创建以下内容:

#!/bin/bash

while [ $# != 0 ];do
        echo $1
done
2.1.2 执行此脚本会发现此脚本在无线循环
. test.sh a1 b2 c3 d4 e5
a1
a1
a1
a1
a1
a1
......
2.1.3 创建偏移 1 位的只要还有位置变量就无限循环显示第 1 个位置变量的值的脚本
#!/bin/bash

while [ $# != 0 ];do
        echo $1
        shift
done
2.1.4 执行此脚本会发现此脚本的位置变量在发生变化
. test.sh a1 b2 c3 d4 e5
a1
b2
c3
d4
e5

2.2 shift 在 Shell 脚本中的案例 (偏移 5 位)

2.2.1 创建不偏移的只要还有位置变量就无限循环显示第 1 个位置变量的值的脚本
# vim test.sh

创建以下内容:

#!/bin/bash

while [ $# != 0 ];do
        echo $1
done
2.2.2 执行此脚本会发现此脚本在无线循环
. test.sh a1 b2 c3 d4 e5
a1
a1
a1
a1
a1
a1
......
2.2.3 创建偏移 5 位的只要还有位置变量就无限循环显示第 1 个位置变量的值的脚本
#!/bin/bash

while [ $# != 0 ];do
        echo $1
        shift 5
done
2.2.4 执行此脚本会发现此脚本的位置变量在发生变化
. test.sh a1 b2 c3 d4 e5
a1

[命令] Linux 命令 tput 的使用 (设置光标和文本的属性)

正文:

内容一:tput 的简单使用案例

1.1 使用案例一:清屏

# tput clear

1.2 显示当前命令行宽度

# tput cols

内容二:tput 的光标设置案例

2.1 使用案例二:让光标可见和不可见

2.1.1 让光标不可见
# tput civis
2.1.2 让光标可见
# tput cnorm

2.2 保存当前光标的位置

# tput sc

2.3 将光标条跳转到第某行的第某列

# tput cup 20 30

(补充:这里以将光标跳转到第 20 行的第 30 列为例)

2.4 显示输出结果

# tput rc

内容三:tput 的颜色设置案例

3.1 tput 的颜色设置选项

1) 0,黑色
2) 1,蓝色
3) 2,绿色
4) 3,青色
5) 4,红色
6) 5,洋红色
7) 6,黄色
8) 7,白色

3.2 tput 的颜色设置案例

3.2.1 设置字体颜色
# tput setaf 1

(补充:这里以把字体设置成蓝色为例)

3.2.2 设置背景颜色
# tput setab 4

(补充:这里以把背景设置成红色为例)

3.3.3 同时设置字体的颜色和背景的颜色
# tput setaf setab

(补充:这里以把字体设置成蓝色把背景设置成红色为例)

内容四:tput 的字体格式设置案例

4.1 设置字体加粗

# tput bold

4.2 设置字体有下划线

# tput underline

内容五:tput 的组合设置案例

5.1 在位置第某行的第某列输出信息

# tput sc ; tput cup 23 45 ; echo “Output this location is 23/45” ; tput rc


补充:
1) 这里的 tput sc 是保存当前的光标位置
2) 这里的 tput cup 23 45 是将光标移动到第 23 行的第 45 列
3) 这里的 echo “Output this location is 23/45” 是输出内容 “Output this location is 23/45”
4) 这里的 tput rc 是将光标回到刚刚保存的光标位置
5)这里以在第 23 行的第 45 列输出信息 “Output this location is 23/45” 为例

参考文献:

tput