Как заставить -c работать в одной строке, а не в скрипте - PullRequest
13 голосов
/ 30 июня 2010

Запуск:

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

Я ответил на свой вопрос ниже

Ответы [ 2 ]

11 голосов
/ 30 июля 2010

Понял: Следующий код удаляет файл с именем 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-доступ без пароля между двумя полями, но я хотел сделать это в одной командной строке, используя ожидаемое. Спасибо пушистому леденцу за вдохновение. Заметьте, что если вы запустите функцию -d -c "spawn ..., вы получите отличную отладку того, что происходит, включая то, достаточно ли хорош ваш regex

2 голосов
/ 29 июля 2010

Вам не хватает ; в первом однострочном примере в конце последней команды. И есть лучший способ сопоставления пароля с шаблоном.

попробуйте следующее:

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';"
...