Сценарий Expect Tcl — ошибка при передаче аргумента в кавычках с использованием spawn

Я только что написал очень простой сценарий Expect для переноса rsync, но, похоже, это доставляет мне проблемы. По сути, я автоматизирую приглашение входа в SSH, вызываемое из rsync. Я также должен передавать аргументы через rsync в SSH, чтобы он не выполнял проверку ключа хоста. Я хорошо знаком с ключами аутентификации SSH и ssh-keygen, но у меня есть веские причины поступать таким образом, поэтому никаких лекций о передаче паролей в командной строке.

Скрипт


#!/usr/local/bin/expect -f

if {$argc != 5} {
  puts "usage: remoteCopy {remotehost, username, password, localfile, remoteloc}"
  exit 1
}

set remotehost [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set localfile [lindex $argv 3]
set remoteloc [lindex $argv 4]

set timeout -1

spawn rsync -e \"ssh -q -o StrictHostKeyChecking=no\" $localfile $username@$remotehost:$remoteloc
expect "Password"; send "$password\r"

Вот полный вывод скрипта:

Выход


avoelker@localhost  $ ./remoteFileCopy.tcl remotehost remoteuser remotepass ~/localfile /tmp/
spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" /localhost/home/avoelker/localfile remoteuser@remotehost:/tmp/
rsync: Failed to exec "ssh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(83)
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(434)
send: spawn id exp6 not open
    while executing
"send "$password\r""
    (file "./remoteFileCopy.tcl" line 17)
avoelker@localhost  $

Мне кажется, что rsync пытается выполнить "ssh, а не только ssh, однако копирование и вставка первой строки вывода из стандартного вывода Expect (rsync -e "ssh -q -o StrictHostKeyChecking=no" /localhost/home/avoelker/localfile remoteuser@remotehost:/tmp/) непосредственно в оболочку работает отлично, поэтому я знаю, что это не проблема с rsync.

Когда я полностью удаляю аргумент -e из строки spawn rsync, сценарий Expect выполняется без ошибок, но мне пришлось бы добавить проверку ключа хоста в сценарий, чего я не хочу делать.

Кто-нибудь, более опытный в Expect/Tcl, знает, что я делаю неправильно?


person Abe Voelker    schedule 26.09.2010    source источник


Ответы (1)


Отбросьте обратную косую черту. Строка spawn должна просто говорить:

spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" $localfile $username@$remotehost:$remoteloc

В конце концов, вы же не хотите, чтобы rsync увидел команду с кавычками, не так ли?

person Daniel Martin    schedule 26.09.2010
comment
Вау, я мог бы поклясться, что это было первое, что я попробовал. В любом случае, теперь это работает! Спасибо - person Abe Voelker; 26.09.2010
comment
AbeVoelker, я рекомендую вам также проверить правописание. В зависимости от конфигурации вашего хоста, например, expect Password может работать большую часть времени, в то время как expect Password: дает более детерминированное правильное поведение. Хуже того, это приглашение может потребоваться изменить с целевой машины на целевую машину. - person Cameron Laird; 30.09.2010