我正在使用sftp客户端,该客户端必须通过本地套接字(/run/bfileserver/sftp.sock)连接到sftp服务器,并将fd的stdin和stdout传递到服务器。概述:
fuse/sftp/ssh ------ network ------ sshd
|- bfileclient (stdin,stdout)
|- bfileserver
(/run/bfileserver/sftp.sock)
bfileclient由openssh守护程序使用以下选项启动:
Subsystem sftp /home/sbon/Projects/bfile-client/bfileclient
sshd守护程序和bfileclient之间的通信通过这些文件描述符进行。 fd的这种传递有效,但是当我的sftp客户端退出时(它的工作完成:将defd传递给服务器),服务器收到的fd也关闭了。
fd的传递是使用位于以下位置的代码完成的: Ubuntu Linux send file descriptor with Unix Domain Socket
客户这样做:
struct sockaddr_un sun;
int fd=-1;
int sock=-1;
fd=socket(AF_UNIX, SOCK_STREAM, 0);
sun.sun_family=AF_UNIX;
snprintf(sun.sun_path, sizeof(sun.sun_path), "/run/bfileserver/sftp.sock");
connect(fd, (struct sockaddr *) &sun, sizeof(struct sockaddr_un));
sock=socket(AF_UNIX, SOCK_STREAM, 0);
dup2(sock, STDIN_FILENO);
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);
send_bfile_msg_fd(fd, sock); /* this uses the code mentioned */
close(sock);
服务器对连接的大小进行recvmsg:
fd=read_fd_msg(&msg);
where msg is the msghdr used to recvmsg.
fd是有效的文件描述符,但是在客户端终止时它将关闭。有人知道发生了什么事吗?
我知道我可以使用direct-streamlocal@openssh.com使sshd守护程序直接连接到/run/bfileserver/sftp.sock),但我希望bfileclient进行一些检查。
Stef