<?php
ini_set("expect.timeout", -1);
ini_set("expect.loguser", "Off");
$stream = expect_popen("ssh root@remotehost");
while (true) {
switch (expect_expectl ($stream, array (
array ("password:", PASSWORD), // SSH がパスワードを問い合わせます
array ("yes/no)?", YESNO), // SSH がホストエントリを保存するかどうかを問い合わせます
array ("~$ ", SHELL, EXP_EXACT), // シェルにたどり着きました!
))) {
case PASSWORD:
fwrite ($stream, "secret\n");
break;
case YESNO:
fwrite ($stream, "yes\n");
break;
case SHELL:
fwrite ($stream, "uname -a\n");
while (true) {
switch (expect_expectl ($stream, array (
array ("~$ ", SHELL, EXP_EXACT), // シェルにたどり着きました!
array ("^Linux.*$", UNAME, EXP_REGEXP), // uname -a の出力
), $match)) {
case UNAME:
$uname .= $match[0];
break;
case SHELL:
// アップデートの実行
if (strstr ($uname, "x86_64")) {
fwrite ($stream, "rpm -Uhv http://mirrorsite/somepath/some_64bit.rpm\n");
} else {
fwrite ($stream, "rpm -Uhv http://mirrorsite/somepath/some_32bit.rpm\n");
}
fwrite ($stream, "exit\n");
break 2;
case EXP_TIMEOUT:
case EXP_EOF:
break 2;
default:
die ("エラーが発生しました!\n");
}
}
break 2;
case EXP_TIMEOUT:
case EXP_EOF:
break 2;
default:
die ("エラーが発生しました!\n");
}
}
fclose ($stream);
?>