Redirecting Terminal to Local Application!


 
Thread Tools Search this Thread
Top Forums Programming Redirecting Terminal to Local Application!
# 1  
Old 12-12-2010
Redirecting Terminal to Local Application!

i wanted to execute some terminal commands on local linux, parse their output and display it to the user, i checked netcat source code but i couldnt understance it since im new to c (and linux at the same time).
so i was wondering if there is away to run an instance of terminal hidden, read and write from it maybe? cause executing commands one by one wont be good at all.

i hope im clear;
thanks;
# 2  
Old 12-13-2010
popen() may do what you want. FILE *fp=popen("command", "r"); It's either read-only or write-only. If that's not sophisticated enough, you can create pipes, fork, exec, and read/write from those pipes. There's many threads here about that.
# 3  
Old 12-13-2010
Code:
#include <stdio.h>

/* These are useful to keep the source readable */
#ifndef STDIN_FILENO
# define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif
#ifndef SHUT_RDWR
# define SHUT_RDWR 2
#endif

char *opt_exec = NULL;  /* program to exec after connecting */
static void ncexec(FILE *MyOutput)
{
  int saved_stderr;
  char *p;
 // assert(ncsock && (ncsock->fd >= 0));
  /* save the stderr fd because we may need it later */
  saved_stderr = dup(STDERR_FILENO);
  /* duplicate the socket for the child program */
  dup2(MyOutput, STDIN_FILENO); /* the precise order of fiddlage */
  close(MyOutput);   /* is apparently crucial; this is */
  dup2(STDIN_FILENO, STDOUT_FILENO); /* swiped directly out of "inetd". */
  dup2(STDIN_FILENO, STDERR_FILENO); /* also duplicate the stderr channel */
  /* change the label for the executed program */
  if ((p = strrchr(opt_exec, '/')))
    p++;   /* shorter argv[0] */
  else
    p = opt_exec;
  /* replace this process with the new one */
#ifndef USE_OLD_COMPAT
  execl("/bin/sh", p, "-c", opt_exec, NULL);
#else
  execl(opt_exec, p, NULL);
#endif
  dup2(saved_stderr, STDERR_FILENO);
//  ncprint(NCPRINT_ERROR | NCPRINT_EXIT, _("Couldn't execute %s: %s"),
 //  opt_exec, strerror(errno));
}    /* end of ncexec() */
int main()
{
 FILE *fOutput;
 fOutput = fopen("/mnt/hgfs/VMShares/output.txt", "w+");
 if (fOutput == NULL) printf("fOutput Error\n");
 if (fork() == 0)
 {
  printf("Fork() Success !\n");
  ncexec(fOutput);
 }
 sleep(2);
 //fwrite("ls", 4, 2, fOutput);
 return 0;
}

i took this part off Netcat, i created a file descriptor of my owen using fopen and used that in the code insted of "ncsock->fd" ? and used fork() after that since it will be replacing the process using execl()

but it didnt work, no output on the file i created Smilie

sorry for the stupid question, im new to the world of linux and c..

thanks.

Last edited by JonhyM; 12-13-2010 at 02:24 AM..
# 4  
Old 12-13-2010
You should open the file with open(), not fopen(), since dup2() doesn't take file pointers. Neither does close(), for that matter. I'm surprised it didn't crash, and the compiler almost certainly warned you about this.

Why are you duplicating your output file over standard input?

Why are you duplicating STDIN to STDOUT?

Why are you duplicating STDIN to STDERR?

There's no magic to making it work, it's a matter of putting the files you want in the numbers you want. in your case, I think, you want the output file duplicated over stdout.
# 5  
Old 12-13-2010
i still cant get it to work, can u be a bit more clear?
im too n00b for these lines
# 6  
Old 12-13-2010
Corona gave you the answer, assuming we understand what you want. popen()
Take this code and play with it.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
   FILE *cmd=NULL;                          // FILE* for popen
   char tmp[2048]={0x0};                    // string for input/output
   for(;;)                                  // loop forever (see exit below)
   {
      printf("Enter a command(exit to quit): ");
      fflush(stdout);                        //prompt to display
      fgets(tmp, sizeof(tmp), stdin);        // read answer 
      if (strcmp(tmp, "exit\n")==0 )         // if exit then exit program
           exit(0);        
      cmd=popen(tmp,"r");                    // open a command via popen
      while(fgets(tmp, sizeof(tmp), cmd)!=NULL) // display results
           printf("%s", tmp);
      pclose(cmd);                           // close the popen stream
   } 
   return 0;                                 // never reached
}

# 7  
Old 12-13-2010
thars back to point zero, i already made that and it even worked with fopen
i hope this code shows what im trying to do
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char **argv)
{
   FILE *cmd=NULL;                          // FILE* for popen
   char tmp[2048]={0x0};                    // string for input/output
   cmd=popen("xterm","r");                    // open a command via popen
   for(;;)                                  // loop forever (see exit below)
   {
      printf("Enter a command(exit to quit): ");
      fflush(stdout);                        //prompt to display
      fgets(tmp, sizeof(tmp), stdin);        // read answer
      if (strcmp(tmp, "exit\n")==0 )         // if exit then exit program
           exit(0);
      pwrite(cmd, tmp, sizeof(tmp), 0);
      pwrite(cmd, "\n", 1, 0);
      while(fgets(tmp, sizeof(tmp), cmd)!=NULL) // display results
           printf("%s", tmp);
   //   pclose(cmd);                           // close the popen stream
   }
   return 0;                                 // never reached
}

open xterm once and read and write to/from it, i dont even know if this is possible
thanks for ur help Smilie.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Redirecting terminal to variable

when i do something like this: bona=$(echo hi2 > /dev/pts/1 ; printf '%s\n' "" | sed '/^$/d') i get: hi2 and the $bona variable is empty, when I run: echo ${bona} i get the result "hi2" outside of the variable. I want it stored in the bona variable with nothing outputted to the... (6 Replies)
Discussion started by: SkySmart
6 Replies

2. Shell Programming and Scripting

Cannot get terminal application to launch with a graphical launcher when successful in terminal

I have been having an extremely annoying problem. For the record, I am relatively new at this. I've only been working with unix-based OS's for roughly two years, mostly Xubuntu and some Kali. I am pretty familiar with the BASH language, as that's the default shell for debian. Now, I've made this... (16 Replies)
Discussion started by: Huitzilopochtli
16 Replies

3. IP Networking

How to know local IP address in X-Terminal?

Im using a X-Terminal in my windows pc to connect to a Linux server. Is there a way to know my local IP address in my x-terminal console? Here are few commands which didnt help me: ss_cc@MGTS5026-13sh1:~> finger Login Name Tty Idle Login Time Where loadhlr ... (6 Replies)
Discussion started by: Arun_Linux
6 Replies

4. Shell Programming and Scripting

Redirecting script output to terminal

When ever i started my terminal,Every time I have to change the directory like "cd user/documents/ravi/folder2/folder3" Without typing this entire command every time ,I placed "alias c='cd user/documents/ravi/folder2/folder3'" in .bash_profile file. so that i can able to execute command 'c'... (6 Replies)
Discussion started by: Raviteja saddal
6 Replies

5. UNIX for Dummies Questions & Answers

pbpaste to application in terminal

Is it possible to execute a pbpaste command to an application or current application in focus? Thanks (0 Replies)
Discussion started by: fhill2
0 Replies

6. Slackware

X terminal: Redirecting remote sound to my local audio device

Hello everybody, I'm testing some aspects of X Terminal implementation and it's going great. I can use remote applications on my local slow workstation at remote's processor speed by redirecting the remote DISPLAY variable to "my_local_ip:0.0"; but i'm having troubles to get remote audio and... (2 Replies)
Discussion started by: semash!
2 Replies

7. Shell Programming and Scripting

redirecting the terminal to file

Hi, I want to save the whole Output of the terminal in a file. I dont want to redirect a single command to a file (ls -l > test.txt), I want to redirect the whole last 40 lines into a file. Maybe i can read out the terminal while working with it, but i cant find a way to save the whole... (2 Replies)
Discussion started by: niratschi
2 Replies

8. Solaris

Can i bind to a local login terminal running using rsh or remotely

Hi Can i ask? I had multiple solaris workstation running and some local users using it. Is it possible to bind to the local user terminal or console he's using as if like the user well type and I can see it and what my typing in the local user see it also. Is it possible.. Thanks. (3 Replies)
Discussion started by: jao_madn
3 Replies

9. Shell Programming and Scripting

Redirecting output to a local file after sshing

ssh $USR@$host /bin/bash <<EOF awk ' BEGIN{f=0} !f { s=$0; sub(/,.+/, "", s); gsub(//, " ", s); t=(systime()-mktime(s)); if(t<=14400) f=1 } f ' /home/error.log >> error.txt EOFWe are trying to connect to a remote server through ssh and read values from error.log within last 4 hours.However, the... (3 Replies)
Discussion started by: Deepthz
3 Replies

10. UNIX for Dummies Questions & Answers

redirecting one terminal into an other??

Hi guys; I want to show what am I doing on a terminal into another. I did something close but its not working really good. Example: cat /dev/pts/12 >/dev/pts/13 where 12 is my terminal and 13 its the other terminal. This is usefull for me to share my small unix knowledge to other people... (4 Replies)
Discussion started by: piltrafa
4 Replies
Login or Register to Ask a Question