Stdin: true, Stdout: true, Stderr: true, TTY: false, }, scheme.ParameterCodec) // remotecommand 主要实现了http 转 SPDY 添加X-Stream-Protocol-Version相关header 并发送请求 exec, err := remotecommand.NewSPDYExecutor (config, "POST", req.URL()) // 建立链接之后从请求的sream中发送、读取数据 if err = exec.Stream(remotecommand.StreamOptions "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/remotecommand 主要实现了http 转 SPDY 添加X-Stream-Protocol-Version相关header 并发送请求 exec, err := remotecommand.NewSPDYExecutor
= nil { return copy(p, reply), nil } else { self.SizeChan <- &remotecommand.TerminalSize err := self.Conn.Send(string(p)) return len(p), err}# resizefunc (self *TerminalSockjs) Next() *remotecommand.TerminalSize size.Height) return size}type TerminalSockjs struct { Conn sockjs.Session SizeChan chan *remotecommand.TerminalSize = nil { return err } return executor.Stream(remotecommand.StreamOptions{ ) t := &term.TerminalSockjs{ Conn: session, SizeChan: make(chan *remotecommand.TerminalSize
服务端会基于k8s的remotecommand包,建立与container的ssh长连接,remotecommand包只需要我们提供3个回调,其中read是来获取terminal的输入,我们要做的就是读取
: true, "remote.SSH.enableRemoteCommand": true, 然后,打开 SSH 配置文件(默认为 /home/$USER/.ssh/config),在主机中添加 RemoteCommand 例如: Host example.com HostName example.com IdentitiesOnly=yes User my_user RequestTTY yes RemoteCommand
远程执行pod的tcpdump命令,并将输出重定向到文件或wireshark 上传tcpdump可执行文件 ksniff使用tar命令对tcpdump可执行文件进行打包,然后通过client-go的remotecommand = nil { return nil, err } return buf.Bytes(), nil } 远程执行命令 下面是远程在pod中执行命令的代码,是client-go remotecommand = nil, TTY: false, }, scheme.ParameterCodec) exec, err := remotecommand.NewSPDYExecutor(req.RestConfig = nil { return 0, err } err = exec.Stream(remotecommand.StreamOptions{ Stdin: req.StdIn, Stdout
服务端会基于 k8s 的 remotecommand 包,建立与 container 的ssh长连接。 在查阅资料的过程中发现 k8s 的 remotecommand 实际上是提供了该功能的(详情可见remotecommand.go)。
fetchRemoteCommands(new CommandCallback() { @Override public void onCommandsReceived(List<RemoteCommand > commands) { for (RemoteCommand command : commands) { executeRemoteCommand } } }); } private void executeRemoteCommand(Context context, RemoteCommand
site-packages\appium\webdriver\webdriver.py", line 136, in start_session 34 response = self.execute(RemoteCommand.NEW_SESSION
dockertypes.ContainerJSON, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize serveExec 处理器会调用 remoteCommand.ServeExec() 函数,这个函数又是干嘛的呢?
"=dword:00000000 "SshProt"=dword:00000003 "LogHost"="" "SSH2DES"=dword:00000000 "PublicKeyFile"="" "RemoteCommand
dockertypes.ContainerJSON, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize
Error in heartbeat request to 172.30.129.78:30071; ExceededTimeLimit: Operation timed out, request was RemoteCommand
Error in heartbeat request to 172.30.129.78:30071; ExceededTimeLimit: Operation timed out, request was RemoteCommand
c *Container, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize
: 0 first: 1 firstCommandScheduler: RemoteCommandRetryScheduler request: RemoteCommand 3332431257 --
File: client-go/tools/remotecommand/resize.go 在client-go项目中的resize.go文件是用来处理远程终端大小调整的功能。