程序A(报表处理程序)调用程序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);

最佳答案

如果我明白的话-你让事情变得比需要的更难了。自动导航菜单迷宫。
除非你真的想尝试你所要求的非常不寻常的事情-考虑这个选择。
以非交互式的方式进入程序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

关于linux - 如何使一个过程成为另一个 child ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15687683/

10-10 18:18
查看更多