只有 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
我在尝试其他简单命令时遇到同样的错误,例如pidin
、ifconfig
等
当我使用 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" 错误。
解决此问题的方法,按优先顺序排列:
修复您的启动脚本,为交互式和非交互式会话设置相同的PATH
。
修复命令不依赖于特定环境。在命令中使用完整的 /bin/ls
。
通过登录 shell 显式尝试 运行 脚本(使用 --login
switch with common *nix shells):
bash --login -c "ls"
另一种(不推荐)方法是使用 get_pty
参数强制为“exec”通道分配伪终端:
stdin, stdout, stderr = client.exec_command('ls', get_pty = True)
使用伪终端自动执行命令会给您带来严重的副作用。参见示例
能够成功地在我的 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
我在尝试其他简单命令时遇到同样的错误,例如pidin
、ifconfig
等
当我使用 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" 错误。
解决此问题的方法,按优先顺序排列:
修复您的启动脚本,为交互式和非交互式会话设置相同的
PATH
。修复命令不依赖于特定环境。在命令中使用完整的
/bin/ls
。通过登录 shell 显式尝试 运行 脚本(使用
--login
switch with common *nix shells):bash --login -c "ls"
另一种(不推荐)方法是使用
get_pty
参数强制为“exec”通道分配伪终端:stdin, stdout, stderr = client.exec_command('ls', get_pty = True)
使用伪终端自动执行命令会给您带来严重的副作用。参见示例