只有 pwd 命令在 Paramiko 中成功,其他命令失败 "ksh: ...: cannot execute - No such file or directory"

Only pwd command succeeds in Paramiko, others fail with "ksh: ...: cannot execute - No such file or directory"

能够成功地在我的 windows 机器和 QNX (~linux) 系统之间创建 SSH 连接。

唯一获得任何输出(标准输出)的命令是“pwd”。

# SSH Connection stuff

stdin, stdout, stderr = client.exec_command('pwd')
output = stdout.readlines()
error = stderr.readlines()
readback = [output, error]

for index, val in enumerate(readback):
    readback = '\n'.join(val)
    print("%s:\t%s") %(index, readback)

'pwd' 的示例输出:

0: /home/rxm
1:

当我将命令从 pwd 更改为 ls 时:

0:  
1:  ksh: ls: cannot execute - No such file or directory

我在尝试其他简单命令时遇到同样的错误,例如pidinifconfig

当我使用 PuTTY 并创建 SSH 连接时,所有必要的命令都有效。

有没有人见过这种行为。走 invoke.shell 路线时也没有完全走运。谢谢。

pwd 可能内置于您的 shell 中,而您使用的所有其他命令 运行 都不是。 ls没有找到,因为没有设置$PATH,所以你可以设置PATH环境变量,或者在调用命令时使用完整路径,例如/bin/ls.

对于Paramiko会话,PATH环境变量显然不包含常用工具的路径。

Paramiko 中的“exec”通道(正确地)没有为会话分配伪终端 (PTY)。因此,(可能)获取了一组不同的启动脚本(特别是对于非交互式会话,.bash_profile 和类似的未获取)。 And/or 根据 TERM 环境变量的 absence/presence,采用脚本中的不同分支。因此环境可能不同于交互式会话,您使用 SSH 客户端。

因此,在您的情况下,PATH 的设置可能不同;因此找不到 ls 可执行文件。 pwd 可能是你的 shell 的内置命令,所以它不需要任何路径。

要验证这是根本原因,请在您的 SSH 客户端中禁用伪终端分配。例如在 PuTTY 中,它是 Connection > SSH > TTY > Don't allocate a pseudo terminal。然后,转到 Connection > SSH > Remote command 并输入 ls 命令。选中 Session > Close window on exit > Never 并打开会话。您应该得到相同的 "ksh: ls: cannot execute - No such file or directory" 错误。


解决此问题的方法,按优先顺序排列:

  1. 修复您的启动脚本,为交互式和非交互式会话设置相同的PATH

  2. 修复命令不依赖于特定环境。在命令中使用完整的 /bin/ls

  3. 通过登录 shell 显式尝试 运行 脚本(使用 --login switch with common *nix shells):

     bash --login -c "ls"
    
  4. 另一种(不推荐)方法是使用 get_pty 参数强制为“exec”通道分配伪终端:

     stdin, stdout, stderr = client.exec_command('ls', get_pty = True)
    

    使用伪终端自动执行命令会给您带来严重的副作用。参见示例