expect脚本exec调用scp命令后无法自动发送密码输入指令如何解决?
你现有代码失效的核心原因是使用了exec执行scp命令,该命令会直接替换当前运行的expect进程,后续的密码匹配、发送逻辑完全没有执行机会,因此只能手动输入密码。
修正后可用的基础代码
#!/usr/bin/expect # spawn会启动scp子进程,允许expect捕获其输出、控制其输入 spawn scp pi@你的树莓派实际IP:/home/pic.jpg pic.jpg # 匹配密码输入提示 expect "*assword: " # 发送密码加回车完成输入 send "raspberry\r" # 等待scp传输完成、进程退出再结束脚本,避免传输中断 expect eof
常见场景适配说明
- 首次连接树莓派时,scp会弹出主机密钥确认提示,会导致密码匹配逻辑卡住,可以扩展匹配规则处理该场景:
#!/usr/bin/expect spawn scp pi@你的树莓派实际IP:/home/pic.jpg pic.jpg expect { "Are you sure you want to continue connecting (yes/no/[fingerprint])?" { send "yes\r" exp_continue } "*assword: " { send "raspberry\r" } } expect eof
- 也可以直接给scp添加参数跳过主机密钥校验,无需额外处理首次连接逻辑,只需把spawn行修改为:
spawn scp -o StrictHostKeyChecking=no pi@你的树莓派实际IP:/home/pic.jpg pic.jpg
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

