2012-03-28 133 views
2
pid = forkpty (&pty,0,0,0); 
if (pid == 0) { 
    execl ("/usr/bin/ssh", "ssh", hostname, NULL); 
    exit (0); 
} else if (pid > 0) { 
    ssh_pid = pid; 
    ssh_pty = pty; 
    if(child_ssh_success()) { 
     get_user_input(); 
     send_user_input_to_child_ssh_and_child_forword_it_to_remote_server(); 
     get_remote_server_response_from_child(); 
     display_response_to_stdout(); 
    } 
} 

如何判断ssh是否成功?有关使用forkpty创建伪终端到ssh的疑问C

父母如何知道孩子已成功ssh-ed远程服务器,所以父母可以发送一些东西到远程服务器?

+0

只是一个侧面说明:不要指望能够通过该网络发送密码到SSH。 Openssh打开/ dev/tty并直接从那里读取。你没有问这个,但我可以分享它。 – 2012-03-28 07:56:15

+0

为什么??这就是我在做的... – everbox 2012-03-28 08:07:05

+0

安全。攻击者可以按照你在这里所做的方式模拟一个终端并记录所有输入的密码。也许看看使用基于密钥的身份验证ssh。 – Torp 2012-03-28 10:48:33

回答

0

使用功能waitpid在父(即里面你else if (pid>0)条件)来获取子

#include <sys/wait.h> 
pid_t waitpid(pid_t pid, int *stat_loc, int options); 

报价IBM DeveloperWorks

stat_loc

一个指针的状态等待函数将返回状态的整数3210的子进程。如果waitpid函数由于 进程退出而返回,则返回值等于退出进程的 的pid。为此,如果stat_loc的值不为NULL,则 信息存储在stat_loc指向的位置。 如果 状态从返回 值0的终止子进程返回,则存储在stat_loc指向的位置的值为 0.如果返回值大于0,则可以使用以下命令评估此信息宏:WEXITSTATUS WIFEXITED WIFSIGNALED WTERMSIG。

所以,如果stat_loc是零,你可能假设SSH正常终止

EDIT1

如果你不希望家长来将挡,那么你需要建立一个信号处理程序为SIGCHLD,并在那里执行相同的waitpid。因为孩子已经终止这一次,waitpid将返回在这些线路上立即

东西

pid_t pid; 
int main() 
{ 
struct sigaction action; 

memset (&action, 0, sizeof(action)); 
action.sa_handler = sigchld_handler; 

if (sigaction(SIGCHLD, &action, 0)) 
    { 
    perror ("sigaction"); 
    return 1; 
} 

pid = forkpty (&pty,0,0,0); 
if (pid == 0) 
{ 
    execl ("/usr/bin/ssh", "ssh", hostname, NULL); 
    exit (0); 
} 
else if (pid > 0) 
{ 
    ssh_pid = pid; 
    ssh_pty = pty; 
} 
} 

/* SIGCHLD handler. */ 
static void sigchld_handler (int sig) 
{ 
    int chld_state; 

    while (waitpid(pid,&child_state,options) > 0) 
    { 
     if (WIFEXITED(chld_state)) 
     { 
      printf("Child exited with RC=%d\n",WEXITSTATUS(chld_state)); 
     } 
    } 

} 

pid全球,这样就可以从sigchld_handler访问它。通常ssh返回0为SUCCESS和255(或一些其他正值)的失败,虽然我不是百分之百肯定的。

EDIT2

从我们的讨论中,我看你要在远程服务器上执行命令为好。我建议你运行ssh这个

ssh [email protected] 'ls -l' 

您可以通过execl()合格ssh这些参数和在EDIT1解释,你可以检查它的返回值,以验证是否一切都很好。另外,由于您正在从代码中执行ssh,因此您可能不想手动输入密码。这里是你如何password less login

+0

如何判断'ssh'是否成功?家长不应该被阻止。 – everbox 2012-03-28 08:07:52

+0

@everbox我编辑了我的答案以解决您的疑问。退房! – 2012-03-28 09:06:10

+0

谢谢。现在我知道如何告诉'ssh'失败了。但是我怎么能知道孩子已经成功'ssh-ed'到远程服务器,所以我可以发送命令到远程服务器,并从它接收? – everbox 2012-03-28 09:29:48

相关问题