如何以编程方式获取有状态的 ssh shell 会话?

Posted

技术标签:

【中文标题】如何以编程方式获取有状态的 ssh shell 会话?【英文标题】:How to obtain stateful ssh shell session programmatically? 【发布时间】:2011-10-09 16:15:19 【问题描述】:

我正在开发一个需要向远程服务器发送命令的应用程序。使用大量的 SSH 客户端库发送命令很容易。

但是,我希望在每个命令之间保留 shell 状态(即当前工作目录、环境变量等)。我见过的所有客户端库都没有这样做。例如,以下是做我想做的事的代码示例:

use Net::SSH::Perl;
my $server = Net::SSH::Perl->new($host);
$server->login($user, $pass);

$server->cmd('cd /var');
$server->cmd('pwd');      # I _would like_ this to output /var

在发送命令之间还会执行其他任务,因此不能将$server->cmd('cd /var; pwd') 之类的命令组合在一起。

【问题讨论】:

【参考方案1】:

Net::SSH::Expect 做你想做的事,尽管“预期”方式并不完全可靠,因为它会解析你的命令输出并尝试检测 shell 提示符何时再次出现。

【讨论】:

只要你只运行你知道如何解析输出的命令就可以了。 @Joshua:好吧,我后来发现 Net::SSH::Expect 不使用任何逻辑来找出命令何时完成。它只是有一个(可定制的)超时,并假定命令在超时结束时完成。完全不可靠! EWWW。那么你可能会做得很好,然后直接在 expect 中编写该死的东西。【参考方案2】:

我不确定您到底在做什么,但您可以只启动一个 SSH 会话。如果你真的不能这样做,也许你可以对所有事情都使用绝对路径。

【讨论】:

以上是关于如何以编程方式获取有状态的 ssh shell 会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 UIBarButtonItems 的状态?

在 iOS Swift 3 中以编程方式添加 Web 视图时如何在 UIWebView 中获取响应状态代码?

如何以编程方式确定推送通知状态?

如何以编程方式将IAsyncOperation强制为错误状态?

我如何以编程方式将IAsyncOperation强制为错误状态?

如何以编程方式在android中使用blktrace命令执行shell脚本?