Você poderia fazer algo assim (não testado e funcionaria apenas no Linux):
#!/bin/zsh
TIMEOUT=6000 # hundredths of seconds; in this case, 10 minutes
zmodload zsh/system
zmodload zsh/zselect
for i in /dev/input/*; do
[[ -c "$i" ]] && sysopen -r -o cloexec -u fd "$i"
dev=($dev[@] $fd)
done
while zselect -t $TIMEOUT $dev; do
sleep 5
done
# timeout occurred
shutdown -h now
Mas isso é tecnicamente ainda um script de shell. :)
Ele também não funcionará corretamente se dispositivos de entrada adicionais forem conectados depois de iniciados (ele ignorará a entrada deles).