Comandos no Terminal Linux via C#

1. Comandos no Terminal Linux via C#

Juliano BS
Skulling

(usa Debian)

Enviado em 07/08/2019 - 00:03h

Olá pessoal,

Gostaria de saber como posso executar de fato comandos via C# no Terminal do Linux, mais especificadamente no Rasbian !

Já pesquisei por semanas, tudo que vejo é só "Hello World !!" ... somente impressão de textos ... Sendo que necessito executar via C# comandos como um simples "su" ou mais especificadamente o comando "candump can0" e conseguir recuperar o retorno de informações que o terminal devolverá ...

Boas referências que achei, mas sem solução ainda:
https://www.vivaolinux.com.br/artigo/Mono-e-C-(parte-1)
https://tutorials-raspberrypi.com/write-raspberry-pi-gui-apps-c-sharp-dot-net/
https://www.youtube.com/watch?v=ZBsLR6QotoQ

Fico ansioso no aguardo de auxílio, valeu galera !!


  


2. Re: Comandos no Terminal Linux via C#

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/08/2019 - 07:47h

Se o seu programa necessita de root, o melhor caminho para resolver isso é permitir que somente root execute o programa. Essa forma é a mais prática e necessitaria apenas de verificar se o usuário que executou o programa é root (veja o método getuid() do namespace Mono.Unix.Native).

Para pegar a saída de um comando:
https://stackoverflow.com/questions/206323/how-to-execute-command-line-in-c-get-std-out-results

--
Linux Counter: #596371


3. Comandos no Terminal Linux via C#

Juliano BS
Skulling

(usa Debian)

Enviado em 07/08/2019 - 22:18h

Olá ru4n, muito obrigado pela ajuda !!

Sou leigo em linux em geral, creio que não fui claro em meus exemplos ... desculpe-me !

> PRIMEIRA FASE:

Estou realizando um projeto com um dispositivo de comunicação no protocolo CANBUS o MCP2515 ... consegui fazer todos os comandos via Terminal no Raspbian, são eles:

Criando uma rede CANBUS:
ip link set can0 up type can bitrate 500000 

Habilitando a rede criada:
ifconfig can0 up 

Desabilitando a rede criada:
ifconfig can0 down 

Lendo dados da rede criada:
candump can0 

Enviando dados na rede criada:
cansend can0 123#0102030405060708 


Todos os comandos e a rede em si funcionaram 100%, ótimos resultados !! PRIMEIRA FASE CONCLUÍDA COM SUCESSO !!

> SEGUNDA FASE:

Criei um projeto Windows Form no C# e gerei um aplicativo simples para testar na platarforma Raspbian, fiz as instalações do Mono e executei o arquivo .exe com sucesso:

mono Desktop/testAplication.exe 


O aplicativo abriu normalmente, como se tratava somente de alguns TextBoxs e Buttons, tudo funcionou normal !!

A aplicação gráfica e lógica de programação funcionam normalmente no Raspbian !! SEGUNDA FASE CONCLUÍDA COM SUCESSO !!

> TERCEIRA FASE:

Agora estou tentando criar uma interface para a aplicação do CANBUS, ou seja, aplicando a PRIMEIRA FASE com a SEGUNDA FASE ...

Onde necessito via C# executar os comandos que antes executava no Terminal do sistema operacional Raspbian. Quando tendo executar os comandos, eles aparecem como um simples texto, o comando não surge efeito, exemplo:

Console.Write("candump can0"); 


Se eu executo somente esse comando via Terminal, é retornado uma falha dizendo que a rede não foi criada ... perfeito !! ... Pois não criei mesmo ....

Agora, se eu executo esse mesmo comando via C# como citei acima .... pelo comando Console.Write() ... no Terminal aparece como um simples texto:

candump can0 


E não acontece nada ... é como se eu estivesse escrito "Hello World !" ... não surge efeito os comandos no Terminal via C# ... TERCEIRA FASE SEM SUCESSO !!

O exemplo que sugeri no primeiro post sobre o comando "su" foi somente para exemplificar ... eu me refiro que não consigo executar nenhum comando no Terminal via C# ...

Pode ser também que sua solução enviada seja a correta, porém tentei trabalha-la no C# e não faz sentido para meu problema ... pois ele pede como argumento um arquivo .exe ... sendo que o arquivo é ele próprio ... =( Não consegui entender ...

Desde já agradeço novamente a ajuda !! VIVA O LINUX !!


4. Re: Comandos no Terminal Linux via C#

Perfil removido
removido

(usa Nenhuma)

Enviado em 08/08/2019 - 14:11h

O Console.Write() de fato não executa comandos do shell. Segundo a documentação:
Grava a representação de texto dos objetos especificados e a lista de parâmetros de tamanho variável no fluxo de saída padrão usando as informações de formato especificadas.

Ref: https://docs.microsoft.com/pt-br/dotnet/api/system.console.write?view=netframework-4.8

É o mesmo funcionamento do printf da linguagem C.

Para executar comandos do shell em C#, usa-se a classe Process (como demonstrado no link que passei):
https://docs.microsoft.com/pt-br/dotnet/api/system.diagnostics.process?view=netframework-4.8

Extra:
https://loune.net/2017/06/running-shell-bash-commands-in-net-core/



5. Comandos no Terminal Linux via C#

Juliano BS
Skulling

(usa Debian)

Enviado em 08/08/2019 - 23:12h

Boa noite ru4n,

Que tristeza !! Não estou conseguindo utilizar esse exemplo de código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace testApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

void button1_Click(object sender, EventArgs e)
{
try
{
using (Process myProcess = new Process())
{
myProcess.StartInfo.UseShellExecute = true;
myProcess.StandardInput.WriteLine("candump can0");
myProcess.StartInfo.FileName = textBox1.Text;
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
myProcess.WaitForExit();
}
}
catch (Exception)
{
Console.WriteLine("Falha !");
}
}
}
}


De início já coloquei o parâmetro FileName em um textBox, o que fez mais sentido para mim foi tentar colocar o diretório do LXTerminal para executar comandos nele ... porém sem sucesso ...

Já o comando StandardInput.WriteLine(""); que pesquisei já faz algum sentido, para tentar executar comandos ... porém sem sucesso também ...

Qual seria o diretório do Terminal no linux ? Não consegui achar ... pesquisei de tudo ... porém somente falhas ...


6. Re: Comandos no Terminal Linux via C#

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/08/2019 - 20:22h

Skulling,

usei esse exemplo que passei e criei um projetinho no visual studio 2019, compilei e rodei no meu linux com o mono. O resultado foi esse:
https://imgur.com/kouXP2n

Se quiser dar uma olhada no código fonte que fiz, segue link:
https://bit.ly/2KHVOCi

obs: usei textbox pra pegar um comando qualquer que o usuário digitar, mas o objetivo é demonstrar o uso da classe ShellHelper proposta no link de referência, sendo de fácil adaptação para outros fins.


7. Comandos no Terminal Linux via C#

Juliano BS
Skulling

(usa Debian)

Enviado em 11/08/2019 - 00:01h

Salve salve ru4n,

Cara, funcionou !! E melhor ainda, consegui compreender ... Já implementei da maneira com que vou começar a criar as instruções para a aplicação em si...

Irei dar mais detalhes conforme for fazendo, porém já estou dando retorno...

Somente encontrei um problema com o "candump", eu sou obrigado a utilizar parâmetros para conseguir utilizá-lo... ele trava e não retorna nada se eu utilizá-lo assim:

candump can0 


Uma das soluções foi utilizar assim:

candump -n 1 can0 


Onde ele retorna quando tiver 1 interação de retorno.... ou por tempo:

candump -T 5000 can0 


Onde ele fica durante 5 segundos aguardando interações, e somente depois deste tempo ele retorna todas a mensagens recebidas naquele tempo ....

Se inserir somente "candump" no Terminal da pra ver na íntegra todos os parâmetros...

Até mais .... obrigado até o momento !! VIVA O LINUX !!


8. Re: Comandos no Terminal Linux via C#

Perfil removido
removido

(usa Nenhuma)

Enviado em 12/08/2019 - 14:01h

O método WaitForExit aguarda o término do comando executado, bloqueando a thread de execução. Por isso que quando passa o comando sem parâmetros a janela destrava "na hora", pois o comando retorna imediatamente apenas uma tela de ajuda. Funciona praticamente como um shell.

Pra usar de forma assíncrona, veja o evento Exited:
https://docs.microsoft.com/pt-br/dotnet/api/system.diagnostics.process.exited?view=netframework-4.8






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts