我使用expect / spawn实现了一个shell,并从远程服务器向SCP文件发送命令,该服务器在需要时自动发送密码。
该脚本在UNIX终端上运行良好。
尽管如此,我试图通过C ++过程来使用这个脚本。它已被system()或甚至popen()函数调用而没有成功。 返回此错误:“ioctl(raw):I / O错误” 有人可以有任何线索吗?
这是我的剧本:
#!/bin/bash
targetHost=$1
password=$2
sourceFile=$3
destRep=$4
expect -c "
spawn /usr/bin/scp -q $targetHost:$sourceFile $destRep
expect -i $spawn_id {
"*password:*" { send -i $spawn_id $password\r\n; interact }
eof { exit }
}
exit
"
答案 0 :(得分:0)
我要尝试的第一件事是抛弃bash脚本(无论如何似乎都有引用问题)
#! /usr/bin/env expect -f
foreach {targetHost password sourceFile destRep} $argv break
spawn /usr/bin/scp -q $targetHost:$sourceFile $destRep
expect -i $spawn_id {
"*password:*" { send -i $spawn_id $password\r; interact }
eof { exit }
}
但真正的问题是stdio channels / pty如何被expect流程继承(我不确定这里是否有合适的术语)