Мне нужно запустить обратный SSH-туннель от моей системы openwrt до моей облачной машины.Приложение в системе openwrt будет запускаться как демон при запуске. Когда оно получает определенный код по сети, оно должно запустить процесс, запускающий удаленный ssh-туннель.В системе не будет входов в систему.
Я использую следующий код для этого.
int spawn_orphan(char* cmd)
{
char command[1024]; // We could segfault if cmd is longer than 1000 bytes or so
int pid;
int Stat;
pid = fork();
if (pid < 0)
{
perror("FORK FAILED\n");
return pid;
}
if (pid == 0)
{ // CHILD
setsid(); // Make this process the session leader of a new session
pid = fork();
if (pid < 0)
{
printf("FORK FAILED\n");
return ( 1 );
}
if (pid == 0)
{ // GRANDCHILD
sprintf(command, "ash -c '%s'", cmd);
execl("/bin/ash", "ash", "-c", command, NULL); // Only returns on error
perror("execl failed");
return ( 1 );
}
exit(0); // SUCCESS (This child is reaped below with waitpid())
}
// Reap the child, leaving the grandchild to be inherited by init
waitpid(pid, &Stat, 0);
if ( WIFEXITED(Stat) && ( WEXITSTATUS(Stat) == 0 ))
{
printf("dbclient exit\n");
return 0; // Child forked and exited successfully
}
else
{
perror("failed to spawn orphan\n");
return 1;
}
}
Это моя вызывающая функция
uint8_t rdsService(uint8_t state)
{
char buffer[1024];
uint8_t retVal;
if(state )
{
retVal = spawn_orphan("dbclient -f -K -I -T -N -R 1500:localhost:22 -p 22 username@HOSTMACHINE -i ~/ctusr/keys/X1_ID_RSA -y");
}
else
{
retVal = spawn_orphan("ash -c 'killall dbclient'");
}
return retVal;
}
Если я запускаюМое родительское приложение из консоли, приложение может порождать dbclient, и я могу сделать обратный SSH в систему.
Проблема возникает, когда я запускаю родительское приложение как Демон, в этом случае приложение порождаетdbclient, я могу видеть это, когда я делаю 'ps' на консоли, но через несколько секунд dbclient убит.
Я уже пытался запустить dbclient с помощью 'nohup'
nohup dbclient -f -K -I -T -N -R 1500: localhost: 22 -p 22 Имя пользователя @ machine-i ~ / ctusr / keys / X1_ID_RSA -y &
Работаетхорошо, когда я запускаю приложение из консоли, но при запуске приложения в качестве демона выдает ту же ошибку.
Спасибо за помощь