Jump to content
nunosilvarocha

Cliente ssh

Recommended Posts

nunosilvarocha

Boa noite a todos,

Necessito de criar um programa para interagir com o meu router por ssh

Já dei voltas e mais voltas e não encontro maneira de o fazer.

Gostaria de saber se é possível faze-lo e como.

Caso isto não seja possível, podem sempre sugerir outra linguagem.

Share this post


Link to post
Share on other sites
IceBrain

Usar C parece-me overkill, se o objectivo é correr alguns comandos acho um simples script bash (no Linux ou Mac) ou bat (no Windows) fazia mais sentido.

O que é que queres fazer, exactamente?


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Usar C parece-me overkill, se o objectivo é correr alguns comandos acho um simples script bash (no Linux ou Mac) ou bat (no Windows) fazia mais sentido.

O que é que queres fazer, exactamente?

A ideia é a seguinte:

Existe um micro-controlador ligado por  porta serie ao router (o router permite essa conexão)

Eu necessito fazer um programa que interaja com o router, para este enviar os dados ao microprocessador

Basicamente o programa apenas tem que fazer uma ligação por ssh e correr o comando "echo [valores] > /dev/ttl/0" para enviar os dados para o micro-controlador.

Espero ter-me feito entender.

Share this post


Link to post
Share on other sites
IceBrain

Que SO? E de onde vêm os valores?


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Que SO? E de onde vêm os valores?

O SO pode ser Windows ou Linux.

Os valores nesta primeira fase tem que ser introduzidos pelo utilizador.

O programa pede os valores ao utilizador e envia os mesmos por ssh.

Share this post


Link to post
Share on other sites
IceBrain

Isso poderia ser feito simplesmente assim:

#!/bin/bash
echo "Valores:"
read valores
ssh utilizador@router "echo $valores > /dev/ttl/0"


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Isso poderia ser feito simplesmente assim:

#!/bin/bash
echo "Valores:"
read valores
ssh utilizador@router "echo $valores > /dev/ttl/0"

Pois, também já tentei criar um programa do género em C.

Mas o problema principal está em fazer o login no router quando me ligo por ssh

Na consola do linux para fazer ligação ao router por ssh uso o comando "ssh -l root 192.168.2.1" depois disto tenho que digitar a password dar um Enter e estou dentro do router.

Em C isso não se tem mostrado tão facil!!

Share this post


Link to post
Share on other sites
IceBrain

Não uses password, usa autenticação com chave pública (RSA).

1. Usas o ssh-keygen para gerares uma chave pública e privada (id_rsa e id_rsa.pub)

2. Adicionas a chave ao PC com "ssh-add id_rsa"

3. Copias o ficheiro id_rsa.pub para o router

4. Fazes "cat id_rsa.pub >> /root/.ssh/authorized_keys"

Pronto, depois basta fazeres ssh como normalmente que ele se vai autenticar por chave assimétrica sem precisar de password. É mais seguro e prático.

(se não perceberes alguma coisa pergunta ou pesquisa no Google por "ssh chave pública", há muitos guias)


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Não uses password, usa autenticação com chave pública (RSA).

1. Usas o ssh-keygen para gerares uma chave pública e privada (id_rsa e id_rsa.pub)

2. Adicionas a chave ao PC com "ssh-add id_rsa"

3. Copias o ficheiro id_rsa.pub para o router

4. Fazes "cat id_rsa.pub >> /root/.ssh/authorized_keys"

Pronto, depois basta fazeres ssh como normalmente que ele se vai autenticar por chave assimétrica sem precisar de password. É mais seguro e prático.

(se não perceberes alguma coisa pergunta ou pesquisa no Google por "ssh chave pública", há muitos guias)

Parece-me uma optima ideia, mas ainda não consegui por a dar, os passos que segui foram:

Na consola corri o comando "ssh-keygen -t dsa"

Pediu-me o nome para o ficheiro e ignorei, pediu-me uma pass e eu escrevi e voltei a confirmar.

Este comando criou 2 ficheiros, copiei o que estava dentro do id_rsa.pub para as Chaves autorizadas do router, e desabilitei o login com senha.

Voltei a consola e digitei "ssh root@192.168.2.1" e este continua a não deixar-me fazer login.

Estou a esquecer-me de alguma coisa?

Share this post


Link to post
Share on other sites
nunosilvarocha

Bem, afinal já está a funcionar direito, o que quer dizer que a primeira parte esta concluída

O programa já envia e consigo ver os dados a chegar do outro lado.

Novo problema  :wallbash:

Como para enviar dados utilizo o comando 'ssh root@192.168.2.1 "echo valor > /dev/tts/o"', este torna-se um pouco lento para o que necessito, pois o que o comando faz basicamente é abrir uma conexão ssh, enviar o valor e voltar a fechar, repetindo-se assim este ciclo sempre quero enviar um valor, que neste caso acontece constantemente.

Para terem uma ideia do que quero dou o seguinte exemplo:

Imaginem que quero escrever um texto e o texto aparece em tempo real no micro-controlador.

Isto é, sempre que uma tecla é premida é logo enviada por ssh.

Como podem reparar o método que estou a usar de momento não me possibilita tal coisa por ser tão lento.

O programa teria que abrir a comunicação ssh no inicio do programa e utiliza-la sempre que fosse premida uma nova tecla, fechando a ligação no fim do programa

Existe alguma forma de resolver isto

Share this post


Link to post
Share on other sites
IceBrain

Penso que podes usar pipes:

#!/bin/bash
echo "Valores:"
cat | ssh utilizador@router "cat > /dev/ttl/0"

O primeiro cat lê o input que escreves no PC e envia para o ssh, o segundo cat lê esses dados do ssh e manda para o /dev/ttl/0. Terminas com CTRL+C.


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Penso que podes usar pipes:

#!/bin/bash
echo "Valores:"
cat | ssh utilizador@router "cat > /dev/ttl/0"

O primeiro cat lê o input que escreves no PC e envia para o ssh, o segundo cat lê esses dados do ssh e manda para o /dev/ttl/0. Terminas com CTRL+C.

Isto esta a ficar bom, pelo menos agora os resultados têm sido positivos.

Esse script funciona bom, mas não me permite por exemplo fazer uma validação dos dados que quero enviar.

Share this post


Link to post
Share on other sites
IceBrain

Que validação pretendes fazer?


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
nunosilvarocha

Que validação pretendes fazer?

Quando falo em validação, estou a querer dizer, enviar só um quantidade restrita de caracteres, do tipo '2, 4, 6, 8' que irá funcionar tipo um sistemas de setas (direcção).

Algo que me permita poder dar o tratamento que precisar ao valor antes do enviar, tendo sempre a ligação ssh activa para os poder enviar  em 'tempo real'.

Uma espécie de 'printf' nao para o ecrã mas para o router.

Outra duvida de surgiu é: existe alguma maneira de ler um caracter sem usar o Enter.

Obrigado pela ajuda até agora!!

Share this post


Link to post
Share on other sites
nunosilvarocha

Já pesquisei e tentei alterar isto, mas sem resultados ate agora!!

Share this post


Link to post
Share on other sites
nunosilvarocha

Posso escrever um programa em C, em que faço as validações e tratamento necessário aos dados introduzidos e depois envia-los usando pipes ?

Como criaria o pipe depois na shell??

Será que algo do tipo funcionaria?

#!/bin/bash
echo "Valores:"
./programa.c | ssh utilizador@router "cat > /dev/ttl/0"

Share this post


Link to post
Share on other sites
aladino77

Boa noite a todos,

Necessito de criar um programa para interagir com o meu router por ssh

Já dei voltas e mais voltas e não encontro maneira de o fazer.

Gostaria de saber se é possível faze-lo e como.

Caso isto não seja possível, podem sempre sugerir outra linguagem.

Há a biblioteca LGPL libssh http://www.libssh.org/. Tenha em atenção a licença LGPL, caso vier a vender o programa.

#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h> 

int main()
{
  ssh_session my_ssh_session;
  int rc;
  char *password ="MinhaPassWord";
  char *username = "MeuUserName";

  // Open session and set options
  my_ssh_session = ssh_new();
  if (my_ssh_session == NULL)
    exit(-1);
  ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");

  // Connect to server
  rc = ssh_connect(my_ssh_session);
  if (rc != SSH_OK)
  {
    fprintf(stderr, "Error connecting to localhost: %s\n",
            ssh_get_error(my_ssh_session));
    ssh_free(my_ssh_session);
    exit(-1);
  }

  // Verify the server's identity
  // For the source code of verify_knowhost(), check previous example
  if (verify_knownhost(my_ssh_session) < 0)
  {
    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);
    exit(-1);
  }

  // Authenticate ourselves
  rc = ssh_userauth_password(my_ssh_session, username, password);
  if (rc != SSH_AUTH_SUCCESS)
  {
    fprintf(stderr, "Error authenticating with password: %s\n",
            ssh_get_error(my_ssh_session));
    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);
    exit(-1);
  }

  

  ssh_disconnect(my_ssh_session);
  ssh_free(my_ssh_session);
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.