gpt4 book ai didi

c# - 在 C# 中使用 SSH.NET CreateCommand 执行时,命令失败并返回 “ not found”

转载 作者:行者123 更新时间:2023-12-02 06:55:47 30 4
gpt4 key购买 nike

我试图使用 SSH.NET NuGet package远程执行命令以获取连接到 Mac 的一部 iPhone 上安装的应用程序版本。

如果使用以下命令在 Mac 上执行,将获取其版本:

ideviceinstaller -l|grep <bundleIdOfMyAppPackage>

因此,我使用这个包在 C# 中构建了一个小型实用程序,希望能够利用它。然而,我得到的只是一个空字符串。有人会让我知道我可以做些什么来获得我想要的结果吗?谢谢!

var host = "myhost";
var username = "username";
var password = "password";

using (var client = new SshClient(host, username, password))
{
client.HostKeyReceived += delegate(object sender, HostKeyEventArgs e) { e.CanTrust = true; };

client.Connect();
var command = client.CreateCommand("ideviceinstaller -l|grep <bundleIdOfMyAppPackage>");
command.Execute();

var result = command.Result;
Console.WriteLine(result);

client.Disconnect();
}

我从 command.Error 得到的错误是

zsh1: command not found ideviceinstaller`

这很奇怪,因为如果我浏览到该文件夹​​,我可以在该文件夹中看到 ideviceinstaller

<小时/>

感谢 @Martin Prikryl,我将命令更改为:

/usr/local/bin/ideviceinstaller -l|grep <myAppBundleId>

最佳答案

SSH.NET SshClient.CreateCommand(或 SshClient.RunCommand)不会在“登录”模式下运行 shell,并且不会为 session 分配伪终端。因此,与常规交互式 SSH session 相比,(可能)会获取一组不同的启动脚本(特别是对于非交互式 session ,不会获取 .bash_profile)。和/或根据 TERM 环境变量的缺失/存在,在脚本中采取不同的分支。

可能的解决方案(按优先顺序):

  1. 修复命令不依赖于特定环境。在命令中使用 ideviceinstaller 的完整路径。例如:

     /path/to/ideviceinstaller ...

    如果您不知道完整路径,在常见的 *nix 系统上,您可以在交互式 SSH session 中使用 which ideviceinstaller 命令。

  2. 修复启动脚本,将交互式和非交互式 session 的 PATH 设置为相同。

  3. 尝试通过登录 shell 显式运行脚本(使用 --login 开关与常见的 *nix shell):

     bash --login -c "ideviceinstaller ..."
  4. 如果命令本身依赖于特定的环境设置,并且您无法修复启动脚本,则可以在命令本身中更改环境。其语法取决于远程系统和/或 shell。在常见的 *nix 系统中,这是有效的:

     PATH="$PATH;/path/to/ideviceinstaller" && ideviceinstaller ...
  5. 另一种(不推荐)是使用“shell” channel 通过 SshClient.CreateShellStreamSshClient.CreateShell 执行命令,因为它们分配伪终端

     ShellStream shellStream = client.CreateShellStream(string.Empty, 0, 0, 0, 0, 0);
    shellStream.Write("ideviceinstaller\n");

    while (true)
    {
    string s = shellStream.Read();
    Console.Write(s);
    }

    使用 shell 和伪终端自动执行命令可能会给您带来令人讨厌的副作用。

关于c# - 在 C# 中使用 SSH.NET CreateCommand 执行时,命令失败并返回 “<command> not found”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60519225/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com