Netcat на удаленной машине с использованием ssh

Я пытался запустить netcat с помощью ssh, и кажется, что мой код всегда терпит неудачу в моем коде C. Вот команды, которые я выполняю с помощью system() в этом порядке.

system("ssh machine 'nc -l 61001|dd bs=64M of=temp' &")
system("/bin/dd if=filename bs=64M|nc IP_address 61001")

Я заметил, что первая команда работает правильно, так как временный файл создается на удаленной машине. Вторая команда dd дает сбой и указывает, что на удаленную машину записано 0 байт. Эти команды работают правильно при выполнении из терминала, но терпят неудачу, как только я помещаю их в вызовы system() в C.


person chettyharish    schedule 27.07.2015    source источник
comment
Попробуйте использовать полный путь к filename. Код написан так, что предполагается, что filename находится в текущем каталоге.   -  person Mr. Llama    schedule 27.07.2015
comment
имя файла является псевдонимом, я передаю полный путь   -  person chettyharish    schedule 27.07.2015
comment
& (запуск в фоновом режиме) не работает для system. Оболочка завершается между каждым вызовом и всеми его подпроцессами.   -  person StenSoft    schedule 27.07.2015
comment
Так можно ли запустить две команды в одном системном вызове?   -  person chettyharish    schedule 27.07.2015
comment
@StenSoft - Исправит ли это nohup?   -  person Mr. Llama    schedule 27.07.2015
comment
@Mr.Llama Может быть, вам нужно это проверить. Но я бы не рекомендовал его, он не закроет netcat, когда dd будет выполнено.   -  person StenSoft    schedule 27.07.2015
comment
@chettyharish Да, с точкой с запятой, как в скорлупе   -  person StenSoft    schedule 27.07.2015
comment
Пробовал это, если я использую «&», а затем «;» , в нем указано -bash: синтаксическая ошибка рядом с неожиданным токеном `;' . Если я запускаю его без '&' , то я застреваю в самой команде nc   -  person chettyharish    schedule 27.07.2015


Ответы (1)


Короткий ответ:

& disown (вместо просто &) должен подойти.

Объяснение:

system() порождает оболочку, которая просто выполняет одну команду, а затем завершает работу. & сообщает оболочке, что команда должна выполняться в фоновом режиме (это означает, что она не ждет ее завершения), но она все еще является частью сеанса и группы процессов оболочки. Когда лидер группы (оболочка) выходит, все дети погибают. disown заставляет оболочку запустить новую группу процессов, дочерний процесс теперь принадлежит init (первому процессу в системе).

Реальный ответ:

Это что касается программирования. Вы разветвляете процессы как сумасшедшие, чтобы выполнить то, что программа на C могла бы легко сделать, используя встроенные библиотечные вызовы (за исключением ssh, но есть и лучшие способы). Почитайте про сокеты BSD.

person Community    schedule 27.07.2015
comment
disown также отрекается от основного процесса (даже внутри разветвленного процесса), поэтому основной процесс останавливается. - person chettyharish; 27.07.2015
comment
хм, нет. попробуйте это: int main() { system("bash -c 'gimp &disown'"); } для проверки (добавлено явное bash, потому что в моей системе /bin/sh — это dash, который не знает о disown, но по умолчанию отрекается). - person ; 27.07.2015
comment
Если я сделаю что-то вроде system(/bin/bash ssh machine 'nc -l 61001|dd bs=64M of=temp '& disown) , все равно не будет указано, что /usr/bin/ssh: не может выполнить двоичный файл (я думаю он не распознает команду) - person chettyharish; 27.07.2015
comment
Использование -c приводит к тому, что netcat сначала закрывается, а затем dd начинает писать, передавая 0 байтов. - person chettyharish; 27.07.2015