当前位置: 首页 > 面试题库 >

某些Unix命令以“ 找不到”,使用Python Paramiko exec_command执行时

邵繁
2023-03-14
问题内容

我试图sesu借助Paramiko在Unix服务器中从Python运行命令exec_command。但是,当我运行此命令exec_command('sesu test')时,

sh:sesu:未找到

当我运行简单ls命令时,它会提供所需的输出。仅使用sesu命令无法正常工作。

这是我的代码的样子:

import paramiko

host = host
username = username
password = password
port = port

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
stdin,stdout,stderr=ssh.exec_command('sesu test')
stdin.write('Password')
stdin.flush()
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

问题答案:

SSHClient.exec_command默认情况下,不会在“登录”模式下运行壳和用于会话不分配一个伪终端。结果.bash_profile,与常规的交互式SSH会话相比,(可能)获得了(可能)获得了不同的启动脚本集(尤其是对于非交互式会话,而不是源)。基于TERM环境变量的存在/不存在,在脚本中采用和/或采用不同的分支。

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

  1. 修复命令,使其不依赖于特定环境。sesu在命令中使用完整路径。例如:
     /bin/sesu test
    

如果您不知道完整路径,则在常见的* nix系统上,可以which sesu在交互式SSH会话中使用command。

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

  2. 尝试通过登录外壳显式运行脚本(使用--login带有通用* nix外壳的开关):

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

     PATH="$PATH;/path/to/sesu" && sesu test
    
  4. 另一种(不推荐)的方法是使用get_pty参数强制为“ exec”通道分配伪终端:

     stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True)
    

使用伪终端自动执行命令会给您带来讨厌的副作用。例如,请参见例如,有没有一种简单的方法来摆脱使用Python的Paramiko库进行SSH并从远程计算机的CLI提取输出时出现的垃圾值?

您可能在LD_LIBRARY_PATH共享对象和查找方面存在类似的问题。



 类似资料:
  • 我试图从jenkins master中触发特定节点的execute shell中的gradle命令,它正在运行一个异常,如下所示- 但是,如果am试图在本地工作区下的同一节点中执行shell,则gradle命令可以工作。 null 授予对。gradle的读写访问权限 在这里,node-jenkins和master-jenkins都安装了gradle V2.5。为什么执行shell触发从主人詹金斯找

  • 问题内容: 我试图在我的Mac OS X 10.9.5上启动并运行mysql。我已经安装了最新版本的 社区服务器。我已经进入系统偏好设置并启动了mysql服务器,然后启动了终端并输入了以下内容: 返回版本,但是当我键入任何类型的mysql命令时,我都会得到。我也试过,。 我确实安装了带有mysql等的虚拟主机,但是我希望能够首先在命令行中掌握它。 问题答案: 因此,终端在很少的地方寻找命令。此位置

  • 问题内容: 我的主文件夹中有一个脚本。 当我导航到该文件夹​​并输入时,我得到 。 当我使用时,我得到 。 为什么会发生这种情况,我该如何解决? 问题答案: 没有权限 为了运行脚本,文件必须 设置可执行权限 。 为了完全理解Linux 文件权限,您可以学习命令的文档。chmod是 change mode 的缩写,是用于更改文件的权限设置的命令。 要阅读本地系统的chmod文档,请运行或从命令行运行

  • 我有一个网络钩子齿轮为我的不和谐机器人。我想让embarss命令(在webhook cog中)触发一个webhook,创建时使用用户名和pfp,这很好。然而,我也希望这个命令能够被设置到一个特定的用户身上,这就是问题所在。当我尝试将成员参数添加到embarrass函数中时,它看起来像:async def embarrass(self、ctx、member:discord.member),但不起作用

  • 为什么/我的目标: 我有一个由pi组成的小型网状网络,每天大部分时间都在运行脚本。我想取消停机时间,但是代码有时会在连续循环3-4天后停止工作,(有时长达一周,代码才会出现错误并停止)。 每个节点上运行的脚本用“最后签入”字段更新mySQL数据库。 我希望用Java编写一个小型后台程序,它将在我的服务器上无限期运行,时不时地检查每个站点的“最后签入”,如果它注意到一个节点宕机,远程ssh进入该节点