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


我在下面回答了我自己的问题

您缺少一个
。还有一种更好的方式来匹配密码

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