【问题标题】:Run busybox netcat in background script?在后台脚本中运行busybox netcat?
【发布时间】:2016-03-11 21:31:28
【问题描述】:

注意,我查看了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是不是从根本上坏掉了?

【问题讨论】:

    标签: background netcat


    【解决方案1】:

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

    #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;
    }
    

    【讨论】:

      【解决方案2】:

      这样就可以了

      sleep 99999 | nc -l -p 8888 > file 
      

      【讨论】:

        猜你喜欢
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多