background - 在后台脚本中运行 busybox netcat?

标签 background netcat

注意,我已经查看了 Using netcat/cat in a background shell script (How to avoid Stopped (tty input)? ) ,但这似乎不适用于我的情况。我正在使用 busybox 附带的 netcat (nc),但我发现的解决方法似乎都不适合我。另外,没有-d选项,也没有 -q选项。

我正在尝试使用 netcat 在 shell 脚本中接收文件,并且该脚本位于显然没有标准输入的后台进程中。我尝试了几种不同的方法,但似乎都不起作用。这是我尝试过的:

  • nc -l -p 8888 > file返回远程发送者连接的瞬间,提前断开连接。
  • nc -l -p 8888 < /dev/null > file做同样的事情。
  • echo -n | nc -l -p 8888 > file做同样的事情。
  • tail -f /dev/null | nc -l -p 8888 > file将接收文件,但文件传输完成后不会退出。

我的想法已经用完了。这个版本的 netcat 是否从根本上被破坏了?

最佳答案

好吧,已经好几天了,没有人给出答案,所以我不得不自己推出。下面是代码,以防对任何人有用。

#include <signal.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> 
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/uio.h>
#include <unistd.h>

void bail(const char *s)
{
    perror(s);
    exit(-1);
}

int listen_socket;
struct sockaddr_in my_addr;

void setup_socket(int port)
{
    int er;
    listen_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_socket < 0) bail("socket");

    int on=1;
    er = setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    if (er < 0) bail("setsockopt");

    memset(&my_addr, 0, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(port);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    er = bind(listen_socket, (struct  sockaddr  *)&my_addr,
        (socklen_t)sizeof(struct sockaddr_in));
    if (er < 0) bail("bind");

    er = listen(listen_socket, 1);
    if (er < 0) bail("listen");
}

int listen_wait()
{
    socklen_t len = sizeof(struct sockaddr_in);
    int s = accept(listen_socket, (struct  sockaddr  *)&my_addr, &len);
    if (s < 0) bail("accept");
    return s;
}

char buf[1024];

int main(int argc, char *argv[])
{
    int port = 8888;
    int sock;
    int tryagain;
    if (argc>1) {
        port = atoi(argv[1]);
    }

    setup_socket(port);
    sock = listen_wait();

    do {
        int i = read(sock, buf, 1024);
        tryagain = (errno==EAGAIN);
        if ((i<1) && (!tryagain)) {
            shutdown(sock, 2);
            close(sock);
            return 0;
        }
        if (i>0) {
            fwrite(buf, 1, i, stdout);
        }
    } while (1);
    return 0;
}

关于background - 在后台脚本中运行 busybox netcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35950313/

相关文章:

linux - Netcat HTTP 发布

java - 字节转换

linux - 是否可以从 netcat 创建 wireshark/tcpdump?

linux - 使用 Ncat 将数千行逐一发送到套接字服务器?

c - 从套接字读取时读取返回 1,即使它读取更多

swift - ios8机会性后台获取GET请求

CSS 背景扩展到整个页面宽度

html - CSS - 圆形背景

java - Android应用程序在后台执行代码

colors - 更改 QTabWidget 选项卡的颜色