SU e execute o comando usando esperar

6

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.

    
por Sarah Cain 05.03.2012 / 23:20

3 respostas

3

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?

    
por 06.03.2012 / 00:03
2

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
    
por 05.03.2012 / 23:29
0

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 }
}    
    
por 19.03.2012 / 20:38