#!/usr/bin/expect -- # askpass implementation for doas # example usage: DOAS_ASKPASS="mew -P -p password:" doas_askpass echo working # don't mind the man behind the curtain log_user 0 # no command, then nothing to do if { $argc == 0 } { exit 0 } # treat all arguments as command input set cmd [lrange $argv 0 end]; # read askpass from env or fallback to dmenu_pass () if {[info exists ::env(DOAS_ASKPASS)]} { set askpass "$::env(DOAS_ASKPASS)" } else { set askpass "dmenu_pass password:" } # read password from user set pwd [exec {*}$askpass] # spawn doas operation spawn doas {*}$cmd # send password and execute command expect "doas*password:" { send -- "$pwd\r" expect \r log_user 1 expect eof } # get the exit status of the spawned doas command set status [wait] # check exit code (4th element of wait result) set exit_code [lindex $status 3] # exit with 1 if doas failed, else 0 if { $exit_code != 0 } { exit 1 } else { exit 0 }