程序 A (ReportHandler) 调用程序 B (Specific Report)。为了让我得到我的“特定报告”,我需要通过程序 A,然后调用程序 B 并让我得到我的报告。我的问题是程序 B 有一个“安全”措施来检查程序 B 是否是程序 A 的子进程。(这是因为程序 A 确保没有其他人在运行这个程序 B,确保它运行在一天中的 x 和 y 小时之间,或其他可能干扰程序 B 运行的程序等)
程序 A 和 B 是基于 C 的,但我不能(不能)更改它们。我检查了代码,但我无法将参数传递给程序 A 以从控制台运行 B .. SOOO,我剩下的唯一想法是尝试“欺骗”系统,以便程序 B 显示为程序 A 的子程序,所以我可以从控制台运行它。
我尝试自动执行此操作的原因是,我每天需要拨入十几台服务器才能获取此报告......我想集中这个脚本,以便我可以远程 ssh 这个脚本到每台服务器并完成它。可以节省我一天中的一个小时。或者更多。
正在检查
if ( TRUE != child_of_Program_A() )
{
epause( win[MAIN], 1,
_("This Program Must Be Run From Program A"));
return( FAILURE );
}
STATIC BOOL child_of_Program_A()
{
FILE *fp;
char statname[32];
pid_t ppid;
char proc_name[32];
char buffer[128];
char *ptr;
ppid = getppid();
while(ppid != 1)
{
snprintf(statname, sizeof(statname), "/proc/%d/status", ppid);
if (NULL == (fp = fopen(statname, "r")))
{
return(FALSE);
}
proc_name[0] = '\0';
ppid = -1;
while (NULL != fgets(buffer, sizeof(buffer), fp))
{
if (NULL != (ptr = strtok(buffer, STAT_SEP)))
{
if (strcasecmp(ptr, "name") == 0)
{
if (NULL != (ptr = strtok(NULL, STAT_SEP)))
{
if (strcmp(ptr, "Program_A") == 0)
{
fclose(fp);
return(TRUE);
}
strncpy(proc_name, ptr, sizeof(proc_name));
}
}
else if (strcasecmp(ptr, "ppid") == 0)
{
if (NULL != (ptr = strtok(NULL, STAT_SEP)))
{
ppid = atoi(ptr);
}
}
}
if (ppid != -1 && proc_name[0] != '\0')
break;
}
fclose(fp);
}
return(FALSE);