Bash: ожидаем + scp: проблема с несколькими файлами - PullRequest
2 голосов
/ 20 сентября 2011
function expect_password {
    expect -c "\
    set timeout 90
    set env(TERM)
    spawn $1
    expect \"password:\"
    send \"$password\r\"
    expect eof
  "
}

expect_password "scp /home/kit.ho/folder/file1 root@$IP:/usr/bin"

Выше expect_password отлично работает!

Однако я хочу передать несколько файлов в этот каталог, поэтому я попытался:

expect_password "scp /home/kit.ho/folder/* root@$IP:/usr/bin"

Но появляется ошибка:

/home/kit.ho/folder/*: No such file or directory
Killed by signal 1.

Кажется, что expect не распознает *. Как я могу передавать файлы таким образом? Возможно использование ответа rsync, но я не могу его использовать.

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Справочная страница ожидаемого сообщения говорит: «Если программа не может быть успешно создана из-за сбоя exec (2)», поэтому я предполагаю, что ожидающий использует exec для внутреннего использования. exec не вызывает никакую оболочку для расширения подстановочных знаков и подобной магии, что означает, что ваш ssh видит звездочку и не может с ней справиться. Вы пытались назвать свою оболочку явно как

expect_password "sh -c \"scp /home/kit.ho/folder/* root@$IP:/usr/bin\""

(может быть, вам нужно пропустить одинарные кавычки)?

редактировать: используйте \ "вместо '

1 голос
/ 20 сентября 2011

Expect является расширением Tcl, и Tcl изначально не говорит о глобализации оболочки-имени файла.Вместо того, чтобы использовать Tcl-решение с вашей платформой, попробуйте

set -- /home/kit.ho/folder/* 
expect_password "scp $* root@$IP:/usr/bin"

Файлы с пробелами не будут работать правильно с этим решением.

0 голосов
/ 20 сентября 2011

Разве вы не можете полностью забыть пароль и работать с открытыми ключами SSH?

...