stdinBuf, _ := session.StdinPipe()
err := session.Shell()
stdinBuf.Write([]byte("cd /\n"))
// The command has been sent to the device, but you haven't gotten output back yet.
// Not that you can't send more commands immediately.
stdinBuf.Write([]byte("ls\n"))
// Then you'll want to wait for the response, and watch the stdout buffer for output.
8条答案
按热度按时间4zcjmb1e1#
通过
session.StdinPipe()
传递命令,session.shell允许运行多个命令。要知道,使用这种方法会让你的生活变得更加复杂;您需要管理输入缓冲区,而不是使用一次函数调用来运行命令并在命令完成后收集输出(不要忘记命令末尾的
\n
),等待SSH服务器实际返回输出,然后适当地处理该输出(如果您有多个命令在运行中,并且想知道哪个输出属于哪个输入,那么您需要有一个计划来解决这个问题)。68de4m5k2#
虽然对于您的特定问题,您可以轻松地运行
sudo /path/to/script.sh
,但令我震惊的是,没有一种简单的方法可以在同一会话上运行多个命令,所以我想出了一个hack,YMMV:如果你的shell提示符不是以
$
($后跟一个空格)结尾,这将死锁,这就是为什么它是一个黑客。bbmckpt73#
NewSession是一个连接的方法。你不需要每次都创建一个新的连接。一个Session似乎是这个库为客户端调用的一个通道,并且许多通道在一个连接中被复用。因此:
因此,您打开一个新的会话(通道),并在现有的ssh连接中运行command,但每次都使用一个新的会话(通道)。
bjp0bcyl4#
你可以使用一个小技巧:
这是一个单一的命令,实际的命令作为参数传递给shell,shell将执行它们。这就是Docker处理多个命令的方式。
wwtsj6pe5#
这对我很有效。
r7knjye26#
非常喜欢OneOfOne的答案,它启发了我一个更通用的解决方案,即采用一个变量,该变量可以匹配读取字节的尾部并打破阻塞读取(也不需要fork两个额外的线程来阻止读取和写入)。已知的限制是(与原始解决方案一样)如果匹配的字符串在
64 * 1024
字节之后,那么this code将永远旋转。kulphzqa7#
get inspiration from this
我花了几天的时间,这个答案激励我尝试使用sdtin来运行多个命令,最后成功了。我想说我根本不知道golang,因此它可能是多余的,但代码工作。
其功能与terminal operation相同
下面是整个代码:
xmq68pz98#
下面的代码适合我。