Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

作为我的常用工具,对它的实现很感兴趣,而且(主要是)代码较少而且容易理解。简单解说,写在这里:

基于 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;
}