我正在尝试从golang中的SSH会话读取数据。我编写了以下函数来尝试实现此目的。
我遇到了一个问题,尝试从stdout读取内容,它为空,导致程序锁定。为了解决这个问题,我编写了BufferSocketData,它检查ReadDataFromSocket应该附加到的通道,如果它有数据,则将其添加到缓冲区。如果1秒钟后仍未收到任何数据,它将停止读取。
但是,这不能正常工作,我不确定为什么。即使缓冲区中有数据,也只有第一个读取获得新数据,随后的读取返回空字符串。
在上一个问题中,我能够使用SetReadDeadline限制从套接字读取的时间,是否可以在SSH会话中使用类似的功能?还是我需要一起使用其他策略?
/*
ReadDataFromSocket - Attempts to read any data in the socket.
*/
func ReadDataFromSocket(sock io.Reader, c chan string) {
var recvData = make([]byte, 1024)
var numBytes, _ = sock.Read(recvData)
c <- string(recvData[:numBytes])
}
/*
BufferSocketData - Read information from the socket and store it in the buffer.
*/
func (s *SSHLib) BufferSocketData(inp chan string, out chan string) {
var data string
var timeout int64 = 1000 // 1 second timeout.
var start = utils.GetTimestamp()
for utils.GetTimestamp()-start < timeout {
select {
case data = <-inp:
default:
}
if data != "" {
break
}
}
out <- data
}
/*
GetData - Start goroutines to get and buffer data.
*/
func (s *SSHLib) GetData() {
var sockCh = make(chan string)
var buffCh = make(chan string)
go ReadDataFromSocket(s.Stdout, sockCh)
go s.BufferSocketData(sockCh, buffCh)
var data = <-buffCh
if data != "" {
s.Buffer += data
}
}
如果您需要其他任何信息,请告诉我。
启动会话的单个阅读器goroutine。该goroutine从会话中读取数据并将数据发送到通道。
在主goroutine中,循环选择接收数据和超时情况。适当处理每种情况。
type SSHLib struct {
Stdout io.Reader
Buffer string
Data chan string // <-- Add this member
}
// New creates a new SSHLib. This example shows the code
// relevant to reading stdout only.
func New() *SSHLib {
s := &SSHLib{Data: make(chan string)}
go s.Reader()
return s
}
// Reader reads data from stdout in a loop.
func (s *SSHLib) Reader() {
var data = make([]byte, 1024)
for {
n, err := s.Stdout.Read(data)
if err != nil {
// Handle error
return
}
s.Data <- string(data[:n])
}
}
// GetData receives data until regexp match or timeout.
func (s *SSHLib) GetData() {
t := time.NewTimer(time.Second)
defer t.Stop()
for {
select {
case d := <-s.Data:
s.Buffer += d
// Check for regexp match in S.Buffer
case <-t.C:
// Handle timeout
return
}
}
}
问题内容: 我正在尝试从golang中的telnet会话读取数据。为了达到这个目的,我编写了以下函数。 最初,我遇到一个问题,即我从没有数据的套接字读取数据,因此它将锁定并且永远不会返回。BufferSocketData是我尝试解决此问题的方法,因为我不知道是否有要读取的数据。这个想法是它将等待1秒钟,然后确定套接字中没有数据并返回一个空字符串。 GetData似乎第一次在缓冲区中有新数据时起作用
ap.getSessionData(OPTION | keys | key, CALLBACK) 读取会话级数据。可用于页面间传递数据。 可直接传入一个数组作为 OPTION.keys,或直接传入一个字符串,作为 OPTION.keys 数组中的某一个 key。 OPTION 参数说明 名称 类型 必填 描述 keys String Array 是 要读取的数据的 key CALLBACK 参数说
问题内容: 我试图读取就是BEING柏油,流媒体,以标准输入存档,但我不知怎么读 远远 在管道的数据超过焦油发送。 我这样运行我的命令: 源代码是这样的: 对于100MB的涂油文件夹,我将获得1468个4MB的块(即6.15GB)!此外,数组的大小似乎无关紧要:如果将块大小设置为40MB,我仍然会获得约1400个40MB数据块,这根本没有意义。 要使用Go正确读取数据,我需要做些什么吗? 问题答案
我正在使用macOS BigSur。我使用ssh隧道在远程机器上的gpu上运行脚本。由于进程很长,我正在使用,我希望在断开与的连接时,进程继续运行。但问题是,当ssh断开时,
我有一个外部OPC UA服务器,我想从中读取数据。我使用用户名和密码身份验证,因此我的客户端初始化如下: 客户的要求如下: 初始化客户端并将其连接到服务器后,我从main方法调用此请求: 但是,此代码不起作用(尝试从服务器读取信息时会话关闭)。我得到以下输出: Bad_SessionClosed(CompletableFuture.java:1999) atcom.mycompany.opcua.
问题内容: 在Golang中处理原始IP软件包时,遇到了一个问题,我似乎无法找到以下解决方案: 在IPv4的说明书中包含有大于8位小字段。例如,版本或报头长度(每个4位)或标志(3位)。 如何从io.Reader中读取这些值,然后再使用Golang处理它们?到目前为止,我一直在使用binary.Read方法,但是由于Golang中最小的整数类型是int8,因此在这种情况下是不可能的。 问题答案: