Вы можете помочь в отладке expect
, добавив опцию -d
. В вашем примере вы увидите, что вы делаете "...send "\r"..."
, который оценивается оболочкой как ...send r...
, потому что \r
сам по себе вне двойных кавычек. Попробуйте изменить это на send \"\r\"
, как и в других случаях. Вам также нужно поставить аналогичный возврат каретки -в конце каждой отправки:send \"root\r\"
.
Было бы чище написать небольшой файл сценария оболочки или использовать одинарные кавычки, преобразуя их в двойные для ${1:-0}
, которые нуждаются в интерполяции:
expect -c 'spawn screen /dev/ttyS'"${1:-0} ${2:-115200}"'; send \r; expect " login: ";...'
Этот полный скрипт (без использования оболочки )также имеет дело с уже зарегистрированным случаем:
#!/bin/expect --
set tty 0
set baud 115200
if { $argc >= 1 } {
set tty [lindex $argv 0]
}
if { $argc >= 2 } {
set baud [lindex $argv 1]
}
spawn screen /dev/ttyS$tty $baud
send \r
expect {
"login: " {
send root\r
expect "Password: "
send root\r
}
"#"
}
interact
Ключевая часть здесь:
user processes cannot execute in kernel space
Это неверно. Когда Роберт Лав пишет, что системный вызов выполняется в контексте процесса, в основном это означает, что процесс выполняется в режиме ядра для запуска системного вызова. Когда ядро обрабатывает системный вызов, оно все еще выполняется в процессе, вызывающем процессе. Если он решит -перепланировать, процесс приостанавливается, и выполнение продолжается в любом другом запланированном процессе.
Когда приостановленный процесс возобновляется, он продолжает выполняться в системном вызове в режиме ядра.
Большое изменение в 2.6 в отношении планирования заключалось в том, что раньше процессы можно было прерывать только в пользовательском режиме; с предварительно -очищаемым ядром процессы также могут быть прерваны в режиме ядра (, за исключением случаев, когда они отключают упреждающее -освобождение, что делается вокруг критических участков кода ядра ).