作为我的常用工具,对它的实现很感兴趣,而且(主要是)代码较少而且容易理解。简单解说,写在这里:
基于 1.4g。
Info |
---|
初次执行 ssh 加入 -o StrictHostKeyChecking=no 可以防止阻塞,并使用公钥认证 |
主要的逻辑位于 ssh_run 函数中:在 while 循环中,使用 fork 函数生成一个子进程。
Code Block |
---|
cchild = fork();
// fork 函数的返回,子进程从此处执行,子进程返回 0,父进程返回子进程的 pid,错误返回 -1,errorno 说明错误原因
switch (cchild) {
case 0:
errlog(LOG_DEBUG, "child of %d execing %s",
getppid(), av[0]);
// evecvp 执行的是 ssh 命令,此处阻塞执行
execvp(av[0], av);
errlog(LOG_ERR, "%s: %s", av[0], strerror(errno));
/* else can loop restarting! */
// 使用 SIGTERM kill 父进程
kill(getppid(), SIGTERM);
_exit(1);
break;
case -1:
// 出错的情况下
cchild = 0;
xerrlog(LOG_ERR, "fork: %s", strerror(errno));
break;
default:
// 父进程继续执行
errlog(LOG_INFO, "ssh child pid is %d", (int)cchild);
set_sig_handlers();
retval = ssh_watch(sock);
dolongjmp = 0;
clear_alarm_timer();
unset_sig_handlers();
if (retval == P_EXITOK || retval == P_EXITERR)
return retval;
break;
} |