shell - 交互式自动化执行命令
遇到问题
sftp 登陆并传输文件时需要手动输入密码
如何解决
通过 expect 脚本模拟用户输入来与命令交互, 根据命令的输出提示, 来执行相应的操作, 来实现自动化
shell
#!/usr/bin/expect
set user "your_username"
set host "your_hostname"
set password "your_password"
set dir "/home/xxx"
set file "/home/xxx/aaa.txt"
# ssh 登陆并执行命令和 sftp 类似: spawn ssh $user@$host
spawn sftp $user@$host
expect "password:"
send "$password\r"
# 创建并移动到远程服务器指定目录
expect "sftp>"
send "mkdir $dir\r"
expect "sftp>"
send "cd $dir\r"
# 上传本地文件到远程服务器,并检查
expect "sftp>"
send "put $file\r"
expect "sftp>"
send "ls -l\r"
send "exit\r"
expect eof
知识点
- expect 给变量赋值用
set 变量名 "变量值"
- 获取今天 :
set today [clock format [clock seconds] -format %Y-%m-%d]
- 获取昨天 :
set yesterday [clock format [expr [clock seconds] - 86400] -format %Y-%m-%d]
- 获取输入参数 :
set arg1 [lindex $argv 0]
- 输出信息 :
puts "Today: $today, Yesterday: $yesterday, Param: $arg1"
- 获取今天 :
- 执行多个命令则需要写多对 expect 和 send, 一一对应
spwan "xxxx"
: 对远程服务器执行的命令expect "aaa"
: 遇到什么输出, 判断上次输入结果中是否包含指定的字符串, 只判断 spwan 启动的进程内的输出send "bbb\r"
: 执行什么操作, 例如遇到 aaa 的输出, 去执行对应的 bbb 操作
- expect 脚本调用方式 :
expect aaa.exp
延伸
- 判断远程服务器 b 中 c 文件是否存在
bash
if ssh user_b@ip_b test -e /root/c.file
then
echo "exists"
else
echo "not exists"
fi