Shell 如何让expect-c在单行而不是脚本中工作
运行:Shell 如何让expect-c在单行而不是脚本中工作,shell,command-line,scp,expect,Shell,Command Line,Scp,Expect,运行: my_machine~/opt/ams/data/ep/success$ expect -c "spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml; expect { '*password:*' { send 'ad'\r\n }}"
my_machine~/opt/ams/data/ep/success$ expect -c "spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml; expect { '*password:*' { send 'ad'\r\n }}"
似乎不起作用,因为我仍然需要密码
spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml
adaptive@10.10.12.17's password:
如果我按ascript运行,它运行正常
my_machine~/opt/ams/data/ep/success$ ./try.sh
spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml
adaptive@10.10.12.17's password:
xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml 100% 13MB 13.2MB/s 00:01
my_machine~/opt/ams/data/ep/success$ cat try.sh
#!/bin/bash
expect -c "
spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml
expect {
"*password:*" { send "ad"\r\n; interact }
eof { exit }
}
exit
"
my_machine~/opt/ams/data/ep/success$
我想在一行命令而不是脚本中运行它。有人有什么想法吗
提前谢谢
A
我在下面回答了我自己的问题您缺少一个
在最后一个命令末尾的第一个单行示例上的code>。还有一种更好的方式来匹配密码
spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml
adaptive@10.10.12.17's password:
请尝试以下操作:
expect -c "spawn /usr/bin/scp xmlEventLog_2010-03-22T14-28-36_PFS_1_2.xml adaptive@10.10.12.17:/opt/ams/epf_3_4/xmlEventLog_2010-03-22T14-28-36_PFS_1277900174_2.xml; expect -re \".*password.*\"; send 'ad\r\n';"
明白了:
下面的代码将一个名为Sean_Lilly.zip的文件从我的文件箱切换到另一个文件箱,而无需输入密码:
expect -c "spawn /usr/bin/scp Sean_Lilly.zip adaptive@10.10.12.17:/opt/ams/epf_3_4/Sean_Lilly.zip; sleep 5; expect -re \"password\"; send \"ad\r\n\"; set timeout -1; expect -re \"100%\";"
我知道这可以通过在两个框之间设置无密码ssh访问来实现,但我想使用expect在一个命令行中实现。谢谢fuzzy棒棒糖的灵感。如果运行expect-d-c,请注意“繁殖。。。您可以对正在发生的事情进行出色的调试,包括您的正则表达式是否足够好,这可能是一些无声的失败,例如错误的密码或其他类似的想法。当您运行该命令时,它会打印出它使用的繁殖。我将spawn复制到shell中,并如上所述提供密码,然后手动运行。如果模式匹配正确,它似乎不会将密码几乎发送到那里。。。问题是,在发送密码后。。。expect脚本退出,只需在末尾添加一个额外的“expect eof”,您就可以了。在OS X上,仅将\r\n
替换为\r
。