visualizando printf após pipe (ou subshell?)

1

Ok, isso é difícil de resumir em uma única pergunta, porque depende muito de como eu resolvo isso.

O script a seguir serve para canalizar os comandos mount.cifs para um loop while que insere a senha para três prompts de senha. Os blocos comentados são tentativas de depurar o fato de que ele não está respondendo ao prompt.

#!/bin/bash

printf "How many atoms are there in the universe?\nAnswer:"
read -s $pwd
echo -e "\nThanks.\n"
while read prompt ; do
#     printf "prompt = $prompt" > /dev/stdout
#     ${prompt//"\n"/"\n"}
#     printf "prompt is" >foo
    if [ "$prompt" = "Password: " ]; then
    echo -e "$pwd\r\n" > /dev/stdin
    fi
done < <(
    sudo mount.cifs "//192.168.1.2/My Music" /home/pi/Desktop/Music -o     user=Rob_
    sudo mount.cifs "//192.168.1.2/My Videos" /home/pi/Desktop/Videos -o     user=Rob_
    sudo mount.cifs "//192.168.1.2/My Pictures" /home/pi/Desktop    /Pictures -o user=Rob_
)

A variável "prompt" não parece satisfazer a condição, mas as impressões de depuração estão sendo engolidas mesmo depois de redirecionadas manualmente para / dev / stdout?

Se alguém pudesse ao menos me dizer como eu posso imprimir informações de depuração neste cenário eu ficaria grato, e se eles quiserem me dizer como resolver este problema de imediato (de preferência pelo método que eu estava filmando, mas se você tiver um mais elegante, eu estaria interessado em vê-lo), então eu apreciaria isso também.

EDIT: Para o registro eu estou ciente de que você pode fornecer a senha diretamente para o comando, eu só estou fazendo isso como um teste para mim mesmo.

    
por Rob F 02.07.2015 / 17:29

2 respostas

1

Desde então, tentei resolver o problema de um ângulo diferente, usando o comando 'esperar'. No entanto, o seguinte não funciona:

#!/usr/bin/expect
spawn sudo mount.cifs "//192.168.1.2/My Pictures" /home/pi/Desktop/Pictures -o user=Rob_
expect "Password: " {
    set send_slow {1 .1}
    send -s "a_password"
}

Ele responde ao prompt da senha digitando-o, mas não monta a unidade, por isso não sei ao certo para onde a entrada está indo. Eu posso fornecer qualquer lixo antigo com 'send' e ele fecha facilmente sem uma mensagem de erro, ao passo que se eu digitar o comando do shell ele protestará que a senha está errada ou monta com sucesso.

Vou enviar isso como uma pergunta separada se ninguém responder aqui.

    
por 03.07.2015 / 00:50
-1

Existem vários motivos:

  • Seu debug printf não funcionou, porque o mount imprime seu prompt no terminal, não stdout. read prompt falhou e o loop nunca foi inserido.

  • Você está tentando ecoar a senha para /dev/stdin . Isso não funcionará, você só pode ler a partir dele.

  • o stdin de mount ainda está conectado ao terminal. Não há como imitar o usuário digitando no terminal

  • Mesmo se você fizer o stdin de mount ser um canal, por motivos de segurança, o mount ainda detectará o terminal e lerá dele, não o pipe

O que você realmente precisa é de um arquivo de senha. Leia man mount.cifs :

credentials=filename

Você pode tentar fornecer um arquivo de senha falso usando a substituição do comando bash:

credentials=<( echo "password=$pwd" )
    
por 02.07.2015 / 20:53