只有pwd命令在Paramiko中成功执行,其他命令则失败,并显示“ ksh:...:无法执行-没有这样的文件或目录”

时间:2018-11-24 04:00:33

标签: python shell ssh paramiko qnx

成功能够在Windows机器和QNX(〜linux)系统之间创建SSH连接。

只有任何输出(stdout)的命令都是'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路线走运也没有运气。谢谢。

2 个答案:

答案 0 :(得分:2)

pwd可能内置于您的Shell中,而您正在运行的所有其他命令均未内置。未找到ls,因为未设置$PATH,因此您可以设置PATH环境变量,也可以在调用诸如/bin/ls之类的命令时使用完整路径。 / p>

答案 1 :(得分:1)

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

Paramiko中的“ exec”通道(正确地)没有为会话分配伪终端(PTY)。结果,(可能)获得了一组不同的启动脚本(特别是对于非交互式会话,不提供.bash_profile等)。基于TERM环境变量的存在与否,在脚本中采用和/或采用不同的分支。因此,您的环境可能不同于您与SSH客户端一起使用的交互式会话。

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

要验证这是根本原因,请在SSH客户端中禁用伪终端分配。例如,在PuTTY中,它是 Connection> SSH> TTY>不要分配伪终端。然后,转到连接> SSH>远程命令,然后输入ls命令。检查会话>退出时关闭窗口>永不,然后打开会话。您应该得到相同的“ ksh:ls:无法执行-没有这样的文件或目录” 错误。


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

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

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

  3. 尝试通过登录外壳显式运行脚本(将--login开关与通用* nix外壳一起使用):

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

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

    使用伪终端自动执行命令会给您带来讨厌的副作用。例如参见Is there a simple way to get rid of junk values that come when you SSH using Python's Paramiko library and fetch output from CLI of a remote machine?