Em vez de deixar as senhas de contas em volta do sistema de arquivos, por que não criar um comando sudo especificamente para isso e concedê-lo com a opção NOPASSWD?
Eu quero su para outro usuário, usando esperar e, em seguida, executar um programa gráfico como esse usuário. Estou usando o kcalc para testar com:
#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"
Eu também tentei eliminar a última linha e mudar o su para 'su dummy -c kcalc', mas isso também não funcionou. Agradeço qualquer ajuda.
Em vez de deixar as senhas de contas em volta do sistema de arquivos, por que não criar um comando sudo especificamente para isso e concedê-lo com a opção NOPASSWD?
Eu só estava fazendo isso hoje usando sessões SSH do spawn. Aqui estão alguns trechos do código que eu escrevi não tenho certeza se isso ajudará:
echo "Type the account you wish to use to issue the command, followed by [ENTER]: "
read account
read -s -p "Password: " password
echo "Type the command you wish to execute, followed by [ENTER]: "
read command
echo "Type the hostname you want to connect to, followed by [ENTER]: "
read hostname
switchToSudo="sudo su"
shortenedHost='echo $hostname|cut -d. -f 1'
accountSwitched="root@$shortenedHost:/home/$account#"
VAR=$(expect -c "
expect \"*~$\"
send \"$switchToSudo\r\"
expect \"*?assword*\"
send \"$password\r\"
spawn ssh $account@$hostname
expect "*?assword:*"
send \"$password\r\"
expect \"*~$\"
send \"$switchToSudo\r\"
expect ""
send \"$command\r\n\"
send "logoff"
")
echo "=============="
echo "$VAR"
exit
Você tem algumas opções aqui.
1) Como MrTuttle afirmou, adicionar seu usuário a sudoers com NOPASSWD é preferível. Isso evitará a necessidade de armazenar uma senha raiz de texto não criptografado / etc / sudoers
yourUser ALL=(OtherUser) NOPASSWD:/path/to/kcalc
permitirá que você
$ sudo -u OtherUser kcalc
sem a solicitação de uma senha.
2) Seu script atual.
Seu script atual deve funcionar, tenha em mente que nem todo sistema e prompt capitalizam "Password:" ou deixa um espaço no final. Acho que "assword" é uma string melhor para testar. A outra coisa a notar é que su está pedindo a senha ROOT, e não o manequim do usuário. Se você não tiver a senha de root, você precisará fazer o login como dummy (normalmente ssh -l dummy localhost)
para algumas etapas de depuração, você pode tentar várias instruções durante a fase de senha da sua expectativa. Acho útil testar e reportar o tempo limite e o tempo ao desenvolver scripts.
Você pode tentar isso para ajudar a ver onde seu script está terminando
expect {
-re "(.*)assword:" { sleep 1; send -- "password\r" }
timeout { puts "un-able to login: timeout\n"; return }
eof { puts "Closed\n" ; return }
}