使用功能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
只是一个侧面说明:不要指望能够通过该网络发送密码到SSH。 Openssh打开/ dev/tty并直接从那里读取。你没有问这个,但我可以分享它。 – 2012-03-28 07:56:15
为什么??这就是我在做的... – everbox 2012-03-28 08:07:05
安全。攻击者可以按照你在这里所做的方式模拟一个终端并记录所有输入的密码。也许看看使用基于密钥的身份验证ssh。 – Torp 2012-03-28 10:48:33