运行 后台脚本中的 busybox netcat?
Run busybox netcat in background script?
请注意,我查看了 Using netcat/cat in a background shell script (How to avoid Stopped (tty input)? ),但它似乎不适用于我的情况。我正在使用 busybox 附带的 netcat (nc),我发现的 none 解决方法似乎对我有用。此外,没有 -d
选项,也没有任何 -q
选项。
我正在尝试使用 netcat 在 shell 脚本中接收文件,而这个脚本在后台进程中,显然没有标准输入。我尝试了几种不同的方法,但 none 似乎有效。这是我尝试过的:
nc -l -p 8888 > file
returns 远程发送者连接的瞬间,提早断开连接。
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;
}
这样就可以了
sleep 99999 | nc -l -p 8888 > file
请注意,我查看了 Using netcat/cat in a background shell script (How to avoid Stopped (tty input)? ),但它似乎不适用于我的情况。我正在使用 busybox 附带的 netcat (nc),我发现的 none 解决方法似乎对我有用。此外,没有 -d
选项,也没有任何 -q
选项。
我正在尝试使用 netcat 在 shell 脚本中接收文件,而这个脚本在后台进程中,显然没有标准输入。我尝试了几种不同的方法,但 none 似乎有效。这是我尝试过的:
nc -l -p 8888 > file
returns 远程发送者连接的瞬间,提早断开连接。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;
}
这样就可以了
sleep 99999 | nc -l -p 8888 > file