程序A(ReportHandler)调用程序B(特定报告)。为了让我得到我的“特定报告”,我需要通过程序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);
答案 0 :(得分:0)
如果我理解 - 你正在努力实现这一目标。自动导航菜单迷宫。 除非你真的想尝试一下你提到的非常不寻常的事情 - 考虑这个替代方案。
以非交互方式进入程序A将解决问题。 scp
您帐户中每个服务器的shell脚本。 shell脚本可以是here文档。 stdin
成为脚本,代替键盘。
假设你有一个与程序A正确的交互式会话的记录,它看起来像这样:
cd /foo
./programA username
password
A
/deviceA/catalog.txt
B
A
13 cows
now
使用here doc的脚本如下所示
#!/bin/ksh
cd /foo
./programA username<<EOF
password
A
/deviceA/catalog.txt
B
A
13 cows
now
EOF
您可能拥有每个远程服务器独有的答案,并将其合并。 scp正确的文件到每个远程服务器。
ssh remote_server 'cd /foo && chmod +x ./myscript.sh
设置执行权限。
在本地桌面上创建一个简单的script.sh
ssh remote1 './foo/myscript.sh'
ssh remote2 './foo/myscript.sh'
ssh remote3 './foo/myscript.sh'
此script.sh现在可以运行您的报告而无需您的干预。我也猜测你可能没有在远程服务器上设置ssh密钥 - 这允许像上面的脚本那样无密码访问。
http://rcsg-gsir.imsb-dsgi.nrc-cnrc.gc.ca/documents/internet/node31.html