Я успешно выполнил следующую команду через php, но она работает только прямо. Если хост уже добавлен или какие-либо ожидания не совпадают, это означает, что он не работает. Может ли кто-нибудь предложить способ справиться с этим, даже если ожидания не совпадают, он должен перейти к следующему шагу?

shell_exec("expect -c 'spawn sudo su - root -c \"ssh-copy-id -i " . $host . "\"
            expect \"yes/no\"
            send \"yes\r\"
            expect \"password:\"
            send \"yyyy\r\"
            interact'");
2
Prabhu 25 Май 2015 в 13:25
Каким образом вы ожидаете обработки сценария сбоя?
 – 
Dinesh
25 Май 2015 в 14:04
1
Вы, вероятно, захотите expect eof вместо interact
 – 
glenn jackman
25 Май 2015 в 15:46

1 ответ

Лучший ответ

Используйте exp_continue, чтобы решить эту проблему.

"expect -c 'spawn sudo su - root -c \"ssh-copy-id -i " . $host . "\"
expect {
    \"yes/no\" {send \"yes\r\";exp_continue}
    \"password:\" {send \"yyyy\r\"}
}
interact'"

Если Expect увидит yes/no, отправит yes, то он продолжится снова; Если он увидит password, отправит пароль. После этого он перейдет к команде interact.

Примечание: как указал г-н Гленн, если вам действительно нужно работать с оболочкой, используйте interact. Поскольку вы выполняете это из php, лучше использовать только expect eof.

2
Dinesh 25 Май 2015 в 16:35