Отправка sigaction / sigqueue через оболочку

Это было легче, чем я думал!

Все, что нужно сделать, связывают порт 2048 из serverC к порту на pcA. Для простоты я использую тот же номер порта 2048:

user@pcA $ ssh -L 2048:localhost:2048 user@serverC

Нужно сохранить это окно терминала открытым.

Затем монтирование каталога pcB:/home/user локально на pcA похож на это:

sshfs -o port=2048 user@localhost:/home/user/ /mnt/pcB

Хороший побочный эффект: Это означает, что можно также использовать эффективные соединения X-сервера, например. freeNX или vnc получать дисплей pcB. Просто подключение к localhost:2048 и используйте корректные учетные данные (имя пользователя / пароль) для машины pcB!

Если Вы не хотите должными быть сохранять терминал открытым для соединения, Вы используете:

ssh -NfL 2048:localhost:2048 user@serverC

Обратите внимание, что выполнение этого могло бы нарушить политику безопасности Ваших работодателей / организационную политику безопасности, поэтому удостоверьтесь, что получили соответствующие полномочия.

5
01.10.2015, 01:32
3 ответа

Кажется, ваша информация устарела. Из моей справочной страницы sigaction :

Недокументированное. До введения SA_SIGINFO также можно было получить некоторую дополнительную информацию, а именно, используя sa_handler со вторым аргументом - типом struct sigcontext. Это использование устарело.

1
27.01.2020, 20:42

Можно отправлять и получать дополнительные параметры, используя sigqueue () и si_value в siginfo_t . «Это использование сейчас устарело» в sigaction () , возможно, относится к использованию sa_handler с двумя аргументами, второй из которых является sigcontext . После введения SA_SIGINFO нет необходимости использовать такой недокументированный обработчик, поскольку все обработчики принимают аргумент siginfo_t , который имеет поле si_value .

Однако я не знаю способа поставить в очередь сигнал с полезной нагрузкой из оболочки, для этого вам может потребоваться написать небольшую программу на языке C.

1
27.01.2020, 20:42

Это работает. Во-первых, установите для SA_SIGINFO значение .sa_flags , чтобы обозначить интерес к дополнительной информации:

#include <signal.h>
#include <unistd.h>
void act(int s, siginfo_t *i, void *v)
{
    //printing from here is unsafe but this is for testing 
    //purposes only
    printf("pid=%d val=%d\n", i->si_pid, i->si_value.sival_int);
}
int main(int argc, char **argv)
{
    struct sigaction sa = { 
        .sa_sigaction=act ,
        .sa_flags = SA_RESTART|SA_SIGINFO
    } ;
    sigaction(SIGUSR1, &sa, NULL);
    printf("%d\n", (int)getpid());
    for(;;){
        pause();
    }

}

Во-вторых, создайте собственное приложение kill (er), способное отправлять такую ​​дополнительную информацию:

#include <signal.h>
#include <unistd.h>

int main(int argc, char**argv)
{
    union sigval val = { .sival_int = atoi(argv[2]) };
    sigqueue((pid_t)atoi(argv[1]), SIGUSR1, val);
}

Вы можете попробовать скомпилировать эти два файла, и вы сможете использовать второй исполняемый файл для отправки целых чисел первому ( ./ second pid int ).

На страницах руководства вы найдете дополнительную информацию о том, как это сделать.

0
27.01.2020, 20:42

Теги

Похожие вопросы