sudo tem a opção -S que permite fornecer uma senha por meio de um argumento de linha de comando.
su não. O script a seguir usa espera fornecer entrada para su passando stdin por meio de um tty.
#!/usr/bin/expect -f
#Usage: script.sh cmd user pass
set cmd [lindex $argv 0];
set user [lindex $argv 1];
set pass [lindex $argv 2];
log_user 0
spawn su -c $cmd - $user
expect "Password: "
log_user 1
send "$passr"
expect "$ "
Execute o script com
./runas.sh "ls -l" bob 1234