成功能够在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
尝试其他简单命令(例如, pidin
,ifconfig
等
当我使用PuTTY并创建SSH连接时,所有必需的命令都有效。
有人见过这种行为。沿invoke.shell
路线走运也没有运气。谢谢。
答案 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:无法执行-没有这样的文件或目录” 错误。
按优先顺序解决此问题的方法:
修复您的启动脚本,以将PATH
设置为交互式和非交互式会话都相同。
修复命令,使其不依赖于特定环境。在命令中使用完整的/bin/ls
。
尝试通过登录外壳显式运行脚本(将--login
开关与通用* nix外壳一起使用):
bash --login -c "ls"
另一种(不推荐)的方法是使用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?