Это было легче, чем я думал!
Все, что нужно сделать, связывают порт 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
Обратите внимание, что выполнение этого могло бы нарушить политику безопасности Ваших работодателей / организационную политику безопасности, поэтому удостоверьтесь, что получили соответствующие полномочия.
Кажется, ваша информация устарела. Из моей справочной страницы sigaction
:
Недокументированное. До введения SA_SIGINFO также можно было получить некоторую дополнительную информацию, а именно, используя sa_handler со вторым аргументом - типом struct sigcontext. Это использование устарело.
Можно отправлять и получать дополнительные параметры, используя sigqueue ()
и si_value
в siginfo_t
. «Это использование сейчас устарело» в sigaction ()
, возможно, относится к использованию sa_handler
с двумя аргументами, второй из которых является sigcontext
. После введения SA_SIGINFO
нет необходимости использовать такой недокументированный обработчик, поскольку все обработчики принимают аргумент siginfo_t
, который имеет поле si_value
.
Однако я не знаю способа поставить в очередь сигнал с полезной нагрузкой из оболочки, для этого вам может потребоваться написать небольшую программу на языке C.
Это работает. Во-первых, установите для 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
).
На страницах руководства вы найдете дополнительную информацию о том, как это сделать.