Uma das possíveis desvantagens do processo previamente descrito é a necessidade de estabelecimento manual de conexão antes da ativação do servidor pppd. Diferentemente do programa dip, pppd não tem uma linguagem de programação própria para discagem para sistemas remotos e acesso, mas pode ser usado em programas externos como programas de interpretadores de comando. O comando a ser executado pode ser fornecido a pppd com a opção de linha de comando connect. pppd irá redirecionar a entrada e a saída padrão do comando para a linha serial. Um programa útil para isto é denominado expect, escrito por Don Libes. Tem uma poderosa linguagem baseada em Tcl, e foi desenhado exatamente para este tipo de aplicação.
Junto com o pacote pppd há um programa similar denominado chat, o qual permite a criação de um programa de conexão similar a um programa UUCP. Basicamente, um programa de conversação consiste em uma seqüência de alternativas que esperamos receber de um sistema remoto e as respostas que devem ser enviadas. Denominaremos estas como expressões esperadas e enviadas respectivamente. A seguir apresentamos parte de um típico programa de conversação:
Isso diz ao programa chat para aguardar que o sistema remoto envie o indicador de acesso ao sistema (login), retorne o nome de acesso medeiros, aguarde o indicativo de solicitação de senha (password), e envie a senha s3kret. Inicialmente basta esperar pela expressão ogin:, não importando se o indicativo de acesso inicia com um l maiúsculo ou minúsculo (já que ele foi suprimido) ou se ele chegou com problemas.
Este é, basicamente, todo o programa de conversação necessário. Um programa completo de discagem para um servidor PPP deveria obviamente incluir os comandos de modem apropriados. Assumindo que o modem entende o conjunto de comandos Hayes e o número de telefone seja igual a 318714. O programa completo em chat para estabelecer a conexão com itaim seria algo como:
Por definição, o primeiro conjunto de caracteres deve ser uma expressão esperada, mas como o modem não responde absolutamente nada, foi criada uma expressão vazia para ``enganar'' o programa chat. Seguimos enviando a expressão ATZ, o comando de reinicialização para modems compatíveis com o padrão Hayes e aguardando a sua resposta, no caso (OK). A próxima expressão a ser enviada é o número do telefone e então o programa chat irá aguardar a expressão CONNECT como resposta. Isso é seguido por uma nova expressão vazia, já que não queremos enviar nenhum dado para a máquina remota, mas sim esperar pela expressão que indica o acesso ao sistema. O restante da conversação funciona exatamente da mesma forma que a descrita anteriormente.
A opção -v faz com que o programa chat registre todas as suas atividades, indicando-as através da palavra chave local2 no servidor syslog.8.14
Especificar o programa de conversação na linha de comando pode apresentar certos riscos, uma vez que os usuários poderão visualizar toda a linha através do utilitário ps. Isso pode ser evitado, colocando-se o programa em um arquivo, chamado digamos conecta-itaim. Após indica-se ao programa chat que o leia, através da opção -f, seguida do nome do arquivo. A linha de comando completa ao se invocar o arquivo terá um aspecto similar a:
Além do parâmetro connect que especifica um programa de conexão, adicionamos duas novas opções à linha de comando: -detach, que indica ao pppd para não entrar no modo de execução em segundo plano após a conexão e o parâmetro modem que aciona a execução de algumas tarefas específicas de modems no dispositivo serial, tais como desconectar a linha antes e depois de uma chamada. Caso este parâmetro não seja usado, pppd não monitorará as portas da linha DCD e não detectará finais não esperados da ligação remota.
Os exemplos apresentados acima foram bastante simples, porém o programa chat permite a utilização de programas muito mais complexos. Uma funcionalidade bastante útil é a possibilidade de especificar expressões que finalizem o programa com erro. Típicas finalizações desta ordem são mensagens como BUSY, ou NO CARRIER, que o modem gera quando o número indicado está ocupado e quando não há tom de linha, respectivamente. Para que o programa chat reconheça estas situações imediatamente, o que é melhor que uma saída por ter-se atingido o tempo máximo de espera, pode-se especificar estas expressões no início do programa, utilizando-se o parâmetro ABORT:
De uma forma similar, pode-se alterar o tempo de espera para partes específicas do programa, inserindo-se o parâmetro TIMEOUT.
Para maiores detalhes, por favor verifique a página de manual do programa chat(8).
Algumas vezes, é necessário inserir condições na execução de partes do programa de conversação. Por exemplo, quando não se recebe a linha de indicação para acesso ao sistema remoto (login:), pode-se enviar uma mensagem de conteúdo igual a BREAK, ou um comando de retorno de cursor ao início da linha. Isso pode ser obtido através da inserção de um subprograma à uma expressão esperada. Ele consiste em uma seqüência de expressões a serem enviadas e recebidas, assim como todo o programa, porém separados por hífens. O subprograma é executado toda vez que a expressão esperada não é recebida dentro do tempo previsto. No exemplo abaixo podemos modificar o programa para o seguinte formato:
Agora, quando o programa chat não receber o indicativo de acesso ao sistema remoto, o subprograma será executado inicialmente enviando um BREAK, e após aguardará pelo indicativo de acesso novamente. Caso este seja recebido, o programa continuará da forma usual, caso contrário ele será terminado com erro.