【shell】交互式自动化执行命令

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
相关推荐
打工仔折腾 AI7 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz7 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
‎ദ്ദിᵔ.˛.ᵔ₎7 小时前
关于Linux 线程局部存储的认识
linux·运维
GlobalInfo8 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
隔窗听雨眠9 小时前
KingbaseES平替全链路实践:从迁移评估到可持续运维
运维
skywalk81639 小时前
登到192.168.1.5那台机器,看看今天白天,大约从早晨到晚上,都卡住了。看看因为什么卡住,为什么卡住而没有杀死那个导致卡死的进程,为什么
运维·系统·freebsd
运维行者_9 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
晚风吹北巷11 小时前
Linux复习篇(自用)
linux·运维·服务器·1024程序员节
风哥2号12 小时前
数据库教程FGMT69:PostgreSQL运维诊断与监控分析
运维·数据库·postgresql
Harrison Ben12 小时前
(原创)SAP FI自动入账奥义:FBKP FBKA FBKF
运维·sap·sap fico·sap运维·sap 实施